在主机端和设备端进行”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_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

下载链接

 

posted @ 2014-09-18 17:18  青竹居士  阅读(254)  评论(0编辑  收藏  举报