我试图理解为什么用N=63, 127, 255, 511, 1023, 2047
的方形NxN大小的矩阵进行矩阵乘法的问题
比N=64, 128, 256, 512, 1024, 2048.
这是我到目前为止的尝试:
我已经运行了perf指令,它给出了我有多少次命中和命中的百分比以及访问主内存需要多少次。
一般来说,在N=2^k
的情况下,乘法比我N=2^k-1
时慢,所以我的GFLOPS更少。
我想也许它与块大小和所有内容存储在缓存中的集合有关,但我不能再进一步了。我的代码是用c实现的,如果这与此有关(我认为它没有& #39; t)并且cpu是Intel Xeon Processor E5620
。任何帮助将不胜感激
答案 0 :(得分:2)
如果矩阵行之间的距离是2的幂,则当您访问每个叉积的所有行中的相同列时,执行内积计算单个单元格值时缓存冲突的可能性非常高。高速缓存通常使用相同的低位地址位保持2,4或8个不同的行。在64x64矩阵上,可能会发生冲突。有多大可能取决于缓存大小,缓存架构和用于矩阵乘法的实际算法。
你应该发布代码,这里可能有很好的想法来提高效率。
您可以通过切片算法来提高性能:一次使用行的子集计算交叉产品,并在所有子集上累计结果。而不是3个嵌套的for循环,你将有4个嵌套for循环,具有相同的乘法总数,但顺序不同。