1

假设我有两个float长度相同的 s数组n

float *a, *b;
int n;

我想计算他们的标量积。天真的方法是这样的:

int i;
float result=0;
for (i=0;i<n;i++)
  result += a[i]*b[i];

但是从数据局部性的角度来看,这很糟糕,尤其是在内存n很大或a相距很远的情况下。b在每次迭代中,我们交替从a和获取值b。有没有办法可以提高效率?

4

1 回答 1

6

除非你很不幸 a 和 b 都映射到同一个高速缓存行,否则处理器的获取管道几乎一直都是满的。数据非局部性和跨步在更大、更方的数组中可能是个大问题,但在这里我认为你不必担心。

如果您交错 a 和 b 值,那么两个浮点数都适合 64 位机器上的一次提取,这可能会有所帮助(尽管内存对齐问题使这种架构依赖。)

于 2012-07-09T04:28:29.543 回答