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

lin*_*lof 1 c caching numerical

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

float *a, *b;
int n;
Run Code Online (Sandbox Code Playgroud)

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

int i;
float result=0;
for (i=0;i<n;i++)
  result += a[i]*b[i];
Run Code Online (Sandbox Code Playgroud)

但是从数据局部的角度来看,这是非常糟糕的,特别是如果n它很大,或者如果a并且b在内存中相距甚远.在每次迭代中,我们交替从a和获取值b.有没有办法让我更有效率?

Dav*_*d G 6

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

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