第一章:CUDA环境搭建——从零开始搭起你的GPU开发台
说实话,我见过太多同学卡在环境搭建这一步。明明代码写得没问题,一跑就报错,最后发现是驱动版本不对。嗯,今天我们就来把这套东西理清楚。
1.1 NVIDIA驱动安装——GPU的“操作系统”
NVIDIA驱动,说白了就是让操作系统能跟GPU对话的桥梁。没有它,你的显卡就是个摆设。
怎么确认当前驱动?
打开终端,敲这个命令:
nvidia-smi
如果能看到GPU型号、驱动版本、显存使用情况,说明驱动已经装好了。如果报错“command not found”,那就得动手了。
安装方式(我推荐两种):
- 官方.run文件安装:去NVIDIA官网下载对应型号的驱动,然后执行:
chmod +x NVIDIA-Linux-*.run && sudo ./NVIDIA-Linux-*.run - Ubuntu仓库安装(省心但版本可能旧):
sudo apt install nvidia-driver-535
sudo apt purge nvidia-*
1.2 CUDA Toolkit安装——GPU编程的“编译器+库”
驱动装好了,GPU能跑了。但你想写CUDA代码?还得装CUDA Toolkit。它包含了nvcc编译器、CUDA运行时库、各种数学库。
版本匹配很重要
我个人的习惯是:先查驱动支持的最高CUDA版本。用nvidia-smi看右上角,比如显示“CUDA Version: 12.2”,那我装CUDA 12.x就没问题。
安装步骤:
- 去NVIDIA官网下载对应版本的runfile(推荐)或deb包
- 执行安装:
sudo sh cuda_12.2.0_535.54.03_linux.run - 安装时注意:不要勾选Driver(我们已经装过了)
- 配置环境变量,加到
~/.bashrc:
export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH
然后source ~/.bashrc,再敲nvcc --version验证。看到版本号就对了。
/usr/local下保留多个CUDA版本,用软链接切换。比如ln -s /usr/local/cuda-12.2 /usr/local/cuda,这样改链接就能换版本。
1.3 cuDNN安装——深度学习加速的“秘密武器”
cuDNN是NVIDIA针对深度学习优化的底层库。做CNN、RNN、Transformer,没它性能直接掉一半。
安装流程:
- 去NVIDIA官网注册下载(需要账号,免费)
- 选择对应CUDA版本的cuDNN
- 解压后复制文件到CUDA目录:
tar -xzvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
验证是否装好:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
核心要点: cuDNN版本必须和CUDA版本严格对应。比如CUDA 12.2配cuDNN 8.9.x,别乱配。
1.4 nvcc编译器使用——把CUDA代码变成GPU指令
nvcc是CUDA的编译器。它会把.cu文件里的主机代码(CPU部分)和设备代码(GPU部分)分开编译,最后链接到一起。
基本用法:
nvcc -o my_program my_kernel.cu
常用编译选项:
| 选项 | 作用 |
|---|---|
-arch=sm_80 |
指定GPU架构(sm_80对应Ampere架构,比如A100) |
-O2 |
优化等级,一般用O2 |
-G |
生成调试信息(调试时用,性能会下降) |
-lineinfo |
保留行号信息,方便性能分析 |
举个例子,编译一个针对RTX 3090优化的程序:
nvcc -arch=sm_86 -O2 -o vec_add vec_add.cu
-G,它会让性能变得很差。先用-O2跑通,再考虑调试。
1.5 Makefile/CMake工程配置——让编译自动化
项目大了,总不能每次都手动敲nvcc命令吧?这时候就需要构建工具了。
Makefile示例(简单项目用):
CUDA_HOME = /usr/local/cuda
NVCC = $(CUDA_HOME)/bin/nvcc
TARGET = my_program
SOURCES = main.cu kernel.cu
all: $(TARGET)
$(TARGET): $(SOURCES)
$(NVCC) -arch=sm_86 -O2 -o $@ $^
clean:
rm -f $(TARGET)
CMake示例(推荐,尤其大型项目):
cmake_minimum_required(VERSION 3.18)
project(MyCUDAProject LANGUAGES CUDA CXX)
# 启用CUDA
enable_language(CUDA)
# 设置架构
set(CMAKE_CUDA_ARCHITECTURES "86")
# 添加可执行文件
add_executable(my_program main.cu kernel.cu)
# 设置编译选项
target_compile_options(my_program PRIVATE -O2 -lineinfo)
用CMake构建:
mkdir build && cd build
cmake ..
make -j$(nproc)
FindCUDA.cmake,麻烦得很。我建议直接装新版本CMake。
知识体系总览
下面这张图,把整个环境搭建的脉络串起来了。你想想看,从硬件到驱动,再到工具链和构建系统,每一步都环环相扣。
环境搭建这块,说白了就是一层层往上垒。驱动是地基,CUDA Toolkit是框架,cuDNN是装修材料,Makefile/CMake是施工图纸。哪一层出问题,楼都盖不起来。
我刚开始学CUDA时,光装环境就折腾了两天。后来发现,只要记住一个原则:版本匹配。驱动、CUDA、cuDNN三者版本必须兼容,否则各种玄学错误。你想想看,是不是这个理?
最后总结一下我的建议:
- 先装驱动,用
nvidia-smi确认 - 再装CUDA Toolkit,用
nvcc --version确认 - 然后装cuDNN,用头文件版本号确认
- 最后配好构建工具,写个简单的
hello.cu跑通
每一步都验证通过,再往下走。别一口气全装完再查问题,那样你根本不知道是哪步错了。