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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 09. C語言內嵌彙編程式碼C語言
- 彙編程式碼Helloworld
- 比較BF、KMP和BM演算法的效能(純C語言實現,而且……VC6.0編譯的程式跑得比codeblocks 17.12編譯的快)KMP演算法C語言編譯BloC
- CatFly【彙編程式碼還原】
- c語言if語句是如何變成彙編程式碼的?C語言
- iOS彙編入門教程(二)在Xcode工程中嵌入彙編程式碼iOSXCode
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- C與彙編(NASM) (1)ASM
- Java程式碼如何檢視位元組碼及彙編碼Java
- 計算機執行彙編程式碼的原理計算機
- C指標原理(7)-C內嵌彙編指標
- C指標原理(8)-C內嵌彙編指標
- C指標原理(6)-C內嵌彙編指標
- 深入iOS系統底層之程式中的彙編程式碼iOS
- STM彙編程式設計程式設計
- windows搭建彙編程式IDEWindowsIDE
- C++內嵌彙編 教程1C++
- win32下彙編程式碼結構學習Win32
- MSIL入門(一)C#程式碼與IL程式碼對比C#
- C和C ++ IDE智慧程式碼編輯器:CLion 2022IDE
- C和C ++ IDE智慧程式碼編輯器——CLion 2021IDE
- 迪文屏OS彙編程式碼開發-串列埠篇串列埠
- [譯]純程式碼建立 UIViewUIView
- AndroidStudio使用NDK編譯C/C++程式碼使用原生庫Android編譯C++
- 安全漏洞本質扯談之決戰彙編程式碼
- 這誰頂得住?java反編譯的彙編程式碼private volatile static Singleton instanceJava編譯
- 在VS2019使用MASM編寫彙編程式ASM
- AT&T彙編之使用C庫函式函式
- STM32彙編程式設計程式設計
- 彙編程式開發環境搭配開發環境
- 【Mac win】C和C ++ IDE智慧程式碼編輯器CLion 2022MacIDE
- 在Linux上使用vscode編譯除錯C/C++程式碼LinuxVSCode編譯除錯C++
- 編寫高效能C#程式碼 —— Span<T>C#
- iOS 編寫高質量Objective-C程式碼iOSObjectC程式
- 彙編
- ClownFish:比寫程式碼還快的通用資料訪問層
- 二進位制入門--動態跟蹤原始碼和反彙編程式碼原始碼
- 【C# 程式碼小知識】畫蛇添足的編碼字首C#