2012-07-17 93 views
8

我一直在學習cpu的一些功能,偶然發現了NEON。Android程序如何使用NEON SIMD?

從我讀過的內容看,NEON需要特定的編程來使用它,但這是完全正確的,還是讓具有此功能的cpus仍然可以找到方法來加速它並加速某些應用程序的媒體進程雖然沒有具體的代碼呢?

+0

指令集擴展需要由* something *(drivers/kernel/C library等)來定位。 – 2012-07-17 02:30:07

+0

從某種意義上說,Android編譯器會將其做到一定的水平(因爲並非所有的cpus都具有該功能)?我看到這就像intel cpus的MMX擴展,我認爲它原本是程序員的目標,然後編譯器只是假設它存在,然後它變得陳舊了...... – Tam 2012-07-17 02:34:03

+1

編譯器可能會使用一些優化 - - 但對於那些聲稱「60%-150%數字」的人來說,它仍然需要手工編碼和內在的使用知識。(不是說你要編寫整個程序集,而是編碼器的重負載部分或3d轉換等) – 2012-07-17 02:47:12

回答

9

有很多方法可以使用NEON指令。其中一些是:

  • Librarires。你的memcpy是使用NEON手工製作的好機會。 API中的音樂/視頻播放庫使用NEON和/或GPU進行加速。麻生太郎也有使用它的第三方庫。來自Qualcomm的FastCV就是一個很好的例子
  • 編譯器發佈的指令。一些編譯器,使用正確的編譯器選項將發出NEON指令。大多數編譯器將使用霓虹進行浮動操作,但不對其進行矢量化。他們將使用該單元作爲單數據單元,僅僅因爲它快速方便。 GCC和ARM編譯器中有一些向量化功能,但它們的範圍和結果都非常有限。
  • 帶有內部函數的手工編碼C http://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html這可能是開始使用NEON世界的最佳方法。
  • 手寫彙編程序。這似乎是最好的,如果你想實現最佳性能。它還需要大量的努力和CS知識。

  • 最後但並非最不重要的,你可以通過下載一些使用它的應用程序來使用NEON。你最喜歡的音樂播放器可能使很好的利用NEON單元在您的智能手機:)

結論:NEON有很多用途,但如果代碼具體包括NEON指令它纔會被使用。更具體地說,正如@pst所說的,它必須是的一個目標碼

+0

謝謝。您提到音樂/視頻播放是否意味着Android在使用SoundPool時會自動使用它(編譯它)? (我注意到兩個手機的音效效果有很大差異,其中一個是在CPU功能中列出的一個,另一個沒有列出霓虹燈)。 – Tam 2012-07-18 04:24:34

+0

大多數情況下,Android爲其音頻API提供了一個優化版本,可用於支持NEON等的手機,以及無NEON的簡單C++版本。我沒有檢查Android源代碼或驅動程序,但這是一個標準模型。 – Sam 2012-07-18 07:57:58