发布于 

CUDA编程笔记002. Hello CUDA

使用CMake开发第一个CUDA工程hello-cuda。

源代码目录如下:

$ tree hello-cuda/
.
├── CMakeLists.txt
└── hello_cuda.cu

1、编写CMakeList.txt

cmake_minimum_required(VERSION 3.14)

# CMake支持CUDA语言,会自动识别.cu文件,并使用nvcc对齐编译。
project(hello-cuda CXX CUDA)

# 定义可执行程序hello_cuda,对应的源文件是hello_cuda.cu。
add_executable(hello_cuda hello_cuda.cu)

2、编写hello_cuda.cu

#include <stdio.h>

/* __global__表示这是一个CUDA kernel,在device侧,也就是GPU上运行。*/
__global__ void helloFromGPU(void) {
 printf("Hello World from GPU!\n");
}

int main(void) {
 printf("Hello World from CPU!\n");

// 执行GPU kernel函数,会有5个GPU thread各打印1个。
 helloFromGPU <<<1, 5>>>();
 
// 销毁当前进程所管理设备的所有资源。如果不加这行,会看不到GPU打印!
 cudaDeviceReset();
 return 0;
}

3、编译cuda程序

cmake -S . -B build/
cd build
make

提示

如果cmake报错:No CMAKE_CUDA_COMPILER could be found,可配置环境变量

CUDACXX=/usr/local/cuda-12.2/bin/nvcc,再执行cmake即可。

4、执行cuda程序

$ ./hello_cuda
Hello World from CPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!

输出CPU打印1个,GPU打印5个。

5、编译细节

通过make clean; make VERBOSE=1可以看到具体的编译器命令参数:

[ 50%] Building CUDA object CMakeFiles/hello_cuda.dir/hello_cuda.cu.o
/usr/local/cuda-12.2/bin/nvcc -forward-unknown-to-host-compiler    -MD -MT CMakeFiles/hello_cuda.dir/hello_cuda.cu.o -MF CMakeFiles/hello_cuda.dir/hello_cuda.cu.o.d -x cu -c /home/zgd/code/CppKit/src/cuda/hello_cuda.cu -o CMakeFiles/hello_cuda.dir/hello_cuda.cu.o
[100%] Linking CUDA executable hello_cuda
/usr/bin/cmake -E cmake_link_script CMakeFiles/hello_cuda.dir/link.txt --verbose=1
/usr/bin/g++ CMakeFiles/hello_cuda.dir/hello_cuda.cu.o -o hello_cuda  -lcudadevrt -lcudart_static -lrt -lpthread -ldl  -L"/usr/local/cuda-12.2/targets/x86_64-linux/lib/stubs" -L"/usr/local/cuda-12.2/targets/x86_64-linux/lib"

可以看到,CMake cuda程序的编译流程:

  • 首先,使用nvcc将hello_cuda.cu编译成hello_cuda.cu.o;
  • 然后,使用g++将hello_cuda.cu.o和cuda库cudart_static、cudadevrt链接成可执行文件hello_cuda。

以上便是cuda的第一个入门实例。