首页 > 代码库 > 向量相加源码分析

向量相加源码分析

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

 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.029     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

下载链接

向量相加源码分析