我试图在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。
答案 0 :(得分:2)
使用C ++ std命名空间可能导致编译器不使用内在函数。尝试从std::
,sqrt
和pow
来电中删除memset
。
#pragma intrinsic
的MSDN Library文档提供了一个示例,用于测试是否正在使用内在函数:使用-FAs
标志进行编译并查看生成的.asm文件。
看看调试器中的反汇编,就像你似乎已经在做的那样,也应该显示内在而不是call
。
答案 1 :(得分:1)
您正在编译机器代码而不是.NET CLR。正确?
如果编译为.NET,那么在通过JIT运行之前,代码将不会被优化。那时,.NET有自己的内在函数和其他会发生的事情。
如果您要编译本机代码,可能需要使用/arch option和/fp:fast option。