2012-07-09 46 views
1

假设我有float小号长度相同n的两个数组:有没有一种方法可以在保持缓存局部性的同时计算标量产品?

float *a, *b; 
int n; 

我想计算其标产品。天真的方法是这样的:

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

但从数据局部性点,这是可怕的,尤其是如果n较大,或者如果ab相距甚远在内存中。在每次迭代中,我们交替从ab获取值。有什么办法可以让这个效率更高?

+4

你只是通过每个阵列进行单次连续传递。两步很好。所以我怀疑你可以做得更好 - 除非你有一个外部循环。 – Mysticial 2012-07-09 04:10:40

回答

6

除非您足够不幸地将a和b映射到相同的缓存行,否则处理器几乎将所有的读取管道都占满。数据非局部性和步幅可能是较大,方形阵列中的大问题,但在这里我认为你几乎没有必要担心。

如果您交错a和b的值,然后两个花车将适合在单个取一个64位的机器上,这可能有助于问题(虽然内存对齐问题,使这个体系结构相关的。)

相关问题