我在C ++中使用内在函数为大型矩阵(8192x8192)编写了一个矩阵 - 矩阵(32位浮点数)乘法函数,每次读写操作的最小数据大小为32B。
我会将算法更改为阻塞算法,使其将8x8块读入8个YMM寄存器,并在目标块行(另一个YMM寄存器作为目标)上进行乘法,最后将8个结果累加到另一个寄存器中并存入存储器中。
问题:从非连续地址获取32B块是否重要?如果它如下所示,它是否会大幅改变性能:
Read 32B from p, compute, read 32B from p+8192 (this is next row of block), compute,
Read and compute until all 8 rows are done, write 32B to target matrix row p3
而不是
Read 32B from p, compute, read 32B from p+32, compute, read 32B from p+64......
我的意思是内存的读取速度,而不是缓存。
注意:我使用fx8150并且我不知道它是否可以在单次操作中读取超过32B。
答案 0 :(得分:1)
它可能为你提供更好的性能来拥有一个连续的缓冲区(至少,它不会更糟!)。
性能差异有多大将取决于大量因素(当然,如果你分配一堆32字节块,你很可能会得到“紧密”的内存块,所以缓存最坏的情况是,如果每个块都在不同的4KB内存段中,但如果每个块之间有一些“空白”字节,那就不是那么大了。
与许多其他性能问题一样,它与代码的确切细节,内存类型,处理器类型等有很大关系。真正找到的唯一方法是,您需要对不同的选项进行基准测试......