我有调用很多的代码
int myNumber = (int)(floatNumber);
这总共占用了我大约 10% 的 CPU 时间(根据分析器)。虽然我可以就这样,但我想知道是否有更快的选择,所以我尝试四处搜索,并偶然发现
http://devmaster.net/forums/topic/7804-fast-int-float-conversion-routines/ http://devmaster.net/forums/topic/7804-fast-int-float-conversion-routines/
http://stereopsis.com/FPU.html http://stereopsis.com/FPU.html
我尝试实现那里给出的 Real2Int() 函数,但它给出了错误的结果,并且运行速度较慢。现在我想知道,是否有更快的实现将双精度/浮点值转换为整数,或者 SSE2 版本是否尽可能快?我发现的页面可以追溯到很久以前,所以它可能只是过时了,而较新的 STL 在这方面速度更快。
当前的实现是:
013B1030 call _ftol2_sse (13B19A0h)
013B19A0 cmp dword ptr [___sse2_available (13B3378h)],0
013B19A7 je _ftol2 (13B19D6h)
013B19A9 push ebp
013B19AA mov ebp,esp
013B19AC sub esp,8
013B19AF and esp,0FFFFFFF8h
013B19B2 fstp qword ptr [esp]
013B19B5 cvttsd2si eax,mmword ptr [esp]
013B19BA leave
013B19BB ret
我发现的相关问题:
ARM 上的快速浮点到整数转换和浮点精度 (iPhone 3GS/4) https://stackoverflow.com/questions/3483670/fast-float-to-int-conversion-and-floating-point-precision-on-arm-iphone-3gs-4
在 x86 上将 float 转换为 int 的最快方法是什么 https://stackoverflow.com/questions/78619/what-is-the-fastest-way-to-convert-float-to-int-on-x86
由于两者都很旧,或者都是基于 ARM 的,我想知道当前是否有方法可以做到这一点。请注意,它说最好的转换是不会发生的转换,但我需要它,所以这是不可能的。
如果您的目标是通用 x86 硬件,则很难击败它。运行时不确定目标机器是否具有 SSE 单元。如果确实如此,它可以执行 x64 编译器的操作并内联cvttss2si
操作码。但由于运行时必须检查 SSE 单元是否可用,因此您只能使用当前的实现。这就是执行的内容ftol2_sse
做。更重要的是,它会传递 x87 寄存器中的值,然后在 SSE 单元可用时将其传输到 SSE 寄存器。
您可以告诉 x86 编译器以具有 SSE 单元的机器为目标。那么编译器确实会发出一个简单的cvttss2si
内联操作码。这将是您能达到的最快速度。但如果你在旧机器上运行代码,那么它就会失败。也许您可以提供两种版本,一种适用于具有 SSE 的机器,另一种适用于没有 SSE 的机器。
这不会给你带来太多好处。这只是为了避免所有的开销ftol2_sse
这发生在你真正到达之前cvttss2si
完成这项工作的操作码。
要从 IDE 更改编译器设置,请使用项目 > 属性 > 配置属性 > C/C++ > 代码生成 > 启用增强指令集。在命令行上它是 /arch:SSE 或 /arch:SSE2。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)