Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
CPU/编译器分支预测_C_Compiler Optimization_Cpu Architecture - Fatal编程技术网

CPU/编译器分支预测

CPU/编译器分支预测,c,compiler-optimization,cpu-architecture,C,Compiler Optimization,Cpu Architecture,在时间关键型流程中,我尽量避免引入分支,但有时并没有切实可行的方法 在这些情况下,针对特定条件的不同测试方法之间是否存在性能差异?是建议测试最可能的结果,还是没有区别?也就是说,在CPU或编译器架构中,真与假条件之间是否有不同的“权重” 例如,以下三个片段之间通常会有差异: // snippet 1: test for exception first if ( !likely_to_happen ) { foo(); } else { bar(); } // snippet 2: te

在时间关键型流程中,我尽量避免引入分支,但有时并没有切实可行的方法

在这些情况下,针对特定条件的不同测试方法之间是否存在性能差异?是建议测试最可能的结果,还是没有区别?也就是说,在CPU或编译器架构中,真与假条件之间是否有不同的“权重”

例如,以下三个片段之间通常会有差异:

// snippet 1: test for exception first
if ( !likely_to_happen ) {
  foo();
} else {
  bar();
}

// snippet 2: test for most common cases first
if ( likely_to_happen ) {
  bar();
} else {
  foo();
}

// snippet 3: test for exception in an alternative way
if ( not_likely_to_happen) {
  foo();
} else {
  bar();
}

如果可能,您应该明确地告诉编译器。再见,谢谢。我发现“\uuuu builtin\u expect”似乎是普遍推荐的解决方案。不知何故,这感觉有些笨拙,或者至少不雅观。我希望有一种通用的代码模式(如对代码流排序或对真实条件进行优先级排序等),它不涉及特定于编译器的宏。您总是可以使用不同的方式对代码进行排序,以帮助进行分支预测。然而,它们在很大程度上是特定于代码的,很难推广,例如dox总是减少分支。也就是说,你总是可以考虑分拣数据是否可以帮助,等等,你可以搜索类似C方法的东西来减少分支等,看看其他什么共性,没有一种标准的方式来把热代码和冷代码信息传递给编译器。编译器通常不会尝试使用C的布局来决定如何布局asm。相反,他们有猜测分支可能性的启发式方法。这些启发式方法通常不能做得很好,但您可以通过使用概要文件引导的优化来解决所有这些问题。e、 g.
gcc-fprofile generate-O3
,在一些常用输入上运行程序,使用
gcc-fprofile use-O3
重新编译。如果可能,您应该明确告诉编译器。再见,谢谢。我发现“\uuuu builtin\u expect”似乎是普遍推荐的解决方案。不知何故,这感觉有些笨拙,或者至少不雅观。我希望有一种通用的代码模式(如对代码流排序或对真实条件进行优先级排序等),它不涉及特定于编译器的宏。您总是可以使用不同的方式对代码进行排序,以帮助进行分支预测。然而,它们在很大程度上是特定于代码的,很难推广,例如dox总是减少分支。也就是说,你总是可以考虑分拣数据是否可以帮助,等等,你可以搜索类似C方法的东西来减少分支等,看看其他什么共性,没有一种标准的方式来把热代码和冷代码信息传递给编译器。编译器通常不会尝试使用C的布局来决定如何布局asm。相反,他们有猜测分支可能性的启发式方法。这些启发式方法通常不能做得很好,但您可以通过使用概要文件引导的优化来解决所有这些问题。e、 g.
gcc-fprofile generate-O3
,在一些常用输入上运行程序,使用
gcc-fprofile use-O3
重新编译。