第一次在Linux上装CUDA时,我盯着命令行界面足足发了五分钟呆——NVIDIA驱动、CUDA Toolkit、环境变量这些概念像一团乱麻。后来才发现,安装CUDA本质上是在搭建三层结构:底层显卡驱动是地基,中间层CUDA Toolkit是工具库,上层环境变量则是通行证。这里以Ubuntu 22.04为例,带大家走通全流程。
先检查显卡驱动是否就位。打开终端输入:
bash复制nvidia-smi
如果看到类似下面的输出,说明驱动已安装:
code复制+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.54.03 Driver Version: 535.54.03 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 3090 Off | 00000000:01:00.0 Off | N/A |
| 30% 45C P8 25W / 350W | 0MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
关键看第二行CUDA Version字段,这里显示12.2表示驱动已支持CUDA 12.2。如果报错"command not found",需要先安装驱动。推荐使用官方驱动安装方式:
bash复制sudo apt install nvidia-driver-535
接下来处理系统依赖。CUDA安装需要GCC编译器和基础开发库,执行:
bash复制sudo apt update
sudo apt install build-essential gcc make linux-headers-$(uname -r)
这里有个隐藏坑点:不同Linux发行版的内核头文件包名可能不同。比如CentOS需要kernel-devel,而ArchLinux则是linux-headers。如果安装时遇到"Unable to locate package"错误,记得查对应发行版的文档。
到NVIDIA官网下载CUDA 12.2的runfile安装包。选择Linux → x86_64 → Ubuntu → 22.04 → runfile(local)后,会得到类似cuda_12.2.0_535.54.03_linux.run的文件。我强烈建议用runfile而不是deb包,因为可以自定义安装组件。
给安装文件添加执行权限后,关键步骤来了:
bash复制chmod +x cuda_12.2.0_535.54.03_linux.run
sudo ./cuda_12.2.0_535.54.03_linux.run
安装界面会出现组件选择菜单。重点注意:
安装完成后,你会看到这样的摘要信息:
code复制=========== Summary ===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-12.2/
特别注意警告信息:"Incomplete installation! This installation did not install the CUDA Driver"。如果之前没装驱动,这里需要重新运行安装程序并加上--driver参数。
安装完成只是第一步,真正让系统识别CUDA需要配置两个核心环境变量:
修改/etc/profile文件(全局生效)或~/.bashrc(当前用户生效):
bash复制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 -V验证时,如果显示"command not found",可能是PATH没生效。试试绝对路径:
bash复制/usr/local/cuda-12.2/bin/nvcc -V
预期输出应包含CUDA 12.2版本信息:
code复制nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Jun_13_19:16:58_PDT_2023
Cuda compilation tools, release 12.2, V12.2.91
更规范的作法是使用ldconfig管理库路径。创建/etc/ld.so.conf.d/cuda.conf文件,写入:
code复制/usr/local/cuda-12.2/lib64
然后执行sudo ldconfig更新缓存。这种方式比直接修改LD_LIBRARY_PATH更稳定,特别是需要多版本CUDA共存时。
验证阶段最容易暴露问题,我准备了三种验证方式,难度逐级提升。
进入CUDA自带的示例目录(通常位于/usr/local/cuda-12.2/samples),编译并运行deviceQuery:
bash复制cd 1_Utilities/deviceQuery
make
./deviceQuery
成功时会显示显卡详细信息,最后出现"Result = PASS"。常见错误:
同一目录下的bandwidthTest能检验显存通信质量:
bash复制cd ../bandwidthTest
make
./bandwidthTest
正常结果应显示Host-Device和Device-Device的带宽数值。我的RTX 3090测试结果约880GB/s,如果数值异常低(如<100GB/s),可能是PCIe链路问题。
自己写个简单的CUDA程序验证编译能力。创建matrixMul.cu文件:
cuda复制#include <stdio.h>
#include <cuda_runtime.h>
__global__ void matrixMul(int *a, int *b, int *c, int N) {
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
if (row < N && col < N) {
int sum = 0;
for (int k = 0; k < N; k++) {
sum += a[row * N + k] * b[k * N + col];
}
c[row * N + col] = sum;
}
}
int main() {
int N = 512;
size_t size = N * N * sizeof(int);
int *h_a = (int*)malloc(size);
int *h_b = (int*)malloc(size);
int *h_c = (int*)malloc(size);
// 初始化矩阵(略)
int *d_a, *d_b, *d_c;
cudaMalloc(&d_a, size);
cudaMalloc(&d_b, size);
cudaMalloc(&d_c, size);
cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
dim3 threadsPerBlock(16, 16);
dim3 blocksPerGrid((N + threadsPerBlock.x - 1) / threadsPerBlock.x,
(N + threadsPerBlock.y - 1) / threadsPerBlock.y);
matrixMul<<<blocksPerGrid, threadsPerBlock>>>(d_a, d_b, d_c, N);
cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);
// 验证结果(略)
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
free(h_a);
free(h_b);
free(h_c);
return 0;
}
编译运行:
bash复制nvcc matrixMul.cu -o matrixMul
./matrixMul
这个测试能验证完整的CUDA开发生态是否正常,包括编译器、运行时库和设备执行。
实际安装时总会遇到各种妖魔鬼怪。分享几个我踩过的坑:
驱动版本冲突:之前用apt安装的驱动可能与CUDA安装包带的驱动冲突。解决方法:
bash复制sudo apt purge nvidia*
sudo /usr/local/cuda-12.2/bin/cuda-uninstaller
然后重新安装驱动和CUDA。
GCC版本问题:CUDA 12.2要求GCC版本不高于11。如果系统预装GCC 12+,需要降级:
bash复制sudo apt install gcc-11 g++-11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100
多版本CUDA共存:通过软链接/usr/local/cuda指向具体版本目录,配合conda环境更佳:
bash复制sudo rm /usr/local/cuda
sudo ln -s /usr/local/cuda-12.2 /usr/local/cuda
Xorg服务崩溃:安装驱动后无法进入图形界面。尝试在grub引导时加nomodeset参数,然后重装驱动:
bash复制sudo apt install --reinstall nvidia-driver-535