【问题标题】:Is there a way to compute scalar products while keeping cache locality?有没有办法在保持缓存局部性的同时计算标量产品?
【发布时间】:2012-07-09 04:09:05
【问题描述】:

假设我有两个相同长度的floats 数组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 获取值。有什么方法可以提高效率吗?

【问题讨论】:

  • 您只需对每个数组进行一次顺序传递。两步就好了。所以我怀疑你能做得更好——除非你当然有一个外循环。

标签: c caching numerical


【解决方案1】:

除非你很不幸 a 和 b 都映射到同一个高速缓存行,否则处理器的获取管道几乎一直都是满的。数据非局部性和跨步在更大、更平方的数组中可能是个大问题,但在这里我认为您不必担心。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2020-03-17
    • 2020-11-17
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多