【问题标题】:Benefits of using fixed-point arithmetic in C++ for devices without FPU在没有 FPU 的设备上使用 C++ 中的定点算法的好处
【发布时间】:2012-05-25 10:21:58
【问题描述】:

我想针对缺少浮点单元的 ARM 设备优化我的 C++ 代码。我的大部分函数都使用浮点数,我正在考虑将它们更改为定点。

对于 ARM 设备是否有真正的好处,或者编译器是否足够聪明,可以自己做到这一点?

例如,这在 ARM 设备上会更有效吗

//unsigned char const* input
unsigned int a, b;
a= *input++ << 12; 
b= *input++ << 12; 
a*=1024;    //0.25 shifted 12 bits
b*=1024;    //0.25 shifted 12 bits
*output++ = (a+b) >> 24;

比做

float a,b;
a= *input++;
b= *input++;
a=a/4;
b=a/4;
*output++ = a+b;

【问题讨论】:

标签: c++ optimization arm fixed-point


【解决方案1】:

我在 gp2x 手持设备上进行了一些编码,该设备具有 200Mhz 的 ARM 处理器。我在做 3D 图形,使用浮点数进行数学运算肯定会太慢。

即使仅对每个顶点计算使用浮点数学,其性能也比使用定点要慢得多。这是编译器使用浮点仿真库的“soft-fp”。当让内核处理浮点仿真时,性能会更加糟糕。

我开发了一个 C++ Fixed Point Libray,它提供了一个带有重载运算符的类,人们可以使用它来代替浮点数。

【讨论】:

    【解决方案2】:

    不,编译器肯定不会将浮点运算转换为定点运算,因为语义有很大不同。浮点数的范围更大,它们支持 NaN 和无穷大,并且舍入行为完全不同。

    因此,如果您的目标处理器没有 FPU,那么您肯定会看到使用定点的巨大好处(如果这些计算占您运行时间的很大一部分)。不过,您必须处理与定点相关的所有日常事务。

    【讨论】:

      【解决方案3】:

      我不能专门为 ARM 代码说话,但模拟浮点并不便宜。有前导 1 检测、动态移位、舍入和特殊情况处理(NaN、inf 等)。这与您那里的定点代码完全不同。

      【讨论】:

        【解决方案4】:

        在浮点实际上不浮动的所有情况下,即使在具有 FPU 的设备上,定点通常更有效。例如,如果您使用长整数来表示最接近毫米的空间。节省通常体现在计算速度、需要双精度而不是浮点数的空间来获得与长距离相同的毫米范围,以及可以避免使用 sprintf 等功能的输出......

        所以是的,固定点在许多情况下都有意义。

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 1970-01-01
          • 2020-09-06
          • 1970-01-01
          • 1970-01-01
          • 2014-03-08
          • 1970-01-01
          • 1970-01-01
          • 2022-07-27
          相关资源
          最近更新 更多