_ftol2_sse,有更快的选择吗?

2024-04-25

我有调用很多的代码

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(使用前将#替换为@)

_ftol2_sse,有更快的选择吗? 的相关文章

随机推荐

  • 初始化 PHP 交互

    我经常发现PHP的交互模式 php a 非常有用 但如果我可以启动它并立即执行一些命令来初始化我的环境 那会更有用 比如运行自动加载器 设置一些use命名空间的快捷方式等 这是一个例子 include autoloader php use
  • Spark 数据集编码器:kryo() 与 bean()

    在 Spark 中处理数据集时 我们需要指定编码器来序列化和反序列化对象 我们可以选择使用Encoders bean Class
  • Python CTRL+C 退出解释器?

    Python 2 73 Why is it on my laptop when I hit CTRL C I can exit the interpreter and on my desktop hitting CTRL C will ma
  • 输出字符串末尾的空白不与字符串一起打印,而是与其后的下一个打印行一起打印

    我尝试打印一行 要求用户输入 获取输入 然后再次打印一些行 问题是 在我获得输入后 第一个打印行末尾的空白不是打印在该行的末尾 而是打印在第二个打印行的开头 我对 C 完全陌生 所以我不能真正尝试太多 但我尝试在没有提示用户输入的部分的情况
  • Spring消息标签javascript转义

    当我们尝试使用 spring 标签显示属性文件中的标签时 我们可以编写
  • 我可以获取标准库中定义的函数的地址吗?

    考虑以下代码 include
  • 使用 Windows.Services.Store Addons 模拟购买

    我编写了一个基于 Windows Services Store 的应用内购买系统 现在我希望确保我的用户得到他们所付出的代价 在旧的 API 中 我可以模拟购买 我怎样才能让每次购买成功 而不需要每次都从我的信用卡 贝宝中注入真钱 我无法返
  • 了解事件的前一个处理程序是否返回 false。 IE < 9 中的默认阻止?

    我设置了一个全局模式 正在加载 请稍候 div 在一个应用程序中 它每次都会显示 a or a div
  • Visual Studio Code 安装位置

    我几天前安装了 Visual Studio Code 但现在在我的计算机上找不到可执行文件 它在哪里 我已经检查了程序和功能 我还检查了我的路径 由于某种原因 它也不在其中 更新 10 11 2018 如果您进行完全重新安装 包括卸载计算机
  • 函数定义上的纯说明符

    在 GCC 上编译时我得到了错误 函数定义上的纯说明符 但当我使用 VS2005 编译相同的代码时则不然 class Dummy error pure specifier on function definition VS2005 comp
  • 如果我是 Python 新手,我应该使用哪个版本的 Python?

    如果我对 Python 完全陌生 并且正在阅读有关将语句打印到控制台 变量类型 集合等的内容 我应该使用哪个版本的 Python 我知道有大量适用于 Python 2 6 x 的第三方库 但我担心我会学到一些不能很好地移植到 Python
  • Vala vapi 文件文档

    我想使用 Vala 破解现有的基于 GLib 的 C 项目 基本上我正在做的是 在构建过程开始时 使用 valac 从 vala 文件生成 c 和 h 文件 然后像编译任何 c 或 h 文件一样编译生成的文件 这可能不是最好的方法 但在大多
  • Total Blank Unity / Microsoft Store Build 未通过 WACK 测试

    我一直在努力为我的游戏取得成功统一 2018 2 1f1 and 视觉工作室 2017 15 8 0 尝试为 Windows 商店成功构建 打包 WACK 失败后所有 每个不同的配置 我尝试了完全空白默认Unity UWP平台应用程序 生成
  • 下边框边距

    有什么方法可以只在边框上添加边距吗 只有边框应该有边距 而不是文本 我正在尝试移动边框而不是文本字段 需要缩小 移动边框而不是文本 CSS margin check border bottom 1px solid d2d7da margin
  • (已解决)插件选项不允许使用多个值 androidx.compose.compiler.plugins.kotlin:reportsDestination

    我正在使用 Android Studio 与 Kotlin 进行 Android 开发 我的项目中有40多个Android模块 其中一些是Java模块 一些主题是android模块 Kotlin Version 1 8 20 Hilt Ve
  • 在 WinForms 表单之间传递数据[重复]

    这个问题在这里已经有答案了 我在项目中创建了一个辅助表单 它可以从主表单获取数据 并且在单击按钮时应将一些数据传递到主表单 这是代码 Add cs private void button1 Click object sender Event
  • 将响应缓冲区转换为 JSON

    在 AWS 中 我使用 https 模块通过 Lambda 发出 get 请求 我能够返回数据 但当我调用时它是缓冲区格式的callback null obj https get options res gt res on data d g
  • 为什么我无法计算正确的 HMAC 签名?

    我正在尝试在 Google Apps 脚本中计算 HMAC 签名 但文档并未 100 清楚地说明我需要如何传递参数 并且我无法获得预期的输出 为了确定我是否获得正确的输出 我将结果与已知良好的 PHP 代码进行比较 该代码是 key a2V
  • 如何为一系列任务设计执行引擎

    我正在尝试用 Java 编写一个问题 我必须执行一堆任务 Problem 执行由多个任务组成的作业 并且这些任务之间具有依赖关系 一个作业将有一个任务列表 每个这样的任务将进一步有一个后续任务列表 每个后续任务将有自己的后续任务 您可以在此
  • _ftol2_sse,有更快的选择吗?

    我有调用很多的代码 int myNumber int floatNumber 这总共占用了我大约 10 的 CPU 时间 根据分析器 虽然我可以就这样 但我想知道是否有更快的选择 所以我尝试四处搜索 并偶然发现 http devmaster