为何62×62矩阵乘法比64×64矩阵乘法更慢?
为什么62×62矩阵乘法比64×64的慢约10%?
在Google Colab中运行以下代码后,发现62×62矩阵间的乘法运算比64×64矩阵的乘法运算慢约10%,请问这是什么原因?
import torch import timeit a, a2 = torch.randn((62, 62)), torch.randn((62, 62)) b, b2 = torch.randn((64, 64)), torch.randn((64, 64)) def matmuln(c,d): return c.matmul(d) print(timeit.timeit(lambda: matmuln(a, a2), number=1000000)) # 13.864160071000015 print(timeit.timeit(lambda: matmuln(b, b2), number=1000000)) # 12.539578468999991
核心原因解析
- 硬件对齐与向量优化:现代CPU/GPU的SIMD单元、张量核心都是按固定块大小(如16、32、64这类2的整数次幂)设计的。64能完美适配这些硬件计算单元,运算时可充分利用向量指令的并行能力,无额外拆分或填充开销。而62不是2的幂,计算时需拆分矩阵并处理剩余非对齐部分,增加额外计算步骤与内存访问成本。
- 内存访问效率:硬件缓存系统(L1/L2/L3)按固定块大小(如64字节)读取数据。64×64矩阵内存布局规整,能更好利用缓存的空间局部性,降低缓存miss概率;62×62矩阵的内存访问会出现更多非对齐读取,缓存命中率下降,拖慢整体速度。
- 底层库的针对性优化:PyTorch的矩阵乘法依赖MKL、CuBLAS等底层库,这些库会对2的幂次大小的矩阵做专门优化,比如预编译的高效核函数、最优分块策略。对于非2的幂次矩阵,这些优化无法完全生效,只能走通用计算路径,效率自然更低。
内容的提问来源于stack exchange,提问作者Robin van Hoorn
相关产品推荐
相关产品推荐

