将循环转化为算术加速函数 我在路上优化一个应该给我“下一步”的功能。到目前为止,我得到的是 int fun(int a){ const int k = ...; for(;test_value(a++) != k;); return a; }
这是一种快速而肮脏的方法来测试我的算法是否真的有效,但现在我担心循环会在每次迭代时进行分支测试(如果不是的话,编译器在幕后处理的非常好?)。让我们假设,任何a完成测试的概率最多为1/5,最坏情况为百万分之一,但测试值仅为一两个时钟周期。有什么系统的方法可以帮助我的编译器用算术来交换所有的分支以更好地利用CPU管道吗?你可以稍微“展开”你的循环,比如:将循环转化为算术加速函数 我在路上优化一个应该给我“下一步”的功能。到目前为止,我得到的是 int fun(int a){ const int k = ...; for(;test_value(a++) != k;); return a; },c,optimization,pipeline,branch-prediction,C,Optimization,Pipeline,Branch Prediction,这是一种快速而肮脏的方法来测试我的算法是否真的有效,但现在我担心循环会在每次迭代时进行分支测试(如果不是的话,编译器在幕后处理的非常好?)。让我们假设,任何a完成测试的概率最多为1/5,最坏情况为百万分之一,但测试值仅为一两个时钟周期。有什么系统的方法可以帮助我的编译器用算术来交换所有的分支以更好地利用CPU管道吗?你可以稍微“展开”你的循环,比如: int nomatch = 1; while( nomatch ){ nomatch = (test_value(a++) != k)
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\u值的求值
与原始代码一样,这假设在某个点上会找到匹配项。您不认为这取决于test\u value
是什么?这是一个只需几个周期就可以执行的函数,没有任何分支风险。可能存在于现代机器上。好主意,帮我找到了解决方案。