NEON彙編比純C程式碼快17倍!

rlk8888發表於2022-03-21

最近在準備第三季的內容時候看了一下NEON彙編指令,挺有意思。我寫了個小程式來試試NEON彙編指令究竟能有多少快。有的小夥伴可能不知道啥鳥是NEON。其實NEON就是ARM公司給自家的SIMD指令取了一個好聽的花名。


SIMD 指的是單指令多資料流,它對多個資料元素同時執行相同的操作。這些資料元素被打包成一個更大的暫存器中的獨立通道( Lanes 例如, ADD 指令將 32 位資料元素加在一起。 這些值被打包到兩對 128 位暫存器(分別是 V8 V9 )中的單獨通道中。 然後將第一源暫存器中的每個通道新增到第二源暫存器中的相應通道,然後將其儲存在目標暫存器( V10 )中的同一通道中。

     ADD V0.4S, V1.4S, V2.4S


ADD指令會並行做4個加法運算,它們分別位於處理器內部的4個計算通道並且是相互獨立的,任何一個通道發生了溢位或者進位都不會影響其他通道。

     V0.4S[0] = V1.4S[0]+ V2.4S[0]

     V0.4S[1] = V1.4S[1]+ V2.4S[1]

     V0.4S[2] = V1.4S[2]+ V2.4S[2]

     V0.4S[3] = V1.4S[3]+ V2.4S[3]

                           

SIMD非常適合影像處理場景。影像的資料常用的資料型別是RGB565,RGBA8888, YUV422等格式,這些格式的資料特點是一個畫素點的一個分量(A、R、G以及B分量)使用8位資料表示。如果使用傳統的處理器做計算,雖然處理器的暫存器是32位或是64位的,處理這些資料確只能使用暫存器的低8位,有點浪費浪費。如果把64位暫存器拆成8個8位資料通道就能同時完成8個操作,計算效率提升了8倍。



背景

背景

RGB24 影像格式是一個畫素用 24 個位( 3 個位元組)表示 R (紅)、 G (綠) , B (藍)三種顏色。它們在記憶體中的儲存格式是 R0 G0 B0 R1 G1 B1 ,以此類推。而 BGR24 影像格式與 RGB24 有一點不一樣,它在記憶體的儲存格式是 B0 G0 R0 B1 G1 R1 ,依次類推                       


下面用C語言來實現RGB24轉BGR24。


後面我分別使用手工編寫NEON彙編以及使用NEON內建函式的方式來改寫這個段C語言程式碼,然後在樹莓派4b上跑了一下: 分別使用這三種方式來轉換10張4K大小的影像資料。

驚呆


不跑不知道,一炮嚇一跳!使用NEON指令優化的純彙編程式碼比純C語言要快17倍以上,比使用NEON內建函式要快4倍以上。


我將在第三季視訊課程裡和大家詳細聊一聊NEON指令,有趣!第三季視訊課程:ARM64體系結構與程式設計,等你喲!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70005277/viewspace-2878947/,如需轉載,請註明出處,否則將追究法律責任。

相關文章