速查表
工作中最常用的 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=更简短。