【问题标题】:Can 2 small loops be faster than a big one?2个小循环可以比一个大循环快吗?
【发布时间】:2015-12-17 05:48:42
【问题描述】:

我在看这个视频“我们是怎么到这里来的?”机械同情的马丁·汤普森(Martin Thompson)。 (http://m.youtube.com/watch?v=oxjT7veKi9c)

他声称要利用 L0 缓存,有时最好有 2 个小循环而不是一个大循环,即使我们可能要通过同一个列表两次。

有可能吗?无论如何要创建一个带有测量的简单示例代码来演示这一点?

【问题讨论】:

标签: performance loops cpu-cache


【解决方案1】:

简单示例:

double sum1 = 0, sum2 = 0;
for (i = n; --i >= 0;){
  sum1 += a[i];
  sum2 += b[i];
}

反对:

double sum1 = 0, sum2 = 0;
for (i = n; --i >= 0;){
  sum1 += a[i];
}
for (i = n; --i >= 0;){
  sum2 += b[i];
}

在第一个示例中,编译器必须生成代码以在索引a[i]b[i] 之间“切换上下文”,并跟踪添加的位置。 如果ab 很复杂,编译器可能无法在寄存器中保存对它们的引用。 结果可能是这种“上下文切换”,因为它必须在每次迭代中完成,比额外循环的成本花费更多的指令周期。 (展开后更是如此。)

这还是没有考虑缓存问题。

【讨论】:

    【解决方案2】:

    “有时”,也许吧。如果可以将循环体拆分为多个部分,而开销不超过执行指令的总数,那么无论是在两个小循环中还是在一个大循环中,都可能几乎相同。在遍历输入两次时,数据缓存无论如何都会有所帮助。

    但我怀疑这个技巧是否真的有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2011-02-12
      相关资源
      最近更新 更多