Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
假设我有两个float长度相同的 s数组n:
float
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和获取值b。有没有办法可以提高效率?
a
b
除非你很不幸 a 和 b 都映射到同一个高速缓存行,否则处理器的获取管道几乎一直都是满的。数据非局部性和跨步在更大、更方的数组中可能是个大问题,但在这里我认为你不必担心。
如果您交错 a 和 b 值,那么两个浮点数都适合 64 位机器上的一次提取,这可能会有所帮助(尽管内存对齐问题使这种架构依赖。)