Advertisement
Guest User

Untitled

a guest
Jul 11th, 2014
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.22 KB | None | 0 0
  1. #include "cuda_runtime.h"
  2. #include "device_launch_parameters.h"
  3.  
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <ctime>
  7.  
  8. #include <time.h>
  9. #include <math.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12.  
  13.  
  14. __global__ void mnozenieMacierzyKernel(float *a,float *macierzWynikowa, int rozmiarBloku, int grid) //rozmiar bloku na karcie graficznej jaki przekazuje
  15. {
  16. float wartosc = 0;
  17. int w = grid * blockIdx.y + threadIdx.y;
  18. int k = grid * blockIdx.x + threadIdx.x;
  19.  
  20. for(int i = 0; i < rozmiarBloku; i++)
  21. {
  22. wartosc += a[w * rozmiarBloku + i] * a[i * rozmiarBloku + k];
  23. }
  24. macierzWynikowa[w * rozmiarBloku + k] = wartosc;
  25. }
  26.  
  27. float* generuj(int w, int k)
  28. {
  29. float* temp;
  30. temp = (float*) malloc(sizeof(float)*w*k);
  31.  
  32. for(int i = 0; i<w*k; i++)
  33. {
  34. *(temp+i)=rand()%99;
  35. }
  36.  
  37. return temp;
  38. }
  39.  
  40. void mnozenieMacierzy(float* a, float* macierzWynikowa, int w, int k)
  41. {
  42. for(int i = 0; i < w; i++)
  43. {
  44. for(int j = 0; j < k; j++)
  45. {
  46. for(int l = 0; l < k; l++)
  47. {
  48. macierzWynikowa[i * k + j] += a[i * k + l]* a[l * k + j];
  49. }
  50. }
  51. }
  52. }
  53.  
  54. void zapis(char *filename,float *macierz, float* macierzWynikowa, int w, int k, float execTime, float czasGPU)
  55. {
  56. FILE *fp;
  57. if ((fp=fopen(filename, "w"))==NULL)
  58. {
  59. printf ("Nie mogę otworzyć pliku do zapisu!\n");
  60. exit(1);
  61. }
  62.  
  63. fprintf (fp, "czas dzialania: %lf\n", execTime);
  64. fprintf (fp, "czas dzialania GPU: %lf\n", czasGPU);
  65. fprintf (fp, "wierze: %d\n", w);
  66. fprintf (fp, "kolumny: %d\n", k);
  67.  
  68. fprintf (fp, "macierz:\n");
  69. for(int i = 0; i < w; i++)
  70. {
  71. for(int j = 0; j < k; j++)
  72. {
  73. fprintf (fp, "%lf\t", macierz[i*k+j]);
  74. }
  75. fprintf (fp, "\n");
  76. }
  77.  
  78. fprintf (fp, "\n\nmacierz wynikowa:\n");
  79. for(int i = 0; i < w; i++)
  80. {
  81. for(int j = 0; j < k; j++)
  82. {
  83. fprintf (fp, "%lf\t", macierzWynikowa[i*k+j]);
  84. }
  85. fprintf (fp, "\n");
  86. }
  87. fclose (fp);
  88. }
  89.  
  90.  
  91. void mnozenieMacierzyCuda(float* a, float* macierzWynikowa,int w, int k, int grid, float& execTime, float& memIncTime)//
  92. {
  93. float* devA = 0;
  94. float* devMacierzWynikowa = 0;
  95. cudaError_t cudaStatus;
  96. cudaEvent_t memStart, memStop;
  97. cudaEventCreate(&memStart);
  98. cudaEventCreate(&memStop);
  99.  
  100. cudaStatus = cudaSetDevice(0);
  101. if(cudaStatus != cudaSuccess)
  102. {
  103. printf("cudaSetDevice: %s", cudaGetErrorString(cudaStatus));
  104. exit(1);
  105. }
  106.  
  107. cudaEventRecord(memStart);
  108.  
  109. cudaStatus = cudaMalloc((void**)&devMacierzWynikowa, sizeof(macierzWynikowa));
  110. if(cudaStatus != cudaSuccess)
  111. {
  112. printf("cudaMalloc: %s",cudaGetErrorString(cudaStatus));
  113. exit(1);
  114. }
  115.  
  116. cudaStatus = cudaMalloc((void**)&devA, sizeof(a));
  117. if(cudaStatus != cudaSuccess)
  118. {
  119. printf("cudaMalloc: %s",cudaGetErrorString(cudaStatus));
  120. exit(1);
  121. }
  122.  
  123.  
  124. cudaStatus = cudaMemcpy(devA, a, sizeof(a), cudaMemcpyHostToDevice);
  125. if(cudaStatus != cudaSuccess)
  126. {
  127. printf("cudaMemcpy: %s",cudaGetErrorString(cudaStatus));
  128. exit(1);
  129. }
  130.  
  131.  
  132. int gridX = w / grid;
  133. int gridY = k / grid;
  134.  
  135. dim3 dimGrid(gridX, gridY, 1);
  136. dim3 dimBlock(grid, grid,1);
  137. //dim3 dimBlock(grid, grid,1);
  138. //dim3 dimGrid( (w + dimBlock.x - 1) / dimBlock.x,(k + dimBlock.y - 1) / dimBlock.y );
  139.  
  140.  
  141. cudaEvent_t start, stop;
  142. cudaEventCreate(&start);
  143. cudaEventCreate(&stop);
  144.  
  145. cudaEventRecord(start);
  146. mnozenieMacierzyKernel<<<dimGrid, dimBlock>>>(devA, devMacierzWynikowa, k, grid);
  147. cudaEventRecord(stop);
  148.  
  149. cudaEventSynchronize(stop);
  150.  
  151. cudaEventElapsedTime(&execTime, start, stop);
  152.  
  153. cudaEventDestroy(start);
  154. cudaEventDestroy(stop);
  155.  
  156. // Check for any errors launching the kernel
  157. cudaStatus = cudaGetLastError();
  158. if(cudaStatus != cudaSuccess)
  159. {
  160. printf("An error has occured during matrix multiplication: : %s",cudaGetErrorString(cudaStatus));
  161. exit(1);
  162. }
  163.  
  164. // cudaDeviceSynchronize waits for the kernel to finish, and returns
  165. // any errors encountered during the launch.
  166. cudaStatus = cudaDeviceSynchronize();
  167. if(cudaStatus != cudaSuccess)
  168. {
  169. printf("cudaDeviceSynchronize: %s",cudaGetErrorString(cudaStatus));
  170. exit(1);
  171. }
  172.  
  173. // Copy output vector from GPU buffer to host memory.
  174. cudaStatus = cudaMemcpy(macierzWynikowa, devMacierzWynikowa, sizeof(macierzWynikowa), cudaMemcpyDeviceToHost);
  175. if(cudaStatus != cudaSuccess)
  176. {
  177. printf("cudaMemcpy: %s",cudaGetErrorString(cudaStatus));
  178. exit(1);
  179. }
  180.  
  181.  
  182. cudaFree(devA);
  183. cudaFree(devMacierzWynikowa);
  184.  
  185. cudaEventRecord(memStop);
  186.  
  187. cudaEventSynchronize(memStop);
  188.  
  189. cudaEventElapsedTime(&memIncTime, memStart, memStop);
  190.  
  191. cudaEventDestroy(memStart);
  192. cudaEventDestroy(memStop);
  193. }
  194.  
  195.  
  196. int main()
  197. {
  198. srand( time( NULL ) );
  199.  
  200. float* macierze [10];
  201. float* macierzWynikowa[10];
  202. float* macierzWynikowa2[10];
  203. time_t startCPU;
  204. time_t endCPU;
  205. float czasGPU;
  206. char filename[100];
  207.  
  208. cudaDeviceProp prop;
  209. cudaGetDeviceProperties(&prop, 0);
  210. double temp = sqrt((double)prop.maxThreadsPerBlock);
  211. int grid = (int) temp;
  212.  
  213. for(int i = 1; i < 11; i++)
  214. {
  215. macierze[i] = generuj(i * 10, i * 10);
  216. macierzWynikowa[i] = (float*) calloc((i * 10 * i * 10),sizeof(float));
  217. macierzWynikowa2[i] = (float*) calloc((i * grid * i * grid),sizeof(float));
  218.  
  219. startCPU = clock();
  220. mnozenieMacierzy(macierze[i], macierzWynikowa[i],i * 10, i * 10);
  221. endCPU = clock();
  222.  
  223. float execTime = static_cast<float>((endCPU - startCPU) / float(CLOCKS_PER_SEC) * 1000);
  224.  
  225. sprintf (filename, "wyniki_%d.txt", i);
  226. zapis(filename, macierze[i], macierzWynikowa[i],i * 10, i * 10, execTime,NULL);
  227.  
  228. //free(macierzWynikowa[i]);
  229. //macierzWynikowa[i] = (float*) calloc((i * 10 * i * 10),sizeof(float));
  230. //mnozenieMacierzyCuda(macierze[i], macierzWynikowa[i],i * 10, i * 10, grid, execTime,czasGPU);
  231. //sprintf (filename, "wyniki_%dGPU.txt", i);
  232. //zapis(filename, macierze[i], macierzWynikowa[i],i * 10, i * 10, execTime,czasGPU);
  233.  
  234. mnozenieMacierzyCuda(macierze[i], macierzWynikowa2[i],i * 10, i * 10, 48, execTime,czasGPU);
  235. sprintf (filename, "wyniki_%dGPU.txt", i);
  236. zapis(filename, macierze[i], macierzWynikowa2[i],i * 10, i * 10, execTime,czasGPU);
  237. }
  238.  
  239. getchar();
  240. return 0;
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement