阅读相关文献后,有大量证据表明,在英特尔处理器上使用标准的C或C++强制类型转换将浮点数转换为整数非常缓慢。为了符合ANSI / ISO规范,英特尔CPU需要执行大量指令,包括需要切换FPU硬件的舍入模式。
有许多解决方法在各种文档中描述,但最清晰和最通用的方法似乎是在C99和C++ 0x标准中添加的lrint()函数调用。许多文档说,启用优化时编译器应该内联展开这些函数,从而产生比传统类型转换或函数调用更快的代码。
我甚至找到了有关gcc特性跟踪包以将此内联扩展添加到gcc优化器的参考资料,但在我的性能测试中,我无法使其正常工作。所有尝试都显示lrint性能比简单的C或C++风格强制类型转换要慢得多。检查编译器的汇编输出和反汇编编译的对象总是显示对外部lrint()或lrintf()函数的显式调用。
我正在使用的gcc版本是4.4.3和4.6.1,并且我已经尝试了许多针对32位和64位x86目标的标志组合,包括显式启用SSE的选项。
如何让gcc内联展开lrint并为我提供快速转换?
-fno-math-errno
吗?你还应该考虑使用-ffast-math
,但如果你依赖于特定的浮点语义,这并不总是一个选项... - Christoph