在这个问题中,我将关注 Visual Studio 2012 和 GCC 4.7
一方面,配置文件引导编译通过在运行时检测代码,然后在第二次编译期间使用此信息来优化分支预测。另一方面,许多编译器提供扩展来提示编译器最有可能采用哪个分支:GCC 提供__builtin_expect
,Visual Studio 提供__assume
.
有没有办法提取(任一编译器的)配置文件引导信息,以便能够使用两个编译器扩展重写代码?目标是为愿意重新编译他们自己的二进制版本的人们提供“优化”的源代码。
在这个问题中,我将关注 Visual Studio 2012 和 GCC 4.7
一方面,配置文件引导编译通过在运行时检测代码,然后在第二次编译期间使用此信息来优化分支预测。另一方面,许多编译器提供扩展来提示编译器最有可能采用哪个分支:GCC 提供__builtin_expect
,Visual Studio 提供__assume
.
有没有办法提取(任一编译器的)配置文件引导信息,以便能够使用两个编译器扩展重写代码?目标是为愿意重新编译他们自己的二进制版本的人们提供“优化”的源代码。
您可以使用 提取此信息gcov
。
编译源,如:
gcc -ftest-coverage -fprofile-arcs x.c
运行可执行文件
./a.out
gcov -b
在源文件上运行。该选项-b
告诉它生成分支概率信息。
gcov -b x.c
gcov
将创建包含所需信息的文本文件x.c.gcov
,这是一个示例:
-: 5:int
function foo called 1 returned 100% blocks executed 100%
1: 6:foo (unsigned int N)
-: 7:{
1: 8: int i, s = 0;
-: 9:
10001: 10: for (i = 0; i < N; ++i)
branch 0 taken 99%
branch 1 taken 1% (fallthrough)
-: 11: {
10000: 12: if ((rand () % 100) < 30)
call 0 returned 100%
branch 1 taken 30% (fallthrough)
branch 2 taken 70%
3027: 13: s++;
-: 14: else
6973: 15: s--;
-: 16: }
-: 17:
1: 18: return s;
-: 19:}