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