Post
计算瓶颈为什么很多程序慢,不是因为算力不够,而是因为内存
讨论带宽、缓存与数据移动成本,解释为什么很多性能问题首先是内存问题。
很多性能讨论一开始就盯着 FLOPS、核心数和 tensor core,但实际系统经常在更早的地方被卡住:数据还没喂到计算单元。尤其在推理、量子模拟和一些看似“并行度很高”的数值任务里,算力纸面参数并不能直接解释真实表现。
算得快,不代表送得快
一段程序的时间消耗可以粗略拆成两部分:
- 计算本身
- 数据移动
在很多高性能计算和 AI 推理任务里,真正昂贵的是第二部分。你可能有很强的算力,但如果访存模式糟糕、缓存命中率低、内存带宽吃满,计算单元仍然会空转。工程上看到的现象通常是:设备监控里显卡“看起来很忙”,但整体吞吐并没有上去。
为什么这点经常被忽略
因为“算力不足”更直观,也更容易变成营销语言。但工程上真正应该问的是:
- 数据是连续的吗
- 访问是否可预测
- 是否发生了过多 host-device copy
- kernel 之间是否在频繁搬运中间结果
这些问题比“换更强的 GPU”更接近真实瓶颈。我更愿意先去确认数据布局和 copy 路径,而不是立刻改模型结构。
一个判断原则
如果优化计算逻辑几乎没有改善,但减少数据布局转换或减少 copy 明显提升吞吐,那么瓶颈大概率根本不在 compute。这个判断在做 kernel、做推理系统、甚至做分布式量子模拟时都很常见。
工程上的结论
当我看一个系统慢时,通常不会先问“模型大不大”,而会先问:
- 数据怎么走
- 走了几次
- 能不能更早裁剪
- 能不能在同一设备上完成更多步骤
理解内存墙,比盲目堆算力更接近系统优化的核心。