我试图在 VS2010 中优化我的锻炼应用程序。基本上我在核心循环中有几个 sqrt、pow 和 memset。更具体地说,这就是我所做的:
// in a cpp file ...
#include <cmath>
#pragma intrinsic(sqrt, pow, memset)
void Simulator::calculate()
{
for( int i=0; i<NUM; i++ )
{
...
float len = std::sqrt(lenSq);
distrib[0] = std::pow(baseVal, expVal);
...
clearQuad(i); // invokes memset
}
}
构建后,反汇编显示,例如,sqrt 调用仍编译为“call _CIsqrt(0x####)”,无论是否启用 /Oi 标志,都没有任何变化。
谁能解释一下我如何启用内在版本以及如何通过反汇编代码验证它? (我还在项目设置中启用了 /O2。)
谢谢
编辑: 通过添加 /fp:fast 解决了问题。以 sqrt 为例,内部版本使用单个“fsqrt”来替换标准版本“call __CIsqrt()”。可悲的是,就我而言,内在版本慢了 5%。
非常感谢 Zan Lynx 和 mch。