在具有优化级别 3 的英特尔编译器上强制创建方法
Force creation of method on intel compiler with optimization level 3
处理通常使用优化级别 3 编译的 +95% C++ 11 代码(其余为 C),我们对其进行了概要分析,发现了一种非常耗时的方法。
玩具代码:
myClass::mainMethod()
{
// do stuff here
/ ...
// do more stuff here
/ ...
}
我们将其内部部分拆分为其他方法,以便精确测量出问题的部分,例如
myClass::mainMethod()
{
this->auxiliaryMethod1();
this->auxiliaryMethod2();
}
myClass::auxiliaryMethod1()
{
// do stuff here
// ...
}
myClass::auxiliaryMethod2()
{
// do more stuff here
// ...
}
但是(英特尔)编译器足够聪明,可以注意到这唯一的用法,并且 assemble 将它重新组合成一个方法。
除了这两个明显的其他可能解决方案,即未经优化编译(不现实)和添加其他虚假用法(浪费过程)之外,是否有一个英特尔编译器标志来指示“请将此方法显式编码到 class"???
谢谢!
正如评论所建议的那样,使用属性 noinline 进行拆分就可以了。
void __attribute__((noinline)) myClass::mainMethod()
{
this->auxiliaryMethod1();
this->auxiliaryMethod2();
}
void __attribute__((noinline)) myClass::auxiliaryMethod1()
{
// do stuff here
// ...
}
void __attribute__((noinline)) myClass::auxiliaryMethod2()
{
// do more stuff here
// ...
}
处理通常使用优化级别 3 编译的 +95% C++ 11 代码(其余为 C),我们对其进行了概要分析,发现了一种非常耗时的方法。
玩具代码:
myClass::mainMethod()
{
// do stuff here
/ ...
// do more stuff here
/ ...
}
我们将其内部部分拆分为其他方法,以便精确测量出问题的部分,例如
myClass::mainMethod()
{
this->auxiliaryMethod1();
this->auxiliaryMethod2();
}
myClass::auxiliaryMethod1()
{
// do stuff here
// ...
}
myClass::auxiliaryMethod2()
{
// do more stuff here
// ...
}
但是(英特尔)编译器足够聪明,可以注意到这唯一的用法,并且 assemble 将它重新组合成一个方法。
除了这两个明显的其他可能解决方案,即未经优化编译(不现实)和添加其他虚假用法(浪费过程)之外,是否有一个英特尔编译器标志来指示“请将此方法显式编码到 class"???
谢谢!
正如评论所建议的那样,使用属性 noinline 进行拆分就可以了。
void __attribute__((noinline)) myClass::mainMethod()
{
this->auxiliaryMethod1();
this->auxiliaryMethod2();
}
void __attribute__((noinline)) myClass::auxiliaryMethod1()
{
// do stuff here
// ...
}
void __attribute__((noinline)) myClass::auxiliaryMethod2()
{
// do more stuff here
// ...
}