推文
@fireandstart · 2026-10-11 01:47
这条学习记录把矩阵乘法优化里最核心的一步讲得很清楚:很多时候,瓶颈不在乘加本身,而在数据为了计算被反复搬运。朴素写法让每个输出元素由一个线程负责,再循环读取 A 的一行和 B 的一列;相邻线程会重复取到不少相同数据,算术单元还没忙起来,显存访问就先成了成本。把 A、B 分块搬进 shared memory 后,同一块数据可以被多个输出复用,帖里说的复用 16 次正是这种数据局部性的收益。 不过 tiled kernel 也不是把 tile 做大就一定更快。线程如何协同加载、访存能否合并、同步点是否正确、每个线程占用多少寄存器,以及 shared memory 用量对 occupancy 的影响,都会改变最终表现。边界尺寸还要处理不完整 tile,避免越界读写。下一步如果能把朴素版和 tiled 版放在相同输入下测量,再按矩阵尺寸记录耗时、吞吐和误差,就能分清收益来自哪里,也能看出小矩阵何时不值得承担分块开销。 我喜欢这种从一个能运行的 baseline 开始、逐步引入复用的学习方式:公式说明算什么,profile 告诉我们时间花在哪,正确性检查确保优化没有悄悄改答案。继续做下去,GPU 编程里的线程布局、内存层级和同步就会从术语变成可观察、可验证的工程选择。
曝光 32 · 评论 0 · 点赞 0 · 书签 0