我正在尝试优化 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”来替换 std 版本“call __CIsqrt()”。遗憾的是,就我而言,内在版本慢了 5%。

非常感谢 Zan Lynx 和 mch。

有帮助吗?

解决方案

正在编译成机器代码,而不是.NET CLR。正确?

如果编译到.NET然后直到通过JIT运行该代码将不被优化。在这一点上.NET拥有自己的内在和其他的事情会发生。

如果您正在编译为机器码,您可能希望与玩/拱选项 / FP:快速选项

其他提示

C++ std命名空间的使用 可能 导致编译器不使用内在函数。尝试删除 std:: 从你的 sqrt, pow, , 和 memset 来电。

MSDN 库文档 #pragma intrinsic 提供了一个测试内部函数是否真正被使用的示例:编译与 -FAs 标记并查看生成的 .asm 文件。

查看调试器中的反汇编,正如您似乎已经在做的那样,还应该显示内在而不是 call.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top