Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.25 KB | None | 0 0
  1. // odwracanie kolejności elementów w tablicy jednowymiarowej
  2.  
  3. #include <stdio.h>
  4. #include <windows.h>
  5. #include <limits.h>
  6.  
  7.  
  8. // liczba wątków
  9. const int N_THR = 512;
  10.  
  11. // rozmiar tablicy
  12. const int N = (1 << 23);
  13.  
  14. //////////////////////////////////////////////////////////////////
  15. // kod jądra - odwraca kolejność elementów w tablicy
  16. __global__ void reverseArray(int *d_in)
  17. {
  18. // fragmenty tablicy w pamięci współdzielonej
  19. __shared__ int s_data1[N_THR];
  20. __shared__ int s_data2[N_THR];
  21.  
  22. // indeksy elementów tablicy
  23. int in1 = blockDim.x * blockIdx.x + threadIdx.x;
  24. int in2 = N - blockDim.x * (blockIdx.x + 1) + threadIdx.x;
  25.  
  26. // indeks w tablicy w pamięci współdzielonej
  27. int out = blockDim.x - 1 - threadIdx.x;
  28.  
  29. // zapisanie elementów tablicy w pamięci współdzielonej
  30. s_data1[out] = d_in[in1];
  31. s_data2[out] = d_in[in2];
  32.  
  33. // synchronizacja wątków w bloku
  34. __syncthreads();
  35.  
  36. // zamiana elementów - przepisanie z pamięci współdzielonej
  37. // do pamięci globalnej
  38. d_in[in1] = s_data2[threadIdx.x];
  39. d_in[in2] = s_data1[threadIdx.x];
  40.  
  41.  
  42. }
  43.  
  44. __global__ void findClosest(int *d_x ,int *d_y, int *d_out)
  45. {
  46. // fragmenty tablicy w pamięci współdzielonej
  47. __shared__ int s_data1[N_THR];
  48. __shared__ int s_data2[N_THR];
  49.  
  50. // indeksy elementów tablicy
  51. int in1 = blockDim.x * blockIdx.x + threadIdx.x;
  52.  
  53. // indeks w tablicy w pamięci współdzielonej
  54. int x = d_x[in1];
  55. int y = d_y[in1];
  56.  
  57.  
  58. // zapisanie elementów tablicy w pamięci współdzielonej
  59. s_data1[out] = d_in[in1];
  60. s_data2[out] = d_in[in2];
  61.  
  62. // synchronizacja wątków w bloku
  63. __syncthreads();
  64. int min_value = INT_MAX;
  65. int index;
  66. for (int i = 0; i < N; i++) {
  67.  
  68. if (i != in1) {
  69. //func
  70. }
  71. }
  72. // zamiana elementów - przepisanie z pamięci współdzielonej
  73. // do pamięci globalnej
  74. d_in[in1] = s_data2[threadIdx.x];
  75. d_in[in2] = s_data1[threadIdx.x];
  76. }
  77.  
  78. //////////////////////////////////////////////////////////////////
  79. int main(int argc, char* argv[])
  80. {
  81. // wybór karty na której zostana wykonane obliczenia
  82. if (cudaSetDevice(0) != cudaSuccess)
  83. {
  84. printf("cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
  85.  
  86. return 0;
  87. }
  88.  
  89. // utworzenie tablicy
  90. int *a_cpu = (int*)malloc(N * sizeof(int));
  91. if (!a_cpu)
  92. {
  93. printf("malloc failed!\n");
  94.  
  95. return 0;
  96. }
  97. for (int i = 0; i < N; ++i)
  98. a_cpu[i] = i;
  99.  
  100. // przydzielenie pamięci na karcie
  101. int *a_gpu;
  102. if (cudaMalloc((void**)&a_gpu, N * sizeof(int)) != cudaSuccess)
  103. {
  104. printf("cudaMalloc failed!\n");
  105.  
  106. return 0;
  107. }
  108.  
  109. // przekopiowanie tablicy do pamięci karty
  110. if (cudaMemcpy(a_gpu, a_cpu, N * sizeof(int), cudaMemcpyHostToDevice) != cudaSuccess)
  111. {
  112. printf("cudaMemcpy failed!\n");
  113.  
  114. return 0;
  115. }
  116.  
  117. // rozmiar bloku i siatki bloków
  118. dim3 dimBlock(N_THR);
  119. dim3 dimGrid((N / 2) / N_THR);
  120.  
  121. printf("N: %d, dimBlock: %d, dimGrid: %d\n\n", N, dimBlock.x, dimGrid.x);
  122.  
  123. // utworzenie zdarzeń do pomiaru czasu obliczeń
  124. cudaEvent_t start, stop;
  125. if (cudaEventCreate(&start) != cudaSuccess)
  126. {
  127. printf("cudaEventCreate failed!\n");
  128.  
  129. return 0;
  130. }
  131. if (cudaEventCreate(&stop) != cudaSuccess)
  132. {
  133. printf("cudaEventCreate failed!\n");
  134.  
  135. return 0;
  136. }
  137.  
  138. // zarejestrowanie zdarzenia - początek obliczeń
  139. if (cudaEventRecord(start, 0) != cudaSuccess)
  140. {
  141. printf("cudaEventRecord failed!\n");
  142.  
  143. return 0;
  144. }
  145.  
  146. // wywołanie kodu jądra
  147. reverseArray << < dimGrid, dimBlock >> >(a_gpu);
  148.  
  149. // sprawdzenie czy udało się wywołać kod jądra
  150. if (cudaGetLastError() != cudaSuccess)
  151. {
  152. printf("kernel invocation failed!\n");
  153.  
  154. return 0;
  155. }
  156.  
  157. // zarejestrowanie zdarzenia - koniec obliczeń
  158. if (cudaEventRecord(stop, 0) != cudaSuccess)
  159. {
  160. printf("cudaEventRecord failed!\n");
  161.  
  162. return 0;
  163. }
  164.  
  165. // synchronizacja (oczekiwanie na zakończenie zdarzenia stop)
  166. if (cudaEventSynchronize(stop) != cudaSuccess)
  167. {
  168. printf("cudaEventSynchronize failed!\n");
  169.  
  170. return 0;
  171. }
  172.  
  173. // wyznaczenie czasu obliczeń
  174. float ms = 0;
  175. if (cudaEventElapsedTime(&ms, start, stop) != cudaSuccess)
  176. {
  177. printf("cudaEventElapsedTime failed!\n");
  178.  
  179. return 0;
  180. }
  181.  
  182. printf("running time on GPU: %20f [ms]\n", ms);
  183.  
  184. // przekopiowanie tablicy z pamięci karty
  185. if (cudaMemcpy(a_cpu, a_gpu, N * sizeof(int), cudaMemcpyDeviceToHost) != cudaSuccess)
  186. {
  187. printf("cudaMemcpy failed!\n");
  188.  
  189. return 0;
  190. }
  191.  
  192. // sprawdzenie poprawności zamiany
  193. for (int i = 0; i < N; i++)
  194. {
  195. if (a_cpu[i] != N - 1 - i)
  196. {
  197. printf("error!\n");
  198.  
  199. return 0;
  200. }
  201. }
  202.  
  203. int n2 = N / 2;
  204. int n1 = N - 1;
  205. int j;
  206.  
  207. DWORD dw1 = GetTickCount();
  208.  
  209. // zamiana elementów tablicy przez CPU
  210. for (int i = 0; i < n2; i++)
  211. {
  212. j = a_cpu[i];
  213. a_cpu[i] = a_cpu[n1 - i];
  214. a_cpu[n1 - i] = j;
  215. }
  216.  
  217. DWORD dw2 = GetTickCount();
  218.  
  219. printf("running time on CPU: %20u [ms]\n", dw2 - dw1);
  220.  
  221. // usunięcie zdarzeń
  222. if (cudaEventDestroy(start) != cudaSuccess)
  223. {
  224. printf("cudaEventDestroy failed!\n");
  225.  
  226. return 0;
  227. }
  228. if (cudaEventDestroy(stop) != cudaSuccess)
  229. {
  230. printf("cudaEventDestroy failed!\n");
  231.  
  232. return 0;
  233. }
  234.  
  235. // zwolnienie pamięci
  236. cudaFree(a_gpu);
  237. free(a_cpu);
  238.  
  239. // usunięcie kontekstu GPU
  240. cudaDeviceReset();
  241. int testInteger;
  242. printf("Press a key: ");
  243. scanf("%d", &testInteger);
  244.  
  245. return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement