`

CUDA—两个数组相加

    博客分类:
  • CUDA
阅读更多

使用CUDA实现两个数组的相加,熟悉CUDA相关函数的使用。

#include <cuda_runtime.h>
#include <stdio.h>

__global__ void addKernel( int* c, const int* a, const int* b )
{
         int i = threadIdx.x;
         c[i]= a[i] + b[i];
}

cudaError_t CUDA_Add( const int* a, const int* b, int* out, int size )
{
         int *dev_a;
         int *dev_b;
         int *dev_c;

         //1、设置设备
         cudaError_t cudaStatus = cudaSetDevice( 0 );

         switch( true )
         {
         default:
                   if( cudaStatus != cudaSuccess )
                   {
                            fprintf(stderr, "调用cudaSetDevice()函数失败!" );
                            return cudaStatus;
                   }

                   //2、分配显存空间
                   cudaStatus= cudaMalloc( (void**)&dev_a, size * sizeof(int) );
                   if( cudaStatus != cudaSuccess )
                   {
                         fprintf(stderr, "调用cudaMalloc()函数初始化显卡中a数组时失败!" );
                         break;
                   }

                   cudaStatus= cudaMalloc( (void**)&dev_b, size * sizeof(int) );
                   if( cudaStatus != cudaSuccess )
                   {
                         fprintf(stderr, "调用cudaMalloc()函数初始化显卡中b数组时失败!" );
                         break;
                   }

                   cudaStatus= cudaMalloc( (void**)&dev_c, size * sizeof(int) );
                   if( cudaStatus != cudaSuccess )
                   {
                            fprintf(stderr, "调用cudaMalloc()函数初始化显卡中c数组时失败!" );
                            break;
                   }

                   //3、将宿主程序数据复制到显存中
                   cudaStatus= cudaMemcpy( dev_a, a, size * sizeof( int ), cudaMemcpyHostToDevice );
                   if( cudaStatus != cudaSuccess )
                   {
                            fprintf( stderr, "调用cudaMemcpy()函数初始化宿主程序数据a数组到显卡时失败!");
                            break;
                   }
                   cudaStatus= cudaMemcpy( dev_b, b, size * sizeof( int ), cudaMemcpyHostToDevice );
                   if( cudaStatus != cudaSuccess )
                   {
                            fprintf(stderr, "调用cudaMemcpy()函数初始化宿主程序数据b数组到显卡时失败!" );
                            break;
                   }
 //4、执行程序,宿主程序等待显卡执行完毕
                   addKernel<<<1,size>>>( dev_c, dev_a, dev_b );

                   //5、查询内核初始化的时候是否出错
                   cudaStatus= cudaGetLastError( );
                   if( cudaStatus != cudaSuccess )
                   {
                            fprintf(stderr, "显卡执行程序时失败!" );
                            break;
                   }

                   //6、与内核同步等待执行完毕
                   cudaStatus= cudaDeviceSynchronize( );
                   if( cudaStatus != cudaSuccess )
                   {
                            fprintf(stderr, "在与内核同步的过程中发生问题!" );
                            break;
                   }

                   //7、获取数据
                   cudaStatus= cudaMemcpy( out, dev_c, size * sizeof( int ), cudaMemcpyDeviceToHost );
                   if( cudaStatus != cudaSuccess )
                   {
                            fprintf(stderr, "在将结果数据从显卡复制到宿主程序中失败!" );
                            break;
                   }
         }

         cudaFree(dev_c );
         cudaFree(dev_a );
         cudaFree(dev_b );
         return cudaStatus;
}

int main( int argc, char** argv ) {
         const int arraySize = 5;
         const int a[arraySize] = { 1, 2, 3, 4, 5 };
         const int b[arraySize] = { 10, 20, 30, 40, 50 };
         int c[arraySize] = { 0 };
         int i;
         cudaDeviceProp prop;
        //获取cuda数目
         int count;
         cudaGetDeviceCount(&count);
         printf("CUDA数==%d\n",count);
        for(i=0;i<count;i++){
           //获取设备的属性
           cudaGetDeviceProperties(&prop,i);
           printf("compute capability: %d.%d\n",prop.major,prop.minor);
           printf("Shared mem per mp: %ld\n",prop.sharedMemPerBlock);
        }
         cudaError_t cudaStatus;
         cudaStatus= CUDA_Add( a, b, c, arraySize );

         printf("运算结果是:\nc数组[%d, %d, %d, %d, %d]\n",
                   c[0],c[1], c[2], c[3], c[4] );

         cudaStatus= cudaDeviceReset( );
         if( cudaStatus != cudaSuccess )
         {
             fprintf(stderr, "调用cudaDeviceReset()函数失败!" );
                   return 1;
         }

         return 0;
}

编译运行指令

# nvcc first_cuda.cu -o first_cuda

# ./first_cuda

运行结果

   CUDA数==1

   compute capability: 3.5

   Shared mem per mp: 49152

   运算结果是:

  c数组[11, 22, 33, 44, 55]

 

分享到:
评论

相关推荐

    .NET 调用CUDA的动态链接库实现GPU计算

    例如,在数组相加的场景中,我们可能会定义一个内核函数,这个函数接收两个输入数组,并将它们的元素相加,结果存入第三个数组。 ```c++ __global__ void addArrays(float* a, float* b, float* c) { int idx = ...

    [CUDA]1addVector

    在这个项目"1addVector"中,我们看到的是一个基础的CUDA应用,它实现了两个相同大小的向量相加,并将结果存储到第三个向量中。向量的大小是30000000,这是一个相当大的数据量,足以体现GPU并行计算的优势。 在CPU上...

    cuda入门程序

    在这个例子中,我们创建了一个简单的加法内核,它将两个数组元素逐个相加。在主程序中,我们分配了设备内存,复制了主机数据,调用了内核,并将结果返回主机。这个过程展示了CUDA编程的基本流程。 通过学习和实践...

    ARRAY实现MATRIX运算

    - **加法**:两个相同大小的矩阵相加,对应位置的元素相加。例如,矩阵A和B的和C,可以通过遍历元素实现: ```cpp for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { C[i][j] = A[i][j] + B[i][j]; } }...

    opencl实现矩阵加法

    在矩阵加法的例子中,我们会有两个二维数组(矩阵)需要相加。OpenCL中,这通常通过编写一个内核函数(kernel function)来实现,该函数将在每个计算单元(work-item)上并行执行,每个工作项负责处理矩阵中的一个...

    ch4.rar_visual c

    例如,两个2x2矩阵A和B进行加法或减法时,结果矩阵C的每个元素ci,j等于A的对应元素ai,j加上或减去B的对应元素bi,j。 接下来,矩阵的乘法则更为复杂。两个矩阵可以相乘的前提是第一个矩阵的列数必须等于第二个矩阵的...

    Theano tutorial快速入门教材

    例如,`f = theano.function([x, y], x + y)`定义了一个将两个输入相加的函数。 6. **GPU支持**: Theano的一大优势在于能够透明地利用GPU进行计算。只需正确配置,大部分Theano操作都能自动转移到GPU上,提高计算...

    pytorch基础学习笔记

    - **两个张量相加**: ```python x = torch.tensor([1, 2, 3]) y = torch.tensor([4, 5, 6]) result = torch.add(x, y) ``` - **张量与标量相乘**: ```python tensor = torch.tensor([1, 2, 3]) scalar = ...

    矩阵运算的vb及c++代码

    对于乘法,由于涉及到嵌套循环,通常较复杂,需要遍历两个矩阵的所有元素。 - **函数库**:VB.NET引入了System.Numerics命名空间,包含了一个Matrix3x3和Matrix4x4类,可以进行更高级的矩阵运算。 2. **C++中的...

    用C编写的线性代数方程组的求解函数程序

    在C语言中,需要手动实现矩阵的行交换、元素乘以常数、两行相加等操作。 2. **克拉默法则**:适用于方程组的系数矩阵为阶数相等且行列式非零的逆矩阵情况。计算出A的逆矩阵后,直接乘以b即可得到解x。但在C语言中,...

Global site tag (gtag.js) - Google Analytics