假设我有两个相同长度 n
的 float
数组:
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
中获取值。有什么方法可以提高效率吗?
最佳答案
除非你很不幸 a 和 b 都映射到同一个缓存行,否则处理器几乎一直都在获取管道。数据非局部性和步幅在更大、更方形的阵列中可能是大问题,但在这里我认为您无需担心。
如果您交错 a 和 b 值,那么这两个 float 将适合 64 位机器上的单个提取,这可能会有所帮助(尽管内存对齐问题使此体系结构相关。)
关于c - 有没有办法在保持缓存局部性的同时计算标量积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11388979/