第一章: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,一路下一步就行。安装完重启一下。

注意: 我曾经在Ubuntu上装驱动时,因为nouveau开源驱动没禁用,导致安装失败。记得先禁用nouveau:
sudo vim /etc/modprobe.d/blacklist-nouveau.conf
添加两行:
blacklist nouveau
options 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装好了。

小技巧: 我习惯在~/.bashrc里加一个别名:
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程序时,发现结果总是不对。用Nsight一步步跟踪,才发现是共享内存的bank conflict导致数据读错了。没有Nsight,这种问题排查起来非常痛苦。

调试技巧

  • cuda-gdb可以像GDB一样调试CUDA代码,支持断点、单步执行
  • 在代码里加cudaDeviceSynchronize()cudaGetLastError(),能快速定位错误
  • Nsight的Memory Checker功能可以检测越界访问,我建议开发时一直开着

嗯,环境搭建这部分就讲到这里。你想想看,驱动、Toolkit、调试工具,这三样配齐了,你就能开始写CUDA代码了。下一章咱们聊聊CUDA编程模型,那才是真正有意思的部分。