【问题标题】:Turning loop into arithmetics to speed up function将循环变成算术以加速功能
【发布时间】:2016-07-30 19:18:35
【问题描述】:

您好,我正在优化一个应该给我“下一个”东西的功能。到目前为止,我得到的是

  int fun(int a){
    const int k = ...;
    for(;test_value(a++) != k;);
    return a;
   }

这是一种快速而肮脏的方法来测试我的算法是否真的有效,但现在我担心循环会在每次迭代时对分支进行测试(如果不是编译器非常擅长在幕后处理它?) .让我们说任何 a 满足测试的机会最多为 1/5,最坏的情况是百万分之一,但 test_value 只是一个或两个时钟周期。有没有一些系统的方法可以帮助我的编译器用算术交换所有分支,以更好地利用 CPU 管道?

【问题讨论】:

  • 你不认为这取决于test_value 是什么?
  • 这是一个应该在几个周期内执行的函数,没有任何分支风险。可能作为现代机器上的 SSE 指令存在。

标签: c optimization pipeline branch-prediction


【解决方案1】:

你可以稍微“展开”你的循环,比如:

int nomatch = 1;
while( nomatch ){
    nomatch   = (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
}

这将产生更少的迭代,并且一旦找到匹配项,短路将阻止test_value 的评估。

与您的原始代码一样,这假设在某个时候会找到匹配项。

【讨论】:

  • 好主意,帮我找到了解决办法。
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2020-04-17
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多