使用 iPhone 的 SIMD 浮点单元将浮点数转换为整数

Posted

技术标签:

【中文标题】使用 iPhone 的 SIMD 浮点单元将浮点数转换为整数【英文标题】:float to integer conversion using iPhones SIMD float unit 【发布时间】:2009-07-16 09:57:20 【问题描述】:

我目前正在尝试用 Shark 优化一些与 DSP 相关的代码,发现我在浮点到整数的转换上浪费了很多时间:

SInt16 nextInt = nextFloat * 32768.0f + 0.5f;

由于 iPhone 似乎有一个 ARM11 FP 协处理器,我想知道是否可以用 FTOSI 指令替换我的代码。 ARM 网站上有一些documentation,但我没有内联手动优化程序集的经验。 以前有人这样做过吗? 我想我可以用

内联代码
__asm__ volatile

但是如何检查指令是否可用? 如何传递我的价值?

编辑1: 正如 Louis 已经指出的那样,我忘了提到我正在关闭“Compile for Thumb”进行编译。

编辑2: 由于我想将浮点数转换为带符号的 Int16 而不是无符号的 Int,因此我将 ARM 指令从 FTOUI 更改为 FTOSI。这是原帖中的一个错误。

【问题讨论】:

【参考方案1】:

这可能是一个显而易见的问题,但您确定您的目标是 ARM 吗?默认情况下,iPhone SDK 为 THUMB 编译所有应用程序,它使用软件浮点一切(包括 float/int 转换)。

无论如何,如果设备有 VFP 协处理器,它就有指令。您可以通过读取 FPSID 寄存器并确保它是受支持的型号来检查它是否具有合适的协处理器。

我怀疑假设所有 iPhone 都支持它是安全的。除其他外,Apple 的汇编器支持操作码,LLVM ARM 后端使用它进行类型转换,这意味着当 Apple 最终在手机上支持 LLVM 时,他们的编译器将生成 FTOUI 指令。

【讨论】:

由于我的代码是浮点密集型的,我关闭了“Compile for Thumb”。 (我认为这设置了“-marm”编译器开关) 你是对的,只是想确认一下。看起来有点令人震惊的 GCC 本身并没有使用 FTOUI 进行转换,并且需要内联 asm,这就是我检查的原因。我正在添加应该是我认为您所问问题的答案。 我认为 GCC 没有机会检测到我正在尝试进行 float 到 int 的转换,因为它不是简单的转换,而是 mul、add 和转换的组合。稍后我会调查 GCC 输出的 asm 并将其发布在这里。

以上是关于使用 iPhone 的 SIMD 浮点单元将浮点数转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数乘以 Python 中的函数并且无法将序列乘以“浮点”类型的非整数

将浮点数转换为字符串

将浮点数转换为 varchar sql

将浮点数转换为PHP中的字节数组

将浮点数格式化为两位小数

将浮点数转换为整数