NEON彙編比純C程式碼快17倍!
最近在準備第三季的內容時候看了一下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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++程式中不同函式呼叫方式的彙編碼比較C++函式
- 彙編程式碼Helloworld
- 09. C語言內嵌彙編程式碼C語言
- 編碼也快樂:兩隻水壺C#程式C#
- CatFly【彙編程式碼還原】
- 比較BF、KMP和BM演算法的效能(純C語言實現,而且……VC6.0編譯的程式跑得比codeblocks 17.12編譯的快)KMP演算法C語言編譯BloC
- C與彙編程式的約定呼叫
- c語言if語句是如何變成彙編程式碼的?C語言
- GCC內聯彙編(2)GCC生成彙編程式碼簡單例項GC單例
- shellcode轉換成彙編程式碼
- iOS彙編入門教程(二)在Xcode工程中嵌入彙編程式碼iOSXCode
- Java程式碼如何檢視位元組碼及彙編碼Java
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- C與彙編(NASM) (1)ASM
- 計算機執行彙編程式碼的原理計算機
- 編寫高效的C程式與C程式碼優化C程式優化
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- C指標原理(8)-C內嵌彙編指標
- C指標原理(6)-C內嵌彙編指標
- C指標原理(7)-C內嵌彙編指標
- STM彙編程式設計程式設計
- C++內嵌彙編 教程1C++
- 深入iOS系統底層之程式中的彙編程式碼iOS
- 編寫更好的C#程式碼C#
- win32下彙編程式碼結構學習Win32
- 優化C++程式碼(2):C++程式碼的編譯過程優化C++編譯
- 編碼也快樂:取得3升水C#版C#
- [譯]純程式碼建立 UIViewUIView
- mac 純程式碼建立tableviewMacView
- MSIL入門(一)C#程式碼與IL程式碼對比C#
- windows搭建彙編程式IDEWindowsIDE
- 迪文屏OS彙編程式碼開發-串列埠篇串列埠
- C編寫的簡單密碼程式密碼
- c# ref out 區別 比較 彙總C#
- 編碼也快樂:兩隻水壺F#程式
- 編碼也快樂:兩隻水壺Scheme程式Scheme
- LAMP純原始碼編譯安裝日誌LAMP原始碼編譯
- 安全漏洞本質扯談之決戰彙編程式碼