(1)libraries:直接在程式中呼叫優化
(2)vectorizing compilers:gcc編譯器的向量優化選項
提供了乙個連線neon操作的c函式介面,編譯器會自動生成相關的neon指令,支援armv7-a或armv8-a平台。所有的intrinsics函式都在:gnu官方說明文件.
乙個簡單的例子:
//add for int array. assumed that count is multiple of 4
#include// c version
void add_int_c(int* dst, int* src1, int* src2, int count)}
// neon version
void add_float_neon1(int* dst, int* src1, int* src2, int count)
}
**中的vld1q_s32
會被編譯器轉換成vld1.32 , [r0]
指令,同理vaddq_s32
和vst1q_s32
被轉換成vadd.i32 q0, q0, q0
,vst1.32 , [r0]
。若不清楚指令意義,請參見arm® compiler armasm user guide - chapter 12 neon and vfp instructions。
neon可以有兩種寫法:
(1)assembly檔案
(2)inline assembly內聯彙編
比如上述intrinsics**產生的彙編**為:
// armv7-a/aarch32
void add_float_neon2(int* dst, int* src1, int* src2, int count)
, [%[src1]]! \n"
"vld1.32 , [%[src2]]! \n"
"vadd.f32 q0, q0, q1 \n"
"subs %[count], %[count], #4 \n"
"vst1.32 , [%[dst]]! \n"
"bgt 1b \n"
: [dst] "+r" (dst)
: [src1] "r" (src1), [src2] "r" (src2), [count] "r" (count)
: "memory", "q0", "q1"
);}
建議的neon調優步驟:
理清所需的暫存器、指令。 建議根據要實現的任務,畫出資料變換流程,和每步所需的具體指令,盡可能找到最優的實現流程。這一步非常關鍵,如果思路出錯或是不夠優化,則會影響使用neon的效果,並且對程式修改帶來麻煩,一定要找到最優的實現演算法哦~
先實現intrinsics(可選)。 初學者先實現intrinsics是有好處的,字面理解性更強,且有助於理解neon指令。建議隨時列印關鍵步驟的資料,以檢查程式的正誤。
寫成彙編進一步優化。 將intrinsics生成的彙編**進行優化調整。一般來說,有以下幾點值得注意【乾貨】:
對neon優化使用的好壞直接導致優化效果,優化效果好的會節省70%以上的時間。
當讀者熟練後就可以直接上手內聯彙編了。時間有限,本文中不具體介紹inline assembly的使用方法,我後續可能會將這部分單獨寫成一篇部落格。感興趣者請參見arm gcc inline assembler cookbook
一些使用心得:
asm volatile (
... /* assembly code */
: "+r"(arg0) // %0
"+r"(arg1) // %1 // output registers
: "r"(arg2) // %2 // input registers
: "cc", "memory", r0, r1
NEON 和 VFP 程式設計 NEON通用算術指令
本節包括以下小節 vaba 和 vabd 向量差值絕對值累加和差值絕對值。vabs 和 vneg 向量絕對值和求反。vadd vaddl vaddw vsub vsubl 和 vsubw 向量加法和減法。vaddhn 和 vsubhn 選擇高半部分的向量加法和選擇高半部分的向量減法。vhadd 和 ...
NEON指令化並行技術簡介和簡單使用
向量化simd是一種單指令多資料的並行執行方式。具體而言,向量化是指相同指令在硬體向量處理單元上對多個資料流進行操作。這些硬體向量處理單元也被稱為simd單元。補充 cpu在單位時間內 同一時間 能一次處理的二進位制數的位數稱為字長。1位元組是8位字長。如果每個執行緒能夠充分利用每個處理器核心的si...
Git使用建議
轉至元資料結尾 轉至元資料起始 日誌輸出引數 git log 檢視檔案的詳細變更 git log pfilename git log p 或者 git log p filename 不僅顯示提交說明 提交者以及提交日期,還會顯示這每次提交實際修改的內容。檢視檔案中指定位置的變更 git log l1...