向量相加源码分析,我将主要意思和该注意的地方已经添加到注释中仔细看注释。
1 #include "cuda.h"
2 #include "cuda_runtime.h"
3 #include "device_launch_parameters.h"
4 #include <stdio.h>
5
6 /*
7 __global__表示该函数为内核函数
8 blockIdx网格内的块索引
9 threadIdx块内的线程索引
10 blockDim块内的线程数
11 块有x-、y-和z-整数组件,它们是三维的
12 网格只有x-和y-组件,它们是二维的
13 */
14 __global__ void SaXPY(float a, float* X_d, float* Y_d, int n)
15 {
16 if (threadIdx.x < n)
17 Y_d[threadIdx.x] = a * X_d[threadIdx.x] + Y_d[threadIdx.x];
18 }
19
20 int main()
21 {
22 int n = 64;
23 float a = 2;
24 float *X_h, *X_d, *Y_h, *Y_d;
25 //host端申请空间
26 X_h = (float*)malloc(n * sizeof(float));
27 Y_h = (float*)malloc(n * sizeof(float));
28 //主机端数组初始化为1,结果为Y_h[0]=Y_h[1]=……=Y_h[63]=1.0;X_h[0]=0.0,……X_h[63]=63.0
29 for (int i = 0; i < n; i++)
30 {
31 X_h[i] = (float)i;
32 Y_h[i] = 1.0;
33 }
34 //Device端申请存储空间
35 cudaMalloc(&X_d, n * sizeof(float));
36 cudaMalloc(&Y_d, n * sizeof(float));
37 /*
38 将Host端的数据拷贝到Device端
39 X_d和Y_d是Device端地址,目的端
40 X_h和Y_h是Host端地址,源端
41 cudaMemcpyHostToDevice指定了拷贝方向
42 */
43 cudaMemcpy(X_d, X_h, n * sizeof(float), cudaMemcpyHostToDevice);
44 cudaMemcpy(Y_d, Y_h, n * sizeof(float), cudaMemcpyHostToDevice);
45 /*
46 调用内核函数
47 <<<…>>> 执行配置语法指定执行某一指定内核调用的线程数
48 */
49 SaXPY <<<1,64 >>>(a, X_d, Y_d, n);
50 /*
51 Y_h是目的端,Y_d是源端
52 cudaMemcpyDeviceToHost指定了拷贝方向,从Device端到Host端
53 */
54 cudaMemcpy(Y_h, Y_d, n * sizeof(float), cudaMemcpyDeviceToHost);
55 for (int i = 0; i < n; i++)
56 printf("%2.1f X[%d] + Y[%d] = %6.2f
", a, i, i, Y_h[i]);
57 cudaFree(X_d);
58 cudaFree(Y_d);
59 free(X_h);
60 free(Y_h);
61 system("Pause");
62 return 0;
63 }
测试环境:
Win7+VS2013+CUDA6.5