首页 / 知识
关于C#:在x86上将float转换为int的最快方法是什么
2023-04-16 07:28:00

What is the fastest way to convert float to int on x86在x86 CPU上将浮点数转换为int的最快方法是什么。 优选在C或组件中(可以在C中内嵌)以获得以下任何组合:
我正在寻找一些比让编译器更快的技术。 这取决于您是否需要截断转换或舍入转换以及精确度。默认情况下,当您从float转到int时,C将执行截断转换。有FPU指令可以做到这一点,但它不是ANSI C转换,并且使用它有很多警告(例如了解FPU舍入状态)。由于你的问题的答案非常复杂,并且取决于你没有表达的一些变量,我推荐这篇文章: http://www.stereopsis.com/FPU.html 使用SSE的打包转换是迄今为止最快的方法,因为您可以在同一指令中转换多个值。 ffmpeg有很多组装(主要用于将音频的解码输出转换为整数样本);检查它的一些例子。 普通x86 / x87代码的常用技巧是强制浮点的尾数部分表示int。随后是32位版本。 64位版本是类比的。上面发布的Lua版本更快,但依赖于截断double到32位结果,因此它需要将x87单位设置为双精度,并且不能适用于双到64位int转换。 这个代码的好处是它对于符合IEEE 754的所有平台都是完全可移植的,唯一的假设是将浮点舍入模式设置为最接近。注意:便携式的编译和工作。如果有的话,x86以外的平台通常不会从这种技术中受益很多。
如果可以保证运行代码的CPU与SSE3兼容(即使是Pentium 5,JBB),也可以允许编译器使用其FISTTP指令(即-msse3用于gcc)。它似乎做了应该总是这样做的事情: http://software.intel.com/en-us/articles/how-to-implement-the-fisttp-streaming-simd-extensions-3-instruction/ 请注意,FISTTP与FISTP不同(它有问题,导致速度缓慢)。它是SSE3的一部分,但实际上是(唯一的)X87端的改进。 除此之外,X86 CPU可能会很好地进行转换。 :) 支持SSE3的处理器
Lua代码库有以下代码片段(请访问www.lua.org查看src / luaconf.h)。
哦,
在汇编中有一条指令将浮点转换为int:使用FISTP指令。它将浮点堆栈中的值弹出,将其转换为整数,然后将其存储在指定的地址处。我认为不会有更快的方式(除非你使用像我不熟悉的MMX或SSE这样的扩展指令集)。 另一条指令FIST将值保留在FP堆栈上,但我不确定它是否适用于四字大小的目的地。
我假设需要截断,就像在"C"中写入 如果你有SSE3,你可以使用:
或者,使用SSE2(或在x64中,内联汇编可能不可用),您可以使用几乎同样快:
在较旧的计算机上,可以选择手动设置舍入模式并使用普通的
请注意,内联汇编仅适用于Microsoft的Visual Studio编译器(也许是Borland),它必须重写为GNU程序集才能使用gcc进行编译。 其他舍入模式可以通过不同的SSE2内在函数或通过手动将FPU控制字设置为不同的舍入模式来实现。
由于MS在X64中使我们脱离内联汇编并迫使我们使用内在函数,因此我查找了要使用的内容。 MSDN doc给出 这个例子有效,但效率非常低,使用2个双倍的未对齐加载,我们只需要一个加载,因此摆脱了额外的对齐要求。然后产生了许多不必要的负载和重新加载,但它们可以如下消除:
结果:
可以在没有内联汇编的情况下设置舍入模式,例如,
舍入到最近的是默认值(无论如何)。
我想,是否要在每次通话中设置舍入模式或假设它将被恢复(第三方库)的问题必须通过经验来回答。 并且,不,这不会在32位中工作,因此请继续使用FISTP指令:
如果你真的关心它的速度,请确保你的编译器正在生成FIST指令。在MSVC中,您可以使用/ QIfist执行此操作,请参阅此MSDN概述 您还可以考虑使用SSE内在函数为您完成工作,请参阅英特尔的这篇文章:http://softwarecommunity.intel.com/articles/eng/2076.htm 通常,您可以信任编译器高效且正确。通常可以通过为编译器中已存在的东西滚动自己的函数来获得任何东西。 |
最新内容
相关内容
linuxps组合命令?
linuxps组合命令?,系统,工作,信息,命令,地址,基础,进程,标准,状态,软件,Linux系统中的ps进程查看命令使用实例集锦首先打开xshell软件,连接上lilinux实用组合命令?
linux实用组合命令?,工作,系统,命令,管理,网络,基础,信息,目录,用户,口令,新手必须掌握的linux命令1、linux常用命令: pwd命令 该命令的英文解linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux组合命令别名?
linux组合命令别名?,系统,别名,地方,环境,工作,新增,命令,终端,文件,环境变量,linux系统怎样设置命令别名1、可将设置别名的命令写进启动文件linux安装组件包命令?
linux安装组件包命令?,软件,官网,服务,系统,工具,发行,工作,信息,名称,命令,Linux安装软件的命令是什么?1、最后依次输入以下命令:./configurelinux进入编译器命令?
linux进入编译器命令?,系统,代码,环境,网上,基础,工作,工具,信息,时间,地址,linux终端下如何进行C语言编译1、在Linux下面,如果要编译一个C语言linux命令输入方法?
linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,linux终端输入~怎么弄中间在电脑上打开需要的Word文件进入。进入到文Python中什么是反射?使用方法有哪
Python中什么是反射?使用方法有哪些?,信息,培训,状态,术语,检测,反射,属性,对象,字符串,方法,反射这个术语在很多语言中都存在,并且存在大量的Python中有哪些方法可以解压文件?
Python中有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大Python列表类型list合并有哪些方法
Python列表类型list合并有哪些方法?,培训,方法,列表,可能会,数组,切片,下文,字符串,数据类型,请看,在Python编程语言中,有各种数据类型,比如字符零基础学习Python的四种方法
零基础学习Python的四种方法,基础,代码,基础知识,培训,发展,时间,知识,书籍,初学者,练习,近年来,随着移动互联网的发展,对Python人才的需求越来如何在Python中定义类方法和修改类
如何在Python中定义类方法和修改类属性?,代码,方法,培训,对象,实例,定义,结果,示例,赋值,属性,Python中的类还可定义使用@classmethod修饰的类