2014-01-10 48 views
5

我正在研究一個iPhone應用程序,它涉及每秒完成數千次的某些物理計算。我正在優化代碼以提高幀率。我正在尋找的改進之一是反平方根。現在,我正在使用Quake 3 fast inverse square root方法。然而,在做了一些研究之後,我聽說there is a faster way by using the NEON指令集。我不熟悉內聯彙編,也不知道如何使用NEON。我試圖實現math-neon庫,但我得到編譯器錯誤,因爲大多數基於NEON的函數缺少returniPhone上最快的逆平方根

編輯:我突然得到一些「不清楚的問題」收票。雖然我覺得它很清楚,而且回答的人顯然明白,也許有些人需要明確說明: 你如何使用Neon執行更快的計算?是否真的是獲得iPhone上反平方根的最快方法?

編輯:我今天做了霓虹燈VS雷神之錘一些比較正規的測試,但如果有什麼事情,我現在更加不確定的結果:

  • 應用程式測試:(一個應用程序,目前在App Store與修改其invsqrt方法)

    1. 地震方法(通過壓力條件下的平均FPS略有增加)
    2. 霓虹燈領導(這是一個非常密切的呼叫,但它似乎是地震W¯¯作爲稍快)
    3. 1/sqrtf()(有點更明顯的差異,1-3 FPS下降)。
  • 「正式」測試

    1. 霓虹燈(顯然是最快的(一個,它吞噬了我的手機的CPU需要多長時間每種方法的應用程序。次穿越1000萬個隨機生成的浮標陣列來獲得)如果它用於一次執行兩個sqrt,則速度加倍)。
    2. 1/sqrtf()(只比霓虹燈更慢。這令人驚訝的結果使我認爲這個測試「不確定」,直到我進一步調查)
    3. 雷神之錘(此方法,令人驚訝的,是數量級的幾個訂單比慢其他兩種方法。這是特別奇怪,因爲它在其他測試中的表現。)

雖然地震VS霓虹燈太近肯定地說什麼在應用性能測試中,地震對1 /在第一個測試中,sqrtf()很清楚,第二個測試與輸出的值非常一致。然而,最終重要的是應用性能,所以我將根據該測試做出最終決定。

+0

您是否在樂器下運行您的應用程序以查看實際使用時間?除非你的意思是「三十萬」之類的東西,否則你花費大量的CPU時間來做每秒「數千」(反向)平方根是極不可能的。 –

+0

我的應用程序中的「壓力條件」正在運行每秒約122500次的計算。在我的目標情景中,它將每秒運行594000次。改變平方根方法有明顯的效果,但還有其他瓶頸。 – WolfLink

回答

5

question you've linked已經提供了答案的accepted answer,但不拼出來:

#import <arm_neon.h> 

void foo() { 
    float32x2_t inverseSqrt = vrsqrte_f32(someFloat); 
} 

標題和函數已由iOS SDK提供。

+0

如何在'float32x2_t'和'float'之間進行轉換?我無法找到任何有關'float32x2_t'的確切文檔。 – WolfLink

+0

它實際上是一個'float32_t',它是一個'float'(在Xcode中,按住命令鍵並點擊一個類型以跳轉到它的定義)。我相應地編輯了我的答案。 – DarkDust

+0

編譯錯誤:「將'float'傳遞給不兼容類型的參數float32x2_t」 – WolfLink

2

https://code.google.com/p/math-neon/source/browse/trunk/math_sqrtf.c < - 有一個霓虹燈實施invsqrt那裏,你應該能夠複製組裝位原樣

+0

我是內聯程序員新手。我如何從中得到輸出,以及如何給它輸入? – WolfLink

+0

從我可以告訴它只是從第一個參數寄存器讀取參數。但你應該看看DarkRust提到的函數:vrsqrte_f32 –

+0

@WolfLink:通過@fyolnish鏈接的函數似乎是更好/更精確的實現(據我瞭解另一個問題中的一些註釋,'vrsqrte_f32 '僅僅是一個精確的結果是不夠的)。你可以簡單地複製整個函數'sqrtf_neon_hfp'(我不明白什麼是封裝器'sqrtf_neon_sfp'在做什麼)。它已經完成了你所需要的一切。然而,問題在於該文件是根據與iOS AppStore不兼容的LGPL3授權的,因此您將通過複製函數來違反LGPL3 ... – DarkDust