Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将循环转化为算术加速函数 我在路上优化一个应该给我“下一步”的功能。到目前为止,我得到的是 int fun(int a){ const int k = ...; for(;test_value(a++) != k;); return a; }_C_Optimization_Pipeline_Branch Prediction - Fatal编程技术网

将循环转化为算术加速函数 我在路上优化一个应该给我“下一步”的功能。到目前为止,我得到的是 int fun(int a){ const int k = ...; for(;test_value(a++) != k;); return a; }

将循环转化为算术加速函数 我在路上优化一个应该给我“下一步”的功能。到目前为止,我得到的是 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)

这是一种快速而肮脏的方法来测试我的算法是否真的有效,但现在我担心循环会在每次迭代时进行分支测试(如果不是的话,编译器在幕后处理的非常好?)。让我们假设,任何a完成测试的概率最多为1/5,最坏情况为百万分之一,但测试值仅为一两个时钟周期。有什么系统的方法可以帮助我的编译器用算术来交换所有的分支以更好地利用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\u值的求值


与原始代码一样,这假设在某个点上会找到匹配项。

您不认为这取决于
test\u value
是什么?这是一个只需几个周期就可以执行的函数,没有任何分支风险。可能存在于现代机器上。好主意,帮我找到了解决方案。