第一章: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就没问题。

安装步骤:

  1. 去NVIDIA官网下载对应版本的runfile(推荐)或deb包
  2. 执行安装:
    sudo sh cuda_12.2.0_535.54.03_linux.run
  3. 安装时注意:不要勾选Driver(我们已经装过了)
  4. 配置环境变量,加到~/.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,没它性能直接掉一半。

安装流程:

  1. 去NVIDIA官网注册下载(需要账号,免费)
  2. 选择对应CUDA版本的cuDNN
  3. 解压后复制文件到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)
⚠️ 注意: CMake 3.18以上版本才原生支持CUDA。老版本需要手动找FindCUDA.cmake,麻烦得很。我建议直接装新版本CMake。

知识体系总览

下面这张图,把整个环境搭建的脉络串起来了。你想想看,从硬件到驱动,再到工具链和构建系统,每一步都环环相扣。

CUDA开发环境搭建知识体系 NVIDIA GPU硬件 NVIDIA驱动 (nvidia-smi) CUDA Toolkit (nvcc + 运行时库) cuDNN (深度学习加速) nvcc编译器 (编译.cu) 构建工具 (Makefile/CMake) 可以开始写CUDA代码了!

环境搭建这块,说白了就是一层层往上垒。驱动是地基,CUDA Toolkit是框架,cuDNN是装修材料,Makefile/CMake是施工图纸。哪一层出问题,楼都盖不起来。

我刚开始学CUDA时,光装环境就折腾了两天。后来发现,只要记住一个原则:版本匹配。驱动、CUDA、cuDNN三者版本必须兼容,否则各种玄学错误。你想想看,是不是这个理?

最后总结一下我的建议:

  • 先装驱动,用nvidia-smi确认
  • 再装CUDA Toolkit,用nvcc --version确认
  • 然后装cuDNN,用头文件版本号确认
  • 最后配好构建工具,写个简单的hello.cu跑通

每一步都验证通过,再往下走。别一口气全装完再查问题,那样你根本不知道是哪步错了。

可可精品资料库