实验思想:
在主机端将数据初始化后传输到设备端,设备端和主机端进行同样的操作对数据加1,然后将设备端的结果传输到主机,最后核对主机端的计算结果和设备端的计算结果是否一直。
1 // incrementArray.cu 2 3 #include <stdio.h> 4 #include <assert.h> 5 #include "cuda.h" 6 #include "cuda_runtime.h" 7 #include "device_launch_parameters.h" 8 9 /* 10 主机端函数 11 */ 12 void incrementArrayOnHost(float *a, int N) 13 { 14 int i; 15 for (i = 0; i < N; i++) a[i] = a[i] + 1.f; 16 } 17 18 /* 19 设备端函数(内核函数) 20 */ 21 __global__ void incrementArrayOnDevice(float *a, int N) 22 { 23 int idx = blockIdx.x*blockDim.x + threadIdx.x; 24 if (idx<N) a[idx] = a[idx] + 1.f; 25 } 26 27 int main(void) 28 { 29 float *a_h, *b_h; //指向主机的指针 30 float *a_d; //指向设备的指针 31 32 int i, N = 10; 33 size_t size = N*sizeof(float); 34 35 //主机端申请内存 36 a_h = (float *)malloc(size); 37 b_h = (float *)malloc(size); 38 39 //设备端申请存储 40 cudaMalloc((void **)&a_d, size); 41 42 //主机端数据初始化 43 for (i = 0; i < N; i++) a_h[i] = (float)i; 44 45 //将数据从主机拷贝到设备:a_h-->a_d 46 cudaMemcpy(a_d, a_h, sizeof(float)*N, cudaMemcpyHostToDevice); 47 48 //在主机端计算 49 incrementArrayOnHost(a_h, N); 50 51 //在设备端计算 52 //块大小为4,Part 1 of 2. Compute execution configuration 53 int blockSize = 4; 54 //如果N%blockSize取0则需要的块数为N / blockSize,否则再加一块已盛放余下的 55 int nBlocks = N / blockSize + (N%blockSize == 0 ? 0 : 1); 56 57 //Part 2 of 2. 调用内核函数,nBlocks为所需块数,blockSize为每一块大小 58 incrementArrayOnDevice << < nBlocks, blockSize >> > (a_d, N); 59 60 //将数据从设备端传输到主机端并存储在b_h中 61 cudaMemcpy(b_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost); 62 63 //核对结果 64 for (i = 0; i < N; i++) assert(a_h[i]== b_h[i]); 65 66 //释放主机内存和设备端内存 67 free(a_h); 68 free(b_h); 69 cudaFree(a_d); 70 }
测试环境:
Win7+VS2013+CUDA6.5
时间: 2024-10-07 23:05:35