我是否更愿意使用一次内存访问来进行读写?

Rhy*_*ich 8 memory optimization performance matrix blas

众所周知,以大步之一的方式访问内存最适合性能.

在哪些情况下

  • 我必须访问一个内存区域才能阅读,
  • 我必须访问另一个地区进行写作,并且
  • 我只能以大步的方式访问这两个地区中的一个,

我应该更喜欢阅读一个步骤还是写一个步幅?

一个简单,具体的例子是像BLAS一样的复制和置换操作y := P x.置换矩阵P完全由一些置换向量定义q(i).它具有相应的逆置换矢量qinv(i).可以将所需的循环编码y[qinv(i)] = x[i]y[i]=x[q(i)]前者从x步幅1 读取的位置,后者写入y步幅1.

理想情况下,人们总是可以编码两种可能性,在代表性条件下对其进行分析,并选择更快的版本 假设您只能编写一个版本 - 根据现代内存架构的行为,您总是期望哪种访问模式更快?在线程环境中工作会改变您的响应吗?

Evg*_*uev 6

您称为“跨步写”(y[i]=x[q(i)])的访问模式通常更快。

如果缓存了内存,并且您的数据小于缓存行,则此访问模式需要的内存带宽更少。

现代处理器通常具有比存储单元更多的负载执行单元。下一个名为Haswell的英特尔架构仅支持GATHER指令,而SCATTER尚未制定计划。所有这一切也都支持“大步向前”模式。

在线程环境中工作不会改变这一点。