第1章:CUDA开发环境搭建
说实话,很多初学者在CUDA上栽跟头,不是代码写错了,而是环境没搭好。我见过太多人花了一整天装驱动,结果黑屏了。嗯,这一章咱们就把这事彻底搞定。
1.1 NVIDIA驱动安装
驱动是GPU和操作系统之间的翻译官。没有它,你的CUDA代码根本跑不起来。
1.1.1 检查你的GPU
先确认你手头的显卡支不支持CUDA。打开设备管理器(Windows)或终端(Linux),看看显卡型号。
# Linux下查看GPU信息
lspci | grep -i nvidia
# Windows下用命令行
wmic path win32_videocontroller get name
我遇到过有人拿着集成显卡折腾半天,那肯定不行。CUDA需要NVIDIA的独立显卡,比如GeForce、Quadro、Tesla系列。
1.1.2 下载驱动
去NVIDIA官网,找到「驱动程序下载」页面。选对你的显卡型号和操作系统。
- Windows用户: 下载 .exe 安装包,双击运行
- Linux用户: 下载 .run 文件,或者用包管理器
1.1.3 安装步骤
Windows下基本是下一步下一步。Linux下稍微麻烦点:
# 先卸载旧驱动(如果有)
sudo apt-get purge nvidia*
# 禁用nouveau开源驱动
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo update-initramfs -u
# 重启后安装
chmod +x NVIDIA-Linux-*.run
sudo ./NVIDIA-Linux-*.run
安装完成后,用 nvidia-smi 验证。如果能看到GPU信息,驱动就装好了。
1.2 CUDA Toolkit安装
驱动是基础,CUDA Toolkit才是我们写代码用的工具包。它包含了编译器、库文件、调试工具等。
1.2.1 版本选择
CUDA Toolkit版本和驱动版本有对应关系。你想想看,装了个太新的Toolkit,驱动不支持,那不就白搭了?
| CUDA Toolkit版本 | 最低驱动版本(Windows) | 最低驱动版本(Linux) |
|---|---|---|
| CUDA 12.x | 525.xx | 525.xx |
| CUDA 11.8 | 520.xx | 520.xx |
| CUDA 11.0 | 450.xx | 450.xx |
nvidia-smi 查看驱动版本,然后选一个兼容的CUDA Toolkit版本。
1.2.2 安装过程
Windows下直接运行安装包。我建议选「自定义安装」,只勾选你需要的组件:
- CUDA编译器(nvcc)
- CUDA运行时库
- CUDA样例代码(可选,但推荐)
Linux下可以用包管理器:
# Ubuntu/Debian
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get install cuda
装完后,记得把CUDA路径加到环境变量里:
# 在 ~/.bashrc 或 ~/.zshrc 中添加
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
1.3 cuDNN配置
cuDNN是深度神经网络的加速库。如果你只是做通用GPU计算,可以不装。但搞深度学习的话,这玩意是必须的。
1.3.1 下载与安装
去NVIDIA官网下载对应CUDA版本的cuDNN。下载后是个压缩包,解压后把文件复制到CUDA目录下:
# Linux下
tar -xzvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-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*
Windows下更简单,直接把解压后的bin、include、lib文件夹覆盖到CUDA安装目录。
1.3.2 验证cuDNN
写个小程序测试一下:
#include <cudnn.h>
#include <iostream>
int main() {
cudnnHandle_t handle;
cudnnCreate(&handle);
std::cout << "cuDNN version: " << cudnnGetVersion() << std::endl;
cudnnDestroy(handle);
return 0;
}
编译运行,如果能打印出版本号,就说明配置成功了。
1.4 Visual Studio / Nsight环境配置
写CUDA代码,IDE选对了能省不少事。我个人推荐Visual Studio + Nsight插件。
1.4.1 Visual Studio配置
安装Visual Studio时,记得勾选「使用C++的桌面开发」工作负载。然后安装CUDA Toolkit时,它会自动集成到VS中。
验证方法:新建一个项目,看看模板里有没有「CUDA」相关的选项。
右键项目 → 生成依赖项 → 生成自定义 → 勾选CUDA xxx
1.4.2 Nsight调试工具
Nsight是NVIDIA的调试和性能分析工具。装CUDA Toolkit时一般会自带。
- Nsight Visual Studio Edition: 集成在VS里,可以断点调试GPU代码
- Nsight Systems: 分析整体性能瓶颈
- Nsight Compute: 分析单个kernel的性能
我记得第一次用Nsight调试时,发现一个kernel的占用率只有30%,优化后直接翻倍。这工具真的值得花时间学。
1.5 验证安装
所有东西装完了,来个大综合验证。写个简单的向量加法程序:
#include <cuda_runtime.h>
#include <iostream>
__global__ void vecAdd(float* a, float* b, float* c, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) c[i] = a[i] + b[i];
}
int main() {
int n = 1024;
float *a, *b, *c;
float *d_a, *d_b, *d_c;
// 分配主机内存
a = new float[n];
b = new float[n];
c = new float[n];
// 初始化数据
for (int i = 0; i < n; i++) {
a[i] = i * 1.0f;
b[i] = i * 2.0f;
}
// 分配设备内存
cudaMalloc(&d_a, n * sizeof(float));
cudaMalloc(&d_b, n * sizeof(float));
cudaMalloc(&d_c, n * sizeof(float));
// 拷贝数据到GPU
cudaMemcpy(d_a, a, n * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, n * sizeof(float), cudaMemcpyHostToDevice);
// 调用kernel
vecAdd<<<(n + 255) / 256, 256>>>(d_a, d_b, d_c, n);
// 拷贝结果回CPU
cudaMemcpy(c, d_c, n * sizeof(float), cudaMemcpyDeviceToHost);
// 验证结果
bool ok = true;
for (int i = 0; i < n; i++) {
if (c[i] != a[i] + b[i]) {
ok = false;
break;
}
}
std::cout << (ok ? "✅ 验证通过!" : "❌ 验证失败!") << std::endl;
// 清理
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
delete[] a;
delete[] b;
delete[] c;
return 0;
}
编译运行,如果看到「验证通过」,恭喜你,环境搭建成功了!
好了,环境搭好了,下一章咱们就开始写真正的CUDA代码了。说实话,搭建环境是最枯燥的部分,熬过去后面就好玩了。
公众号:蓝海资料掘金营,微信deep3321