【问题标题】:Lower the floating-point precision in python to increase performance [duplicate]降低python中的浮点精度以提高性能[重复]
【发布时间】:2014-07-09 08:46:04
【问题描述】:

我在树莓派上使用 python。我正在使用互补滤波器从陀螺仪中获得更好的值,但它消耗了太多覆盆子的能量——大约是 70%。我认为我可以通过降低浮点精度来提高性能。现在,结果大约有 12 位小数,这比我需要的要多。有没有办法设置最大精度?只是将数字四舍五入并不能满足我的需求,因为这只是另一个计算。谢谢!

编辑:我尝试使用 Decimal 模块,并将精度设置为 6,它比浮点数慢了近 6 倍!除了 Decimal 之外,还有没有其他方法可以处理定点数(它看起来是为了比性能更高的精度而创建的)

【问题讨论】:

标签: python performance raspberry-pi floating-point-precision


【解决方案1】:

您可以使用 numpy 强制进行单精度浮点计算。

但是,如果使用单精度浮点的计算速度比双精度快,我会感到非常惊讶:树莓派支持硬件浮点,所以我希望所有计算都以全 80 位精度完成,然后四舍五入保存到内存时的 32 位或 64 位结果。唯一可能的好处是保存值时使用的内存带宽会稍微减少。

【讨论】:

  • 80位精度从何而来?
  • 80 位是 x87 架构内部使用的扩展精度,以避免计算过程中的精度损失。我不知道 ARM 是否也这样做,或者它是否只在内部使用 64 位。
【解决方案2】:

这可能是你的棒子的一端弄错了。

来自陀螺仪的数据流相当慢,因此您应该有足够的时间使用任何合理的过滤器对其进行过滤。即使是卡尔曼滤波器也应该可用(尽管可能没有必要)。您多久对陀螺仪和加速度计数据进行一次采样?合理的最大值是几百赫兹,而不是更多。

用于加速度计和陀螺仪测量的互补滤波器非常轻巧,它本身应该消耗很少的处理能力。它可以在慢速 8 位处理器上实现,因此 Raspberry 对它来说太快了。

根据您对互补过滤器的操作,过滤器本身需要一些浮点运算。如果您计算弧切线或等效函数,则需要数百次 FLOP。如果以 1 kHz 的速率执行此操作,则可能会消耗几百 kFLOPS(每秒浮点操作数)。一个 RPi 的 FP 吞吐量约为 100 MLFOPS,因此有很大的余量。

因此,降低 FP 精度不会有太大帮助,问题出在其他地方。也许如果你显示更多的代码,它可以确定问题出在哪里!

【讨论】:

  • 刷新率是 10ms (100Hz),所以肯定有一些严重的错误:/ 我会再次修改我的代码。
  • 好吧。我在 while 循环中遇到了不好的情况,它消耗了所有的 cpu 功率……现在使用率约为 1-3%。我很抱歉。
猜你喜欢
  • 2022-11-02
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2011-02-23
相关资源
最近更新 更多