使用CMake创建CUDA工程

依赖工具:

  • CUDA驱动
  • CUDA TOOL KIT
  • cmake
  • Linux:gcc/g++
  • Windows:cl.exe

hello world代码

在你的工程目录下创建hello_cuda.cu文件,写入以下CUDA代码,作为该教程的源码:

#include 

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

int main(void)
{
    int a, b, c;          // host copies of a, b, c
    int *d_a, *d_b, *d_c; // device copies of a, b, c
    int size = sizeof(int);
    // Allocate space for device copies of a, b, c
    cudaMalloc((void **)&d_a, size);
    cudaMalloc((void **)&d_b, size);
    cudaMalloc((void **)&d_c, size);
    // Setup input values
    a = 2;
    b = 7;
    // Copy inputs to device
    cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);
    // Launch add() kernel on GPU
    add<<<1, 1>>>(d_a, d_b, d_c);
    // Copy result back to host
    cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);
    // Cleanup
    cudaFree(d_a);
    cudaFree(d_b);
    cudaFree(d_c);
    printf("The CUDA result c = %d\n", c);
    return 0;
}

Linux环境下,创建CMake工程

1、环境变量配置

编译CUDA工程时,需要在环境变量中配置CUDA的bin目录(包含nvcc)lib64目录,这样cmake才能找到CUDA相关的可执行文件和库。
一般情况下CUDA会装在/usr/local/cuda- 目录下,你需要根据自己的情况替换成自己的路径,不要无脑照抄教程。

  1. 方式1:配置到/etc/environment文件,重启后全局全用户可用。如果你用的是自己的机器,或者所在的服务器可以执行重启操作,那么建议你可以这么操作。

    # 在PATH后追加:/usr/local/cuda-/bin
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/cuda-/bin"
    
    # 在LD_LIBRARY_PATH后追加:/usr/local/cuda-/lib64
    LD_LIBRARY_PATH="/usr/local/cuda-/lib64"
    

    配置完后需要重启电脑,重新登录后就可用了。

  2. 方式2:配置到~/.bashrc文件,仅当前用户可用。如果你没有sudo权限或无法重启机器,那么建议你可以这么操作。

    # export PATH:/usr/local/cuda-/bin
    export PATH=/usr/local/cuda-/bin:$PATH
    
    # export LD_LIBRARY_PATH:/usr/local/cuda-/lib64
    export LD_LIBRARY_PATH=/usr/local/cuda-/lib64:$LD_LIBRARY_PATH
    

    配置完后需要source一下,或关闭当前shell窗口重启一个新的shell就可用了。

按照上述2种方式配置完后,可调用一下nvcc --version的命令看能否找到,如果能找到并输出,证明CUDA的环境变量就配置好了。以下是我的nvcc --version的命令及输出,供参考:

yanghong@isp-02:~/Projects/hello_cuda$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_Mar__8_18:18:20_PST_2022
Cuda compilation tools, release 11.6, V11.6.124
Build cuda_11.6.r11.6/compiler.31057947_0

2、CMakeLists.txt编写

在你的工程目录下创建CMakeLists.txt文件,写入以下cmake配置,部分配置自己看注释灵活调整:

# 设置cmake的最低版本号为3.26
cmake_minimum_required(VERSION 3.26)

# 设置项目名称,并设置编程语言为CUDA。参考文档:https://cmake.org/cmake/help/latest/command/project.html#options
project(modules_cuda CUDA)

# 设置项目的C++标准为C++20
set(CMAKE_CUDA_STANDARD 20)

# 设置可执行程序的名称为hello_cuda, 对应源码文件为hello_cuda.cu
add_executable(hello_cuda hello_cuda.cu)

# 设置可执行程序的target属性
set_target_properties(hello_cuda PROPERTIES
        CUDA_SEPARABLE_COMPILATION ON)

3、编译、执行hello_cuda程序

在命令行中,建立build目录并进入,然后用cmake编译运行即可,具体的命令如下:

# 如果之前有build目录,可用先删除
rm -rf ./build

# 创建build目录
mkdir build

# 进入build目录
cd build

# cmake生成hello_cuda工程
cmake ..

# cmake编译hello_cuda工程,生成可执行文件hello_cuda
make -j 

# 运行可执行文件hello_cuda,观察输出
./hello_cuda

# 如执行完毕后无其他操作,可用返回上级目录
cd -

预期的./hello_cuda会有如下输出:

yanghong@isp-02:~/Projects/hello_cuda/build$ ./hello_cuda
The CUDA result c = 9

Windows环境下,创建CMake工程

暂略

你可能感兴趣的:(cmake,cuda,linux)