0

我在 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。

4

1 回答 1

1

拥有一个连续的缓冲区可能会给您带来更好的性能(至少,它不会更糟!)。

性能差异有多大取决于很多因素(当然,如果你分配一堆 32 字节的块,你很可能会得到“紧密相连”的内存块,所以缓存的好处仍然会在那里。最坏的情况是,如果每个块都在不同的 4KB 内存段中,但是如果每个块之间有几个字节的“空白空间”,那没什么大不了的。

像许多其他性能问题一样,这与代码功能、内存类型、处理器类型等的确切细节有很大关系。真正找出答案的唯一方法是,您需要对不同的选项进行基准测试......

于 2013-07-27T20:39:09.020 回答