c - 将循环转化为算术以加速函数

标签 c optimization pipeline branch-prediction

嗨,我正在优化一个应该为我提供“下一个”功能的函数。到目前为止我得到的是

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

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

最佳答案

您可以稍微“展开”循环,例如:

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 进行评估。

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

关于c - 将循环转化为算术以加速函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36518021/

相关文章:

c++ - 来自 stdint.h 的快速类型的溢出行为

c - 使用结构数组中的字符串进行选择排序

c - 我是否必须从每个初始化的字符串中释放内存?

c++ - 在硬件级别使用 ForwardIterator 与 BidirectionalIterator 相比有何作用?

bash - 将 stdout 通过管道传输到 Perl 时,如何让它打印换行符?

Azure DevOps CICD gitlab 集成

c - 如何使用指针更改双链表中的2个节点? C

Python列表元素与转换为元组以进行字符串格式化

javascript - 在node.js中运行的js文件中的%GetOptimizationStatus函数是什么

python - 如何从 sklearn 中的 ColumnTransformer/Pipeline 中排除特定列?