GPU 是计算更耗电,还是读写更耗电?
做 CUDA GEMM 优化时,顺手在一张 RTX 4090 上测了一组小实验。
测试方法很简单:分别跑几种 synthetic kernel,同时用单独进程每 0.5 秒记录一次 nvidia-smi 的功耗、温度、频率。统计时只保留 GPU util=100% 的样本,并跳过最开始的 ramp-up。
结果
| workload | 吞吐 | 平均功耗 | 最大功耗 | 最高温度 |
|---|---|---|---|---|
| 纯 Tensor Core MMA | 175.8 BF16 TFLOP/s | 174.2W | 176.5W | 51C |
| global read | 980.8 GB/s | 287.8W | 291.8W | 53C |
| global write | 888.6 GB/s | 244.3W | 245.3W | 55C |
| global copy | 912.2 GB/s read+write | 282.7W | 283.7W | 59C |
| shared memory R/W | 21.6 TB/s 逻辑 shared 流量 | 349.6W | 369.4W | 69C |
几个结论
第一,纯 Tensor Core MMA 不一定烧满整卡功耗。
这个测试能跑到约 176 BF16 TFLOP/s,但功耗只有 174W 左右。原因是它几乎只在寄存器里反复发 MMA 指令,不怎么动 global memory、L2、shared memory 和大规模 store。
第二,streaming global memory 比纯 MMA 更耗电。
global read/copy 大约 283-288W,明显高于纯 MMA。这类 kernel 会持续驱动 L2、memory controller 和显存路径。RTX 4090 用的是 GDDR6X,不是 HBM。
第三,shared memory 高频读写在这个实验里最耗电。
shared memory 单次访问当然比显存便宜。但这个 kernel 几乎不等显存,可以让 SM 内部 shared load/store、FP32 运算和同步路径持续高活跃,所以平均功耗到了 350W 左右。
所以这次实验的核心结论是:
单次访问成本:显存通常最贵 整卡实时功耗:取决于单位时间内哪些硬件路径被持续激活
在这组 synthetic workload 上,功耗排序大概是:
shared memory 高频 R/W > streaming global read/copy > 纯 Tensor Core MMA
这也说明:GPU util=100% 信息量很有限。它只能说明 GPU 忙,但不能说明到底是 Tensor Core 忙、显存忙,还是 SM 内部 load/store 路径忙。