有没有办法计算标量产品,同时保持缓存局部性?

时间:2012-07-09 04:09:06

标签: c caching numerical

假设我有两个长度相同float的{​​{1}}数组:

n

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

float *a, *b;
int n;

但是从数据位置的角度来看,这很糟糕,特别是如果int i; float result=0; for (i=0;i<n;i++) result += a[i]*b[i]; 很大或者na在内存中相距很远。在每次迭代中,我们交替从ba获取值。有没有办法让我更有效率?

1 个答案:

答案 0 :(得分:6)

除非你不幸的是a和b都映射到同一个缓存行,否则处理器几乎会一直充满其获取管道。数据非局部性和跨步可能是较大的方形阵列中的大问题,但在这里我认为你几乎不用担心。

如果交错a和b值,则两个浮点数都适合64位计算机上的单个提取,这可能有所帮助(尽管内存对齐问题会使此体系结构依赖。)