美文网首页
CUDA加速计算

CUDA加速计算

作者: 半笔闪 | 来源:发表于2019-12-02 14:03 被阅读0次
  • 环境介绍
    1、ubuntu18.04
    2、cmake3.10.2
    3、CUDA10.0
    4、gcc7.4.0
    5、make4.1
  • 入门例子 数组相加
mkdir cudademo && cd cudademo
vim cuda_demo_func.cu   //cuda的程序以.cu结尾

在cuda_demo_func.cu中写入如下程序:

//只需要一个io库做输入输出的打印
#include <stdio.h>
//cuda的kernel函数要在前面加__global__,数组相加传入的参数有两个数组a和b,它们相加之后的计算结构c,以及它们的数组长度num
__global__ void add(int* a, int* b, int* c, int num){
    //没一个thread跑数组的一个对应元素的相加
    int i = threadIdx,x;
    //越界检查
    if(i < num){
        //对应数组的一个元素的相加
        c[i] = a[i] + b[i];
    }
}

int main(void){
    //数组长度10
    int num = 10;
    声明相加的两个数组和计算结果的数组
    int a[num], b[num], c[num];
    //声明gpu上的对应数组的指针
    int *a_gpu, *b_gpu, *c_gpu;
    
    //给相加的两个数组赋值
    for(int i = 0; i < num; ++i){
        //这里给第一个数组赋值对应的下标
        a[i] = i;
        //给第二个数组赋值对应下标的平方
        b[i] = i * i;
    }
    
    //用cudaMalloc给对应gpu上的数组分配内存空间
    cudaMalloc((void**)&a_gpu, num * sizeof(int));
    cudaMalloc((void**)&b_gpu, num * sizeof(int));
    cudaMalloc((void**)&c_gpu, num * sizeof(int));
    
    //用cudaMemcpy把在cpu上赋值完的两个数组a,b拷贝到分配好内存的gpu空间上
    cudaMemcpy(a_gpu, a, num * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(b_gpu, b, num * sizeof(int), cudaMemcpyHostToDevice);

    //调用kernel函数,分配1个block,num个thread
    add<<<1, num>>>(a_gpu, b_gpu, c_gpu, num);

    //把计算结果从gpu上考回到cpu上
    cudaMemcpy(c, c_gpu, num * sizeof(int), cudaMemcpyDeviceToHost);

    //打印结果印证
    for(int i = 0; i < num; ++i){
        printf("%d + %d = %d\n", a[i], b[i], c[i]);
    }

    return 0;
}

然后写CMake文件,

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(demo)
FIND_PACKAGE(CUDA REQUIRED)
CUDA_ADD_EXECUTABLE(demo cuda_demo_func.cu)
TARGET_LINK_LIBRARIES(demo)

编译运行:

mkdir build && cd build
cmake ../
make
./demo     #运行会打印最后的结果

-- 卷积

相关文章

网友评论

      本文标题:CUDA加速计算

      本文链接:https://www.haomeiwen.com/subject/gpgvyctx.html