neon使用和建議

2021-09-17 08:57:12 字數 2234 閱讀 1073

(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_s32vst1q_s32被轉換成vadd.i32 q0, q0, q0vst1.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...