跳过正文

速查表

工作中最常用的 CUDA 命令、API 与调试技巧。每条都自己验过才写。

按工具/主题组织,持续添加。

nvidia-smi
#

最常用的 GPU 状态查看工具,几乎每个 CUDA 程序员每天都会敲十几次。

基础信息
#

nvidia-smi                  # GPU 列表、利用率、显存、温度、驱动 / CUDA 版本
nvidia-smi -L               # 只列 GPU 名称和 UUID
nvidia-smi -q               # 全部属性(啰嗦但全)

实时监控
#

nvidia-smi -l 1             # 每 1 秒刷新一次(自带)
watch -n 1 nvidia-smi       # 用 watch,屏幕不闪
nvidia-smi dmon             # 单行多 GPU 实时数据(脚本友好)

显存与进程
#

# 只看显存
nvidia-smi --query-gpu=memory.used,memory.free,memory.total --format=csv

# 看哪些进程在占 GPU
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv

多 GPU 拓扑
#

nvidia-smi topo -m          # GPU 之间的连接方式(PCIe / NVLink / NVSwitch)

持久化 & 功耗(需要 root)
#

sudo nvidia-smi -pm 1       # 开启持久化模式,降低冷启动延迟
sudo nvidia-smi -pl 250     # 设置 GPU 功耗上限为 250W

注:-l 循环不要在生产环境里挂着跑,会持续轮询影响调度。

nvcc
#

CUDA 编译器,把 .cu 文件编成能在 GPU 上跑的可执行。每次写 kernel 都绕不开。

基础编译
#

nvcc hello.cu -o hello              # 默认架构编译,生成可执行
nvcc -O3 hello.cu -o hello          # 开优化
nvcc -g -G hello.cu -o hello        # 带 host + device 调试信息(给 cuda-gdb 用)

指定 GPU 架构
#

每张 GPU 有自己的 compute capability(架构号)。不指定的话 nvcc 会用默认值,可能没用到新指令,甚至跑不起来。

nvcc -arch=sm_75 hello.cu -o hello  # Turing(T4 / RTX 20)
nvcc -arch=sm_80 hello.cu -o hello  # Ampere(A100)
nvcc -arch=sm_86 hello.cu -o hello  # Ampere(RTX 30)
nvcc -arch=sm_89 hello.cu -o hello  # Ada Lovelace(RTX 40)
nvcc -arch=sm_90 hello.cu -o hello  # Hopper(H100)

不确定自己显卡是什么架构,先查一下:

nvidia-smi --query-gpu=compute_cap --format=csv

多架构编译(发布常用)
#

让同一个二进制能在多种卡上跑——开发时不常用,发包给别人时用:

nvcc -gencode arch=compute_75,code=sm_75 \
     -gencode arch=compute_80,code=sm_80 \
     -gencode arch=compute_86,code=sm_86 \
     hello.cu -o hello

看 PTX / SASS
#

nvcc -ptx hello.cu -o hello.ptx     # 生成中间表示 PTX(类汇编)
nvcc -cubin hello.cu -o hello.cubin # 生成 GPU 二进制 cubin
cuobjdump --dump-sass hello         # 反汇编看真正运行的 SASS 指令

链接 CUDA 库
#

nvcc main.cu -lcublas -lcudart -o main   # 链 cuBLAS
nvcc main.cu -lcudnn -o main             # 链 cuDNN
nvcc main.cu -lcurand -o main            # 链 cuRAND(GPU 随机数)

注:-arch=sm_xx-gencode arch=compute_xx,code=sm_xx 的简写。前者只产 SASS(机器码),后者产 PTX + SASS,跨架构兼容性更好——发布用 -gencode,自己开发用 -arch= 更简短。