Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.77 KB | None | 0 0
  1.  
  2. #include "cuda_runtime.h"
  3. #include "device_launch_parameters.h"
  4.  
  5. #include <stdio.h>
  6.  
  7. const int Nbl = 2;
  8. const int Nth = 2;
  9. const int N = 16;
  10.  
  11. __global__ void scalar(int *a, int *b, int *res){
  12. __shared__ int s[Nth];
  13. int temp = 0;
  14. int tid=threadIdx.x+blockIdx.x*blockDim.x;
  15. int ind = threadIdx.x;
  16.  
  17. while (tid<N)
  18. {
  19. temp+=a[tid]*b[tid];
  20. tid+=blockDim.x*gridDim.x;
  21. }
  22. s[ind]=temp;
  23.  
  24. int k = blockDim.x/2;
  25. __syncthreads();
  26.  
  27. while(k>0){
  28.  
  29. if(ind<k){
  30. s[ind] +=s[ind+k];
  31. }
  32. __syncthreads();//Функция __syncthreads() обеспечивает синхронизацию потоков в блоке, которая будет ждать до тех пор, пока все запущенные потоки отработают до этой точки. Функция необходима для данных обрабатываемых одним потоком, затем будут использоваться другими потоками.
  33. k=k/2;
  34. }
  35.  
  36. res[blockIdx.x] = s[0];
  37. }
  38.  
  39.  
  40.  
  41. int main()
  42. {
  43.  
  44. int *dev_a, *dev_b, *dev_res;
  45. int a[N], b[N], res[Nbl];
  46.  
  47.  
  48.  
  49. for (long i = 0; i < N; i++)
  50. {
  51. a[i] = i;
  52. b[i] = i+1;
  53. }
  54. a[5]=-4;
  55. cudaMalloc((void**)&dev_a, sizeof(int)*N);
  56. cudaMalloc((void**)&dev_b, sizeof(int)*N);
  57. cudaMalloc((void**)&dev_res, sizeof(int)*Nbl);
  58.  
  59. cudaMemcpy(dev_a, a, sizeof(int)*N, cudaMemcpyHostToDevice);
  60. cudaMemcpy(dev_b, b, sizeof(int)*N, cudaMemcpyHostToDevice);
  61.  
  62. scalar<<<Nbl, Nth >>>(dev_a, dev_b, dev_res);
  63. cudaMemcpy(res, dev_res, sizeof(int)*Nbl, cudaMemcpyDeviceToHost);
  64.  
  65. int s = 0;
  66. for (int i =0;i<Nbl;i++)
  67. s+= res[i];
  68. printf("%d", s);
  69.  
  70. printf("\n");
  71.  
  72. s = 0;
  73. for (int i=0;i<N;i++)
  74. s+=a[i]*b[i];
  75. printf("%d", s);
  76.  
  77.  
  78. getchar();
  79. return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement