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

来源:互联网 发布:手机装软件 编辑:程序博客网 时间:2024/06/08 18:40

    平常的上午,电脑上的程序还没有出结果,就开始自己琢磨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[N] = { 0 }, b[N] = { 0 }, c[N] = { 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;
}












0 0