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,我想知道目前是否有这样的方法.请注意,它说最好的转换是不会发生的转换,但我需要它,所以这是不可能的.
如果您的目标是通用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.