【问题标题】:Which has better memory access ? (C++) [duplicate]哪个有更好的内存访问? (C++)[重复]
【发布时间】:2017-05-21 04:13:45
【问题描述】:

哪个版本更高效,为什么? 似乎两者都进行相同的计算。我唯一能想到的是,如果编译器认识到 (a) j 不会改变值并且不必一遍又一遍地计算它。 任何输入都会很棒!

#define M /* some mildly large number */
double a[M*M], x[M], c[M];
int i, j;

(a) First version
for (j = 0; j < M; j++)
    for (i = 0; i < M; i++)
        c[j] += a[i+j*M]*x[i];

(b) Second version
for (i = 0; i < M; i++)
    for (j = 0; j < M; j++)
        c[j] += a[i+j*M]*x[i];

【问题讨论】:

标签: c++


【解决方案1】:

这是关于内存访问模式而不是计算效率。一般来说,(a) 更快,因为它以单位步长访问内存,这比 (b) 的缓存效率高得多,后者的步长为 M。在 (a) 的情况下,每个缓存行都被充分利用,而在 (b) 的情况下,每个缓存行在被驱逐之前可能只使用一个数组元素,

话虽如此,一些编译器可以执行循环重新排序优化,因此在实践中,如果发生这种情况,您可能看不到任何差异。与往常一样,您应该对代码进行基准测试/分析,而不仅仅是猜测。

【讨论】:

  • 我从来没有在单位大步前行过。我现在正在维基百科上阅读它。谢谢你的回答:)
  • “单位步幅”实际上只是在这种情况下表示“顺序地”或“连续地”。
  • @Samu:字面意思是“一次一步”。这就像你走在超市的过道上按顺序拿起物品,而不是从货架 1 拿东西,然后走下来从货架 10 拿东西,然后走回货架 2,然后走到货架 11……类比,您的计算机实际上从货架 1-10 中挑选了所有东西,假设您可以在不走任何路的情况下挑选您想要的任何东西!现在它必须从 1-10 架子上取走所有东西,然后从 11-20 架子上取走所有东西,然后再从 1-10 号架子上取走所有东西……
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 2020-06-18
  • 2018-09-26
  • 2015-08-04
  • 2014-08-01
  • 1970-01-01
  • 2016-10-08
  • 2014-01-27
相关资源
最近更新 更多