首页 > 代码库 > 向量相加源码分析
向量相加源码分析
向量相加源码分析,我将主要意思和该注意的地方已经添加到注释中仔细看注释。
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
下载链接
向量相加源码分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。