使用 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 浮点单元将浮点数转换为整数的主要内容,如果未能解决你的问题,请参考以下文章