_ftol2_sse,有更快的选择吗?

Sin*_*rMJ 5 c++ floating-point

我有很多代码

int myNumber = (int)(floatNumber);
Run Code Online (Sandbox Code Playgroud)

总共约占我CPU时间的10%(根据分析器).虽然我可以把它留在那里,但我想知道是否有更快的选择,所以我试着四处寻找,偶然发现

http://devmaster.net/forums/topic/7804-fast-int-float-conversion-routines/ http://stereopsis.com/FPU.html

我尝试实现那里给出的Real2Int()函数,但它给我错误的结果,并且运行速度较慢.现在我想知道,是否有更快的实现将double/float值置于整数,或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  
Run Code Online (Sandbox Code Playgroud)

相关问题我发现:

ARM(iPhone 3GS/4)上的快速浮点到int转换和浮点精度

在x86上将float转换为int的最快方法是什么

由于两者都是旧的,或者基于ARM,我想知道目前是否有这样的方法.请注意,它说最好的转换是不会发生的转换,但我需要它,所以这是不可能的.

Dav*_*nan 6

如果您的目标是通用x86硬件,那将很难被击败.运行时不确定目标机器是否具有SSE单元.如果是这样,它可以执行x64编译器的操作并内联cvttss2si操作码.但由于运行时必须检查SSE单元是否可用,因此您将获得当前的实现.这就是实施的目的ftol2_sse.而且,如果SSE单元可用,它还会传递x87寄存器中的值,然后将其传输到SSE寄存器.

您可以告诉x86编译器定位具有SSE单元的计算机.然后编译器确实会发出cvttss2si内联的简单操作码.这将是你能得到的最快速度.但是如果你在旧机器上运行代码,那么它将失败.也许您可以提供两个版本,一个用于带SSE的机器,另一个用于没有SSE的机器.

这不会让你获得那么多.它只是避免ftol2_sse在你实际到达cvttss2si执行工作的操作码之前发生的所有开销.

要从IDE更改编译器设置,请使用项目>属性>配置属性> C/C++>代码生成>启用增强指令集.在命令行上,它是/ arch:SSE或/ arch:SSE2.