您的位置:首页 > 其它

利用GPU实现向量数据的相加

2016-11-25 11:00 477 查看
    平常的上午,电脑上的程序还没有出结果,就开始自己琢磨CUDA的编程,其实跟人说的时候有些表意不清,有些想说的话感觉总是说不切意,还是写下来比较好。

    今天还是继续进行CUDA的编程时间,主要的目的是利用GPU实现两个数组数据的相加的初级练习: 

代码思想:  1.首先需要利用__global__ 定义一个在GPU里面运行的add()函数

         2.blockidx.d 定义一个一维block   具体参考 http://www.cnblogs.com/viviman/archive/2012/11/28/2792521.html  ,这个等深入的了解GPU结构可以了解清楚

                      3.接下来需要在Host 和Device上分别的开辟相应的数组空间,进行数据的存储;

      4.利用for循环创建数组数据,并通过 cudaMemcpy 复制到Device上,  cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice);    第一个参数是目标,第二个参数是源,第三个参数是总体的数据量大小,第四个参数是复制的步骤指令,将数据从Host(主机)到Device(设备);

                      5.调用add<<<>>>函数进行运算

                      6. 运算完毕,cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);   // GPU pass the result to Host   

                       7.释放一下Device上的空间。

  初学注意点: 1.复制的方向不能配置错误

                            2.设计到GPU内部的线程,块的分配先只做了解。

               

//----------------------------------------------//

//       CUDA code practice               //

//             Aim : Sum the vector in GPU     //

//            24/11/2016                       //

//            ychjiang                       //

//            jiang__yunchao@163.com          //

//--------------------------------------------//

//--------------------------------------------//

//

//                        //

#include <iostream> 

#include <cuda_runtime.h>

#include <device_launch_parameters.h>

#define  N  50

__global__ void add(int *a, int *b, int *c)

{
int tid = blockIdx.x;
if (tid < N)
{
c[tid] = a[tid] + b[tid];

}

}

int main()

{
int a
= { 0 }, b
= { 0 }, c
= { 0 };     //CPU 
int  *dev_a=0, *dev_b=0, *dev_c=0;  //GPU 

cudaMalloc(&dev_a, sizeof(int)*N);  //GPU allocate a memory 
cudaMalloc(&dev_b, sizeof(int)*N);
cudaMalloc(&dev_c, sizeof(int)*N); 

for (int i = 1; i < N; i++)
{

a[i] = i;
b[i] = i*i*i;              //set value of array
}

cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice);   // GPU copy the data form CPU 
cudaMemcpy(dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice);   // GPU copy the data form CPU 
cudaMemcpy(dev_c, c, N*sizeof(int), cudaMemcpyHostToDevice);   // GPU copy the data form CPU 

add << <N, 1 >> >(dev_a, dev_b, dev_c);     //GPU add 

cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);   // GPU pass the result to Host 

for (int i = 1; i < N; i++)
{
printf("%d + %d\t=%d\t\n", a[i], b[i], c[i]);   //output  result 

}
cudaFree(dev_a);   // free the GPUs
cudaFree(dev_b);
cudaFree(dev_c);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息