cuda 入门(一)

  • 环境配置:

安装完cuda之后,查看cuda编译器nvcc能否能够正常工作。

  • 第一个Helloworld
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void kernel(void) {

}

int main() {
        kernel <<<1, 1>>> (); 
        // <<<1,1>>>代表一个kernel的grid中只有1个block,每个block中有1个thread。
        printf("Hello world!\n");
        return 0;
}

<<< >>> 为内核函数的执行参数,用于说明内核函数中的线程数量,以及线程是如何组织的。

将上面的代码保存为一个cu文件,比如hello_world.cu, 然后编译该文件

#编译
nvcc hello_world.cu -o hello_cuda
#运行
hello_cuda

这样看,cuda程序的helloworld还是挺简单的。

  • cuda计算程序
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void add(const int a, const int b, int *c)
{
        *c = a + b;
}

int main()
{
        int c;
        int *dev_c; // 定义在设备端的接收数据的指针
        cudaError_t cudaStatus;
        //为输入参数和输出参数分配内存
        cudaStatus = cudaMalloc((void**)&dev_c, sizeof(int));
        if (cudaStatus != cudaSuccess) {
                printf("cudaMalloc is failed!\n");
        }
        add<<<1, 1 >>>(2, 7, dev_c);
        cudaStatus = cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
        if (cudaStatus != cudaSuccess) {
                printf(" cudaMemcpyDeviceToHost is failed!\n");
        }
        cudaFree(dev_c);
        printf("2+7=%d\n", c);
        return 0;
}

add是真正在GPU上run的函数,程序刚开始在GPU memory中分配dev_c,将a+b的计算结果保存在GPU memory中,然后再将dev_c中的值copy到HOST端的c中,这样便可以print出来了。看程序还是很好理解的。

特别要注意的是,不能直接print dev_c,给dev_c分配了GPU memory空间,程序结束时,也要释放对应的GPU memory.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章