众所周知,以一种跨步方式访问内存最有利于性能。
在以下情况下
- 我必须访问一个内存区域才能阅读,
- 我必须访问另一个区域进行写作,并且
- 我只能以一种大步的方式访问这两个区域中的一个,
我应该更喜欢阅读步幅一还是写步幅一?
一个简单而具体的示例是类似 BLAS 的复制和置换操作,例如y := P x
. 置换矩阵P
完全由某个置换向量定义q(i)
。它有一个对应的逆置换向量qinv(i)
。可以将所需的循环编码为y[qinv(i)] = x[i]
前者y[i]=x[q(i)]
从x
步幅一读取而后者写入y
步幅一的位置。
理想情况下,人们总是可以对这两种可能性进行编码,在有代表性的条件下对其进行分析,然后选择更快的版本。假设您只能编写一个版本 - 根据现代内存架构的行为,您总是期望哪种访问模式更快?在线程环境中工作会改变你的反应吗?