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