由于程序运行时间测量的不准确性,虽然测量时间时已经采取了运行多次取中位值的方法,我不保证能够重现结果。
下图是使用dgemm()矩阵乘法用时计算所得CPU浮点计算能力(Gflops,y轴,越大越好)随运行时间(x轴)变化的曲线。可见1950x(3.4G,3.75G最上面红蓝黑三条)的波动是非常剧烈的,偶尔还会来个尖峰或者波谷,最上面的红线要稳定些应该是因为排除了4K alisaing的影响。倒数第二的红线是笔记本低压U i7-8550U(外接电源),短暂睿频结束后很快就稳定到110Gflops的位置。

下图是AMD Thread Ripper 1950x(后面简写为TR 1950x)在不同配置下的Gflops结果,可见正确的配置是很重要的。后面的测试中由于失误OpenBLAS在TR 1950x下运行的是HASWELL代码,这可能会导致运行时间变长。

所有文章都告诉我们要对齐,struct要对齐 padding,栈要对齐,数据要对齐。但没人告诉你过度的对齐会带来性能损失,严格的说不是对齐,而是2整数次幂强迫症。为充分利用cache大量数值算法采用的分块的方法,分块内部的kernel经常会同时对相差若干lda的数据进行操作(SSE,AVX指令),如果lda恰好为某个2的整数次幂左右(这与cache有关,一般为4K字节),那么会映射到同一个cache地

本文探讨了矩阵乘法在不同环境下的性能表现,重点关注了4K aliasing对分块算法的影响。通过实验,发现在某些情况下,对齐和 lda(领先维度)的选取直接影响了计算效率。Intel 和 AMD 架构上都存在因4K间隔写后读导致的性能问题,而OpenBLAS和MKL等库在lda和ldc的选择上表现各异。文章建议库开发者明确说明lapacke函数性能与输入数据布局的关系,以帮助用户优化计算效率。

1万+

被折叠的 条评论
为什么被折叠?



