向量相加源码分析

向量相加源码分析,我将主要意思和该注意的地方已经添加到注释中仔细看注释。

 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\n", 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

下载链接

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