第一章:CUDA环境搭建与工具链
各位同学,咱们今天正式开讲。在动手写CUDA代码之前,有一件事必须搞定——把环境搭起来。这就像盖房子要先打地基,地基不稳,后面全是坑。
我个人习惯是先把驱动装好,再配CUDA Toolkit,最后装Nsight调试工具。这个顺序别搞反了,否则容易出幺蛾子。
1.1 NVIDIA驱动安装
驱动是GPU和操作系统之间的翻译官。没有它,你的CUDA程序根本跑不起来。
第一步:确认你的GPU型号
打开终端,输入:
lspci | grep -i nvidia
或者用Windows的话,打开设备管理器,在显示适配器里就能看到。我遇到过有人拿着集成显卡想跑CUDA,那肯定不行。CUDA需要NVIDIA的独立GPU,比如GeForce、Quadro、Tesla这些系列。
第二步:下载对应驱动
去NVIDIA官网,找到驱动下载页面。选你的GPU型号和操作系统。我个人建议下载最新稳定版,别追Beta版,容易翻车。
第三步:安装驱动
Linux下安装:
sudo chmod +x NVIDIA-Linux-*.run
sudo ./NVIDIA-Linux-*.run
Windows下直接双击exe,一路下一步就行。安装完重启一下。
sudo vim /etc/modprobe.d/blacklist-nouveau.conf添加两行:
blacklist nouveauoptions nouveau modeset=0
装完后验证一下:
nvidia-smi
如果能看到GPU信息、驱动版本、CUDA版本,那就说明驱动装好了。
1.2 CUDA Toolkit配置
驱动装好了,接下来配CUDA Toolkit。这个工具包包含了编译器、库文件、头文件等,是开发CUDA程序的核心。
下载与安装
去NVIDIA开发者网站下载CUDA Toolkit。选你的操作系统和架构。我建议下载runfile(Linux)或exe(Windows)本地安装包,网络安装包有时候会断。
Linux下安装:
sudo sh cuda_*.run
安装过程中会问你是否安装驱动,如果你已经装好了,就选No。其他选项默认就行。
配置环境变量
安装完后,需要把CUDA的路径加到环境变量里。编辑~/.bashrc:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
然后source一下:
source ~/.bashrc
验证安装:
nvcc --version
如果能看到版本号,说明CUDA Toolkit装好了。
alias cuda-version='cat /usr/local/cuda/version.txt'这样随时可以查看CUDA版本。
编译第一个CUDA程序
写一个简单的hello.cu:
#include <stdio.h>
__global__ void hello() {
printf("Hello from GPU!\n");
}
int main() {
hello<<<1, 1>>>();
cudaDeviceSynchronize();
return 0;
}
编译运行:
nvcc hello.cu -o hello
./hello
如果看到"Hello from GPU!",恭喜你,环境配好了。
1.3 Nsight调试工具简介
写CUDA程序,调试是绕不开的。Nsight就是NVIDIA官方提供的调试和分析工具。说白了,它帮你找到代码里的bug和性能瓶颈。
Nsight版本选择
| 工具名称 | 适用场景 | 我的评价 |
|---|---|---|
| Nsight Systems | 系统级性能分析 | 适合看整体流程 |
| Nsight Compute | 内核级性能分析 | 适合优化单个kernel |
| Nsight Visual Studio Edition | Windows下调试 | 集成在VS里,方便 |
| Nsight Eclipse Edition | Linux下调试 | 我用的最多的 |
Nsight Systems快速上手
安装完CUDA Toolkit后,Nsight Systems通常已经自带了。启动方式:
nsys profile -o my_profile ./my_cuda_program
这会生成一个.qdrep文件,用Nsight Systems GUI打开就能看到时间线。你能看到CPU和GPU的活动,数据传输、kernel执行等一目了然。
Nsight Compute使用
这个工具专门分析kernel的性能。用法:
ncu -o my_kernel_profile ./my_cuda_program
它会告诉你每个kernel的占用率、带宽利用率、指令分布等。我优化代码时,基本离不开它。
调试技巧
- 用
cuda-gdb可以像GDB一样调试CUDA代码,支持断点、单步执行 - 在代码里加
cudaDeviceSynchronize()和cudaGetLastError(),能快速定位错误 - Nsight的Memory Checker功能可以检测越界访问,我建议开发时一直开着
嗯,环境搭建这部分就讲到这里。你想想看,驱动、Toolkit、调试工具,这三样配齐了,你就能开始写CUDA代码了。下一章咱们聊聊CUDA编程模型,那才是真正有意思的部分。