NEON_3

數據處理方法
在處理大量數據時,主要的性能限制因素是執行數據處理指令所花費的CPU時間。 此CPU時間取決於處理整個數據集所需的指令數。 指令的數量取決於每個指令可以處理多少個數據項。

 

單指令單數據(SISD)
大多數Arm指令都是單指令單數據(SISD)。 每條指令在單個數據源上執行其指定的操作。 因此,處理多個數據項需要多個指令。 例如,要執行四個加法運算,需要四個指令來從四對寄存器中添加值:

ADD w0, w0, w5
ADD w1, w1, w6
ADD w2, w2, w7
ADD w3, w3, w8

此方法相對較慢,可能很難看到不同寄存器之間的關係。 爲了提高性能和效率,通常將媒體處理卸載到專用處理器,例如圖形處理單元(GPU)或媒體處理單元,這些處理器可以用一條指令處理多個數據值。

如果您要處理的值小於最大位大小,則SISD指令會浪費該額外的潛在帶寬。 例如,將8位值加在一起時,需要將每個8位值加載到單獨的64位寄存器中。 由於處理器,寄存器和數據路徑都是爲64位計算而設計的,因此在小數據量上執行大量的單獨操作不能有效地利用機器資源。

 

單指令多數據
單指令多數據(SIMD)指令對多個數據項同時執行相同的操作。 這些數據項在較大的寄存器中打包爲單獨的通道。

 

例如,以下指令將四對單精度(32位)值加在一起。 但是,在這種情況下,將值打包到兩對128位寄存器中的單獨通道中。 然後,將第一個源寄存器中的每個通道添加到第二個源寄存器中的相應通道,然後再存儲在目標寄存器中的同一通道中:

ADD V10.4S, V8.4S, V9.4S
// This operation adds two 128-bit (quadword) registers, V8 and V9,
// and stores the result in V10.
// Each of the four 32-bit lanes in each register is added separately.
// There are no carries between the lanes.

這條指令同時對大寄存器中的所有數據值進行操作:

 

使用單個SIMD指令執行四個操作比使用四個單獨的SISD指令執行速度更快。

該圖顯示了128位寄存器,每個寄存器包含四個32位值,但是Neon寄存器也可以使用其他組合:

可以使用Neon寄存器的所有128位同時操作兩個64位,四個32位,八個16位或16個8位整數數據元素。
可以使用Neon寄存器的低64位同時操作兩個32位,四個16位或八個8位整數數據元素(在這種情況下,未使用Neon寄存器的高64位)。

注意,圖中所示的加法運算對於每個通道來說都是真正獨立的。 通道0的任何溢出或進位都不會影響通道1,這是完全獨立的計算。

諸如在移動設備中使用的媒體處理器通常將每個完整數據寄存器分成多個子寄存器,並並行地對子寄存器執行計算。 如果對數據集的處理簡單且重複很多次,則SIMD可以顯着提高性能。 對於數字信號處理或多媒體算法,例如:

音頻,視頻和圖像處理編解碼器。
基於矩形像素塊的2D圖形。
3D圖形
色彩空間轉換。
物理模擬。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章