GPU · 矩阵乘法实验室
同一个乘法,三种数据路径
Matrix multiplication · Three paths from inputs to outputs
跟着一行代码,看数据从全局存储走到片上,再变成输出。
程序正在执行什么Code execution
教学伪代码数据在哪里,计算在哪里Memory and computation
① HBM / Global Memory · 全局数组逻辑视图蓝:读 Aᵀ 绿:读 B 橙:当前输出
真实路径含 L2/L1;此处不模拟缓存命中
③ 寄存器 Registers · 当前线程私有
a
b
累加器 c
CUDA 核 / FMA
Aᵀ 操作数B 操作数当前 c 累加器已写回 C悬停矩阵格可查看坐标与数值
完整计算的效果对比Full-run comparison
计数口径与真实 GPU 的区别 · Model assumptions
- C = AᵀB 模式直接展示 Aᵀ:画面坐标 Aᵀ[i,k] 对应原数组 A[k,i],共享输入片 sAT 也按这一转置视图显示。这里只改变呈现与伪代码记法,不执行额外转置搬运,也不表示物理内存布局发生变化。
- 所有版本计算同一组矩阵,并实际在本页计算出 C;一次 FMA 计为 2 FLOPs。当前动画累计数由执行事件逐项累加,完整对比由对应循环结构推导。
- “全局输入读取”按线程请求的标量元素计数,不是内存事务数。仅在忽略 L1/L2 命中、访存合并和其他开销的模型中,将其乘以 4 字节近似为 FP32 的 HBM 输入流量;真实 HBM 流量需要测量。
- 三种版本都以寄存器保存累加器。第二种进一步让每线程计算 V×V 个输出;第三种还让 Block 协作加载、复用共享内存中的输入块。共享内存与硬件自动管理的缓存不是同一概念。
- 画面按 Block、线程依次展开,便于观察;真实 GPU 会并行或交错执行。一次动画步可能代表多个线程的协作加载,或 V² 次标量 FMA,步数与播放速度不代表运行时间。
- 寄存器数量只计操作数与累加器的数据槽,不含索引等临时值,也不是编译器实际分配量。教学模型省略寄存器溢出、访存事务、bank conflict、流水线重叠、Tensor Core 和边界处理;N、L、V、S 采用整除设置。共享内存加载省略中间搬运寄存器,不能据此推断使用了异步拷贝。
- 增大 V 会增加每线程寄存器需求;增大 L 或 S 会增加共享内存占用。这些资源可能限制 Occupancy,因此读取减少不等于同倍数加速。
参考:NVIDIA CUDA Best Practices · 矩阵乘法 · NVIDIA CUTLASS · 分层分块