繁体   English   中英

32B块,连续和不连续的内存访问

[英]32B chunks, contiguous and non-contiguous memory accesses

我用C ++编写了一个矩阵矩阵(32位浮点数)乘法函数,该函数使用用于大型矩阵(8192x8192)的内在函数,每次读取和写入操作的最小数据大小为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的数据。

拥有一个连续的缓冲区可能会为您提供更好的性能(至少,这并不差!)。

性能差异有多大取决于许多因素(当然,如果您分配一堆32字节的块,您很可能会获得“紧密在一起”的内存块,因此缓存优势仍然会最糟糕的情况是,如果每个块都位于不同的4KB内存段中,但是如果每个块之间只有几个字节的“空白空间”,那可就不算什么了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM