假设我有两个长度相同float
的{{1}}数组:
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
获取值。有没有办法让我更有效率?
答案 0 :(得分:6)
除非你不幸的是a和b都映射到同一个缓存行,否则处理器几乎会一直充满其获取管道。数据非局部性和跨步可能是较大的方形阵列中的大问题,但在这里我认为你几乎不用担心。
如果交错a和b值,则两个浮点数都适合64位计算机上的单个提取,这可能有所帮助(尽管内存对齐问题会使此体系结构依赖。)