【问题标题】:Fast float to int conversion and floating point precision on ARM (iPhone 3GS/4)ARM (iPhone 3GS/4) 上的快速浮点到整数转换和浮点精度
【发布时间】:2010-08-14 14:09:24
【问题描述】:

我读过 (What is the fastest way to convert float to int on x86) 中提到的 (http://www.stereopsis.com/FPU.html)。有谁知道慢速简单转换(见下面的 sn-p)是否也适用于 ARM 架构?

inline int Convert(float x)
{
  int i = (int) x;
  return i;
}

要应用 FPU 文章中提到的一些技巧,您必须设置浮点运算的精度。我如何在 ARM 上做到这一点?

在 ARM 架构上最快的浮点到整数转换是什么?

谢谢!

【问题讨论】:

  • 请不要在实际代码中命名像Convert这样的函数:P
  • @Billy:我明白你的意思。地板会更好:-)
  • 回到那天(大约 15 年前)在 x86 上进行普通类型转换 (int)afloat 时存在性能问题,这是由于 fpu 寄存器中的默认 float2int 是一个地板,并且不在身边。因此,为了使代码在那个时代变得更快,编写了特殊的程序集。从那个时候开始的任何代码都将期望浮点到整数转换使用地板操作而不是普通回合。但是,使用 floor 函数,然后强制转换为 int 与仅强制转换为 int(四舍五入到最近),您可能会受到双重打击。

标签: optimization floating-point arm fpu


【解决方案1】:

短版,“否”。

那篇文章很古老,甚至不适用于现代 x86 系统,更不用说 ARM。在 ARMv7 (iPhone 3GS/4) 上,简单的整数转换相当快,尽管将数据从 VFP/NEON 寄存器移动到通用寄存器时会有适度的停顿。但是,鉴于您的 float 数据可能来自在 VFP/NEON 寄存器中完成的计算,因此无论您如何进行转换,您都必须为此付出代价。

我不认为这是一条有利可图的优化途径,除非您有迹象表明这是您程序的主要瓶颈。即便如此,最快的转换是你不做的转换;找到算法方法来消除程序中的转换几乎总是会更好。

如果您确实确实需要优化转换,请查看vcvt.i32.f32 指令,该指令将两个或四个浮点数的向量转换为两个或四个整数的向量 将数据移出 NEON 寄存器(因此,不会导致我提到的停顿)。当然,您需要在 NEON 单元上进行后续整数计算,这样才能实现有利可图的优化。

问题:您真正想做什么?为什么你认为你需要更快的 float->int 转换?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 2010-12-26
    • 2014-01-30
    • 2012-06-25
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多