2013-07-31 36 views
1

我正在爲使用大量浮點運算和三角函數的ARM目標編寫代碼。 AFAIK浮點計算比int更慢(特別是在ARM上)。準確性並不重要。快速三角函數在C++中僅使用整數用於arm目標

我想過使用的縮放因子(0 * pi到2 * PI變得INT 0到1024 P.E.範圍)和查找表執行自己的三角函數。這是一個好方法嗎? 有沒有其他的選擇?

目標平臺是Odroid U2(Exynos4412)運行Ubuntu和許多其他的東西(網絡服務器等)。

(C++ 11和升壓/庫允許)

+4

我看不出有什麼毛病查找表 –

+0

有多大的目標處理器的數據緩存?高速緩存未命中也可能是一項昂貴的操作。 –

回答

1

的Exynos 4412使用的Cortex-A9芯[1],其具有完全流水線單精度和雙精度浮點。沒有理由訴諸於整數運算,因爲有一些較老的ARM內核。

根據您的特定精度要求(特別是如果你能保證輸入落入一個有限的範圍內),您可能能夠使用比實現顯著快可在標準庫近似值。有關您的確切用法的更多信息將是必要的,以提供合理的建議。

[1] http://en.wikipedia.org/wiki/Exynos_(system_on_chip)

1

一個可能的選擇是TRIGINT:

  1. trigint download
  2. trigint doxygen
+0

這是一個非常有趣的圖書館,沒有任何基準測試桌面平臺上? –

5

如果你的目標平臺具有數學庫, 用它。如果它有什麼好處,它是由考慮速度的專家撰寫的。你不應該將代碼設計基於猜測什麼是快速或慢速。如果您沒有實際的測量或處理器規格,並且您不知道應用程序中的三角函數耗費大量時間,那麼您沒有充分的理由來更換數學庫。

浮點指令通常比整數指令具有更長的延遲時間,但它們是流水線的,因此吞吐量可能相當。 (例如,一個浮點單元可能有四個階段來完成這項工作,所以一個指令需要四個週期來完成所有階段,但是您可以在每個週期的第一階段推入一條新指令。)流水線是足以提供與整數實現不相上下的性能很大程度上取決於目標處理器,正在使用的算法以及實現者的技能。

如果在您的情況下使用數學例程的自定義實現是有益的,那麼應該如何設計它們非常依賴於環境。正確的建議取決於要支持的域(只有0到2π?-2π到+2π?可能更大的值,必須摺疊到-π到π?),需要支持哪些特殊情況(傳播NaN?),所需的準確性,處理器中還發生了什麼(正在使用大量內存,還是可以依靠查找表保留在緩存中?)等等。

三角例程正在處理各種情況(NaN的,無窮大,小的值),並降低參數模2π的顯著一部分。可能會實現不處理特殊情況或減少參數但仍使用浮點數的精簡例程。

+2

在這種情況下,OP也沒有提供給任何數學函數庫的作家更多的信息 - 比正常所需的精度低。不過,我首先同意測量。 –

0

你應該使用「定點」數學而不是浮點數。

大多數ARM處理器(7及以上版本)允許固定點的32位分辨率。所以你可以很容易地轉到1E-3弧度。但真正的問題是你在結果中需要多少準確度?

是否使用查找表,查找表用插值或功能取決於你有多少數據空間,在您的系統上。查找表執行速度最快,但使用的數據空間最多。函數使用最少量的數據,但需要最多的執行時間。插值可能是一種緩解措施,允許使用較小的表格和一些額外的處理。