2011-09-29 71 views
6

我正在開發一個適用於Android的本機庫,其中使用了ARM彙編優化和多線程,以便在雙核ARM芯片組MSM8660上獲得最大性能。雖然做了一些測試,我注意到以下幾點:Qualcomm Scorpion雙核ARM NEON代碼存在問題?

  1. 單線程NEON優化是單線程的ARMv6優化(如預期)。
  2. 多線程的ARMv6優化比單線程的ARMv6優化(如預期)更快
  3. 多線程NEON優化比單線程NEON優化(絕對不是預期的!)。

我已經嘗試搜索網絡上的所有解釋爲什麼這是但迄今沒有找到任何。看起來好像所有內核都共享相同的NEON管道或類似的東西,但是所有的原理圖似乎都表明每個內核都應該有自己的NEON單元。有誰知道爲什麼會發生這種情況?

回答

0

這可能是因爲緩存未命中。沒有更多信息很難說。

+0

另一種方法是,瓶頸可能是外部存儲器帶寬 - 在這種情況下,添加更多內核無濟於事。 –

+1

是的,但是如果只有外部內存帶寬,性能至少應該是相等的。當然,添加更多的線程會引入更多的上下文切換,但我不確定會對性能產生多大影響。 – onemasse

0

我的猜測是,這是因爲刷新NEON管道時涉及額外的週期代價。 NEON管道落後於核心的其餘部分,因此您會看到錯過分支機構等的額外週期處罰。

如果線程必須經常同步,或者如果你有很多鎖,我認爲你會看到NEON很大的懲罰。

要使用NEON來提高多線程代碼的性能,唯一的方法就是如果代碼是令人尷尬的並行執行,並且線程之間的通信很少且不頻繁。

1

首先,你在使用什麼庫?

你是對的,每個核心都有它自己的NEON單元,然而它們是他們自己專有的'VeNum'單元,並沒有提供關於它的很多信息,它是爲8x50的基於Cortex-A8的Scorpion設計的,它比ARM自己的NEON SIMD更好,但是他們(qcom)設計硬件的方式與基本參考設計兼容,所以大多數cortex-A8的代碼在蠍子上都可以正常工作,由於可能有不同的指令時序,導致一些性能下降

如果您使用「softfp」來編譯程序,那麼對於使用浮點參數的每個調用的函數,或者使用NEON單元作爲從ARM內核傳輸寄存器數據,開銷約爲20個週期到Neon單元,反之亦然,速度很慢,有時會使內核停頓很多週期,等待管道沖洗。

對於使用浮點單元的線程化程序,內核必須在上下文切換過程中保存FP寄存器,這樣會對線程造成額外的損失,因爲我們已經知道從氖到臂的移動寄存器速度慢並且已知失速管道。

此外,許多其他因素可能會導致此問題,如編譯器的錯誤優化,高速緩存未命中,不使用scorpion的雙重問題特性,錯誤的指令調度以及重複將線程從一個核心切換到另一個核心。