首页 > 代码库 > 在主机端和设备端惊醒”incrementArray“并对结果进行比较

在主机端和设备端惊醒”incrementArray“并对结果进行比较

实验思想:

在主机端将数据初始化后传输到设备端,设备端和主机端进行同样的操作对数据加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_d46     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 configuration53     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

下载链接

 

在主机端和设备端惊醒”incrementArray“并对结果进行比较