CUDA编程:向量加法

来源:互联网 发布:阿里云域名怎么备案 编辑:程序博客网 时间:2024/05/20 19:16


Hello World:

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. __global__ void kernel(void)
  5. {
  6. }
  7.  
  8. int main()
  9. {
  10.    kernel<<<1,1>>>;
  11.   cout<<"Hello World"<<endl;
  12.  
  13.   return 0;
  14.  


【注意】

    1. 运行在GPU上的程序称为kernel函数,表示设备代码,括号里面的参数是函数参数。

         内核函数必须通过__global__函数类型定义,它是用来告诉编译器函数应该编译为设备上而不是主机上运行。

    2. <<<Dg, Db, Ns, S>>>各个参数含义:

         1) Dg:用于定义整个grid的维度和尺寸,为dim3类型。Dim3 Dg(Dg.x, Dg.y, 1)中每行有Dg.x个block,每列有Dg.y个block,                       第三维恒为1,整个grid中一共有Dg.x * Dg.y个block。(最多65535*65535)

         2)Db:用于定义每个block的维度和尺寸,dim3类型。Dim3 Db(Db.x, Db.y, Db.z)分别为行、列、高,相乘即为每个block中的                    线程数。

         3)Ns:可选参数,用于设置每个block除了静态分配的shared memory以外,最多能动态分配的shared memory的大小,单位                      为Byte。如果不需要动态分配时,这个值可以写为0或者省略不写。

         4)S:是cudaStream_t类型的可选参数,初始值为0,如果用到Stream的类型时需要填上,默认为0号流。


【向量相加代码】

  1. #include<stdio.h>
  2. #include<cuda_runtime.h>
  3.  
  4. __global__ void VecAdd(float *A, float *B, float *C)
  5. {
  6.      int i = threadIdx.x;
  7.       C[i] = A[i] + B[i];
  8. }
  9.  
  10. int main(void)
  11. {
  12.     int host_A[512], host_B[512], host_C[512];      //申请主机内存,并进行初始化
  13.     
  14.     for(int i=0; i<512; i++)
  15.     {
  16.         host_A[i] = i;
  17.         host_B[i]<<1;
  18.     }

  19.      cudaError_t err = cudaSuccess;        //定义cudaError,默认为cudaSuccess(0)
  20.  
  21.     float *A, *B, *C;
  22.     err = cudaMalloc( (void**)&A, sizeof(float)*512);    //在GPU上申请内存
  23.     err = cudaMalloc( (void**)&B, sizeof(float)*512);
  24.     err = cudaMalloc( (void**)&C, sizeof(float)*512);
  25.  
  26.     if(err != cudaSuccess)
  27.     {
  28.         printf("the cudaMalloc on GPU is failed");
  29.         return 1;
  30.     }
  31.     printf("SUCCESS");
  32.  
  33.    cudaMemcpy(A, host_A, sizeof(host_A), cudaMemcpyHostToDevice);
  34.    cudaMemcpy(B, host_B, sizeof(host_B), cudaMemcpyHostToDevice);
  35.  
  36.    VecAdd<<<1,512>>>(A, B, C);
  37.   
  38.    cudaMemcpy(&host_C, C, sizeof(host_C), cudaMemcpyDeviceToHost);
  39.  
  40.    for(int i=0; i<512; i++)
  41.       pritnf("A[%d] + B[%d] = %d + %d = %d\n", i, i, host_A[i], host_B[i], host_C[i]);
  42.  
  43.    cudaFree(A);
  44.    cudaFree(B);
  45.    cudaFree(C);
  46.   
  47.   return 0;
  48. }

0 0
原创粉丝点击