我想为缺少浮点单元的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;
答案 0 :(得分:5)
我在gp2x手持设备上做了一些编码,该设备的ARM处理器为200Mhz。我正在做3D图形并且使用花车进行数学运算肯定太慢了。
即使仅对每个顶点计算使用浮点数学运算,性能也比使用固定点慢得多。这是“soft-fp”,编译器使用浮点仿真库。当让内核处理浮点仿真时,性能就更糟了。
我开发了一个C ++ Fixed Point Libray,它提供了一个带有重载运算符的类,可以使用而不是浮点数。
答案 1 :(得分:4)
不,编译器肯定不会将浮点数上的操作转换为定点,因为语义有很大不同。浮点数具有更大的范围,它们支持NaN和无穷大,并且舍入行为是完全不同的。
因此,如果你所针对的处理器没有FPU,你肯定会看到使用定点的一大好处(如果这些计算占用了你的运行时间的很大一部分)。但是,您必须处理与定点相关的所有内务处理。
答案 2 :(得分:3)
我不能专门谈论ARM代码,但是模拟浮点并不便宜。领先1检测,动态转换,舍入和特殊情况处理(NaN,inf等)。这与你在那里的定点代码完全不同。
答案 3 :(得分:2)
在浮点实际上不浮动的所有情况下,即使在具有FPU的设备上,固定点通常也更有效。例如,如果您使用长整数来表示距离最近的毫米的空间。节省通常以计算速度,空间使用,你需要一个双倍而不是一个浮点来获得相同的毫米范围,你可以避免像sprintf等功能...
所以是的,固定点对许多情境都有意义。