template.cu
上传用户:cjzyds
上传日期:2022-03-19
资源大小:8k
文件大小:1k
源码类别:

并行计算

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <cutil.h>
  3. #define N 100000
  4. __global__ void VecAdd(float* A, float* B, float* C)
  5. {
  6. int i = blockDim.x * blockIdx.x + threadIdx.x;
  7. if (i < N)
  8. C[i] = A[i] + B[i];
  9. }
  10. int
  11. main( int argc, char** argv) 
  12. {
  13. int i;
  14. size_t size = N * sizeof(float);
  15. float *h_A, *h_B, *h_C;
  16. float *d_A, *d_B, *d_C;
  17. h_A = (float*)malloc(size);
  18. h_B = (float*)malloc(size);
  19. h_C = (float*)malloc(size);
  20. CUDA_SAFE_CALL( cudaMalloc((void**)&d_A, size));
  21. CUDA_SAFE_CALL( cudaMalloc((void**)&d_B, size));
  22. CUDA_SAFE_CALL( cudaMalloc((void**)&d_C, size));
  23. srand(2009);
  24. for(i=0;i<N;i++)
  25. {
  26. h_A[i]=rand()%10;
  27. h_B[i]=rand()%10;
  28. }
  29. CUDA_SAFE_CALL( cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice));
  30. CUDA_SAFE_CALL( cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice));
  31. int threadsPerBlock = 256;
  32. int threadsPerGrid;
  33. threadsPerGrid = (N + threadsPerBlock -1)/threadsPerBlock;
  34. VecAdd<<<threadsPerGrid, threadsPerBlock>>>(d_A, d_B, d_C);
  35. CUT_CHECK_ERROR("Kernel execution failed");
  36. CUDA_SAFE_CALL( cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost));
  37. for(i=0;i<N;i+=10000)
  38. {
  39. printf("%d: %f + %f = %fn",i,h_A[i],h_B[i],h_C[i]);
  40. }
  41. CUDA_SAFE_CALL( cudaFree(d_A));
  42. CUDA_SAFE_CALL( cudaFree(d_B));
  43. CUDA_SAFE_CALL( cudaFree(d_C));
  44. free(h_A);
  45. free(h_B);
  46. free(h_C);
  47. }