日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NEON指令优化指南学习之一

發布時間:2023/12/8 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NEON指令优化指南学习之一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RM平臺NEON指令的編譯和優化

  本文介紹了ARM平臺基于ARM v7-A架構的ARM Cortex-A系列處理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9, Cortex-A15)上的NEON多媒體處理硬件加速器針對C/C++語言、匯編語言和NEON intrinsics如何編譯和優化,包含如何向量化、向量化的ARMCC和GCC編譯器選項、NEON的匯編和EABI程序調用規范、如何在bare-metal和Linux操作系統上檢測NEON硬件、如何指導編譯器進行向量化NEON指令的優化等內容。

NEON向量化

  基于ARM v7-A架構的ARM Cortex-A系列處理器(Cortex-A5, Cortex-A7, Cortex-A8, Cortex-A9, Cortex-A15)都可以選用NEON多媒體處理器加速程序運行,NEON是一種SIMD(Single Instruction Multiple Data)架構的協處理器,ARM的NEON處理器還可選配置成向量浮點VFPv3(Vector Floating-Point)指令集處理器。

常用的編譯器選項配置

自動向量化選項

  armcc編譯器使用–vectorize選項來使能向量化編譯,一般選擇更高的優化等級如-O2或者-O3就能使能–vectorize選項。

  gcc編譯器的向量化選項-ftree-vectorize來使能向量化選項,使用-O3會自動使能-ftree-vectorize選項。

選擇處理器類型

  armcc編譯器使–cpu 7-A或者–cpu Cortex-A8來指定指令集架構和CPU類型。

  gcc編譯器的處理器選項-mfpu=neon和-mcpu來指定cpu類型。如-mcpu=cortex-a5

選擇NEON和VFP類型

  gcc選擇用-mfpu=vfpv3-fp16來指定為vfp協處理,而-mfpu=neon-vfpv4等就能指定為NEON+VFP結構。

選擇浮點處理器和ABI接口類型

  -mfloat-abi=soft使用軟件浮點庫,不是用VFP或者NEON指令;-mfloat-abi=softfp使用軟件浮點的調用規則,而可以使用VFP和NEON指令,編譯的目標代碼和軟件浮點庫鏈接使用;

  -mfloat-abi=hard使用VFP和NEON指令,并且改變ABI調用規則來產生更有效率的代碼,如用vfp寄存器來進行浮點數據的參數傳遞,從而減少NEON寄存器和ARM寄存器的拷貝。

常用的CPU類型編譯器選項

CPU類型CPU類型選項FP選項FP + SIMD選項備注
Cortex-A5-mcpu=cortex-a5-mfpu=vfpv3-fp16
-mfpu=vfpv3-d16-fp16
-mfpu=neon-fp16-d16表明只有前16個浮點寄存器可用
Cortex-A7-mcpu=cortex-a7-mfpu=vfpv4
-mfpu=vfpv4-d16
-mfpu=neon-vfpv4-fp16表明支持16bit半精度浮點操作
Cortex-A8-mcpu=cortex-a8-mfpu=vfpv3-mfpu=neon?
Cortex-A9-mcpu=cortex-a9-mfpu=vfpv3-fp16
-mfpu=vfpv3-d16-fp16
-mfpu=neon-fp16?
Cortex-A15-mcpu=cortex-a15-mfpu=vfpv4-mfpu=neon-vfpv4?

常用的gcc組合編譯器選項

Cortex-A15 with a NEON unit

arm-gcc -O3 -mcpu=cortex-a15 -mfpu=neon-vfpv4 -mfloat-abi=hard -ffast-math -omyprog.exe myprog.c
  • ?

Cortex-A9 with a NEON unit

arm-gcc -O3 -mcpu=cortex-a9 -mfpu=neon-vfpv3-fp16 -mfloat-abi=hard -ffast-math -omyprog.exe myprog.c
  • ?

Cortex-A7 without a NEON unit

arm-gcc -O3 -mcpu=cortex-a7 -mfpu=vfpv4-d16 -mfloat-abi=softfp -ffast-math -omyprog2.exe myprog2.c
  • ?

Cortex-A8 without a NEON unit

arm-gcc -O3 -mcpu=cortex-a8 -mfloat-abi=soft -c -o myfile.omyfile.c
  • ?

NEON匯編和EABI程序調用規范

  GNU assembler (gas) and ARM Compiler toolchain assembler(armasm)都支持NEON指令的匯編。但必須遵循ARMEmbedded Application Binary Interface (EABI)EABI的規范,即NEON寄存器的S0-S15 (D0-D7, Q0-Q3)用于傳遞參數和返回值,被調用函數內可以直接使用,不用保存;D16-D31 (Q8-Q15)則有調用函數來保存,被調用函數內可以不保存的隨意使用;而S16-S31(D8-D15, Q4-Q7)則必須由被調用函數內部保存。對于調用傳參規范則有,對于軟件浮點,參數有R0~R3和堆棧stack傳遞,而硬件浮點,可以通過NEON寄存器來傳遞參數。

NEON硬件檢測和使能

編譯時指定NEON單元是否存在

  ARM編譯器(armcc)從4.0之后就支持在某些處理器和FPU的選項中預定義宏ARM_NEON, armasm的宏TARGET_FEATURE_NEON.

運行時指定檢測NEON單元

  OS內可以檢測NEON單元是否存在,如Linux下cat /proc/cpuinfo看是否包含NEON或者VFP,
  如Tegra2 (雙核 Cortex-A9 帶 FPU),

# cat /proc/cpuinfo Features : swp half thumb fastmult vfp edsp thumbee vfpv3vfpv3d16
  • ?

  四核 Cortex-A9 帶NEON單元

# cat /proc/cpuinfo Features : swp half thumb fastmult vfp edsp thumbee neonvfpv3
  • ?

  另外,可以查看/proc/self/auxv,這里會包含二進制格式的hwcap,可以通過AT_HWCAP來搜索到。HWCAP_NEON bit (4096).另外如Ubuntu的發布在路徑/lib/neon/vfp下包含lib的NEON優化版本。

Bare-metal模式下使能NEON

#include <stdio.h> // Bare-minimum start-up code to run NEON code __asm void EnableNEON(void) { MRC p15,0,r0,c1,c0,2 // Read CPAccess register ORR r0,r0,#0x00f00000 // Enablefull access to NEON/VFP by enabling access to// Coprocessors 10 and 11 MCR p15,0,r0,c1,c0,2 // Write CPAccess registerISB MOV r0,#0x40000000 // Switch onthe VFP and NEON hardware MSR FPEXC,r0 // Set EN bit inFPEXC }

  下面的EnableNEON函數使能NEON協處理器;使用下面的編譯選擇就能在bare-metal下使能NEON

armcc -c --cpu=Cortex-A8 --debug hello.c -o hello.o armlink --entry=EnableNEON hello.o -o hello.axf
  • ?

系統運行時使能NEON

  內核在遇到第一個NEON指令時會產生一個UndefinedInstruction的異常,這會讓內核自動重啟NEON協處理器,內核還可以在上下文切換時關閉NEON來省電。

Linux內核的NEON配置


          圖1. NEON的Linux內核配置

  使能NEON,需要選擇以下選項

  Floating point emulation → VFP-format floating point maths
  Floating pointemulation → Advanced SIMD (NEON) Extension
  
  檢查Linux的配置文件來確認內核是否使能NEON
  zcat /proc/config.gz | grep NEON
  看是否存在
  CONFIG_NEON=y
  
  確認處理器是否支持NEON
  cat /proc/cpuinfo | grep neon
  看是否有如下內容
  Features : swp half thumb fastmult vfp edsp neon vfpv3 tlsvfpv4 idiva idivt

向量化NEON優化指南

避免指針混疊alias

  C90不要求指針位置,不同指針可以指向相同的內存區域,C99中引入了__restrict關鍵字來表明只有這個指針能指向它工作的區域。

告訴編譯器循環信息

  如循環是否某個整數的整數倍,以方便向量化;如下表明循環次數是4的整數倍:

for(i=0 ; i < (len & ~3) ; i++) { ... } for (i=0; i<(items*4); i+=1) { ... }

循環展開

#pragma unroll (n)
  • ?

采用NEON Intrinsics

  armcc, GCC/g++和llvm等編譯器都支持 NEON C/C++ intrinsics,并且采用相同的語法規范。因而代碼可以在各個編譯器間共享。NEON Intrinsics的代碼容易維護而且效率高。NEON Intrinsics采用新的數據類型,這些類型對應于D和Q寄存器。NEONIntrinsics寫起來像是函數調用但對應于每一條NEON指令。編程NEON Intrinsics時不用考慮具體的寄存器分配和代碼的schedule,pipeline流水安排等。但NEON Intrinsics往往不能產生想象的代碼,性能上相比純匯編要稍差一些。

減少循環內的相關性

  如果當前迭代時使用的數據是上次迭代計算的結果,就產生了迭代間的相關性,可以拆分循環來減少相關。

向量化其他準則

  短小的循環更容易讓編譯器實現自動向量化; 避免在循環內使用break退出循環 避免在循環內使用過多的條件語句,減少可能產生的條件跳轉; 讓循環次數盡可能是2的冪次 讓編譯器知曉循環次數,減少對循環次數為0等的判斷; 循環內調用的函數盡量inline內聯 使用數組+索引的方式訪問比指針形式更容易向量化; 間接尋址(多重索引)不會向量化; 使用restrict關鍵字來告訴編譯器沒有重疊的內存區域;

總結

  本文介紹了ARM平臺基于ARM v7-A架構的ARM Cortex-A系列處理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9, Cortex-A15)上的NEON多媒體處理硬件加速器針對C/C++語言、匯編語言和NEON intrinsics如何編譯和優化,包含如何向量化、向量化的ARMCC和GCC編譯器選項、NEON的匯編和EABI程序調用規范、如何在bare-metal和Linux操作系統上檢測NEON硬件、如何指導編譯器進行向量化NEON指令的優化等內容。

總結

以上是生活随笔為你收集整理的NEON指令优化指南学习之一的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 2020av视频| 天天草天天干 | 老司机激情视频 | 日韩欧美在线视频观看 | 亚洲第一天堂av | 吃奶在线观看 | www.好了av| 香蕉网久久 | 国产精品一区在线免费观看 | 日韩一区二区免费在线观看 | 日韩精品极品视频免费观看 | 色老汉视频| 91狠狠干 | 免费色av| 日本中文字幕影院 | 国产精品久久久久久妇女 | 国产suv精品一区二区三区 | 涩里番在线观看 | 喷水在线观看 | 精品国产日本 | 日本丰满肉感bbwbbwbbw | 亚洲一区二区色 | 天天舔天天爽 | 久久蜜桃精品 | 日本加勒比一区二区 | 国产伦精品 | 免费毛片看 | 欧洲精品免费一区二区三区 | 高清欧美性猛交xxxx | 曰本三级日本三级日本三级 | 看片地址| 国产视频一区在线播放 | 野外做受又硬又粗又大视频√ | 蜜桃精品噜噜噜成人av | 97xxxxx | 熟妇一区二区三区 | 91精品视频在线播放 | 靠逼视频免费网站 | 舐め犯し波多野结衣在线观看 | 亚洲永久在线观看 | 亚洲天堂一区二区在线 | 手机在线永久免费观看av片 | 日本高清不卡在线观看 | av导航网 | 亚洲一级在线播放 | 九色porny自拍视频 | 日批的视频 | 少妇又紧又色又爽又刺激视频 | 国产福利片一区二区 | 五月婷婷激情四射 | 亚洲午夜精品一区二区三区他趣 | 欧美视频免费在线 | 欧美午夜精品一区二区 | 女女调教被c哭捆绑喷水百合 | 九九午夜视频 | www毛片 | 精品国产视频一区二区 | h在线免费观看 | 毛片一区二区三区 | av线上免费观看 | 99久精品视频 | 茄子av | 一本大道久久a久久精二百 琪琪色在线视频 | 中文字幕在线播放一区二区 | 日本老太婆做爰视频 | 国模私拍视频在线 | 国产femdom调教7777 | 亚洲涩视频 | 日韩福利电影在线观看 | 97久久综合 | 国产精品夫妻自拍 | 欧美人妻一区二区三区 | 偷拍精品一区二区三区 | 婷婷av一区二区三区 | 亚洲av无码一区二区乱子伦 | 亚洲毛片在线免费观看 | 一区二区三区在线 | 中文字幕avav| 欧美 日韩 国产 成人 在线 | 午夜免费看视频 | 国产欧美精品一区二区色综合 | 丝袜国产在线 | 丁香婷婷六月 | 一本大道伊人av久久综合 | 免费国产黄色 | 久久久久久久国产精品毛片 | 日韩人成 | 午夜羞羞羞 | 在线a天堂 | 欧美精品一区二区久久婷婷 | 亚洲va久久久噜噜噜久久天堂 | 亚洲一区精品在线观看 | 91大神网址 | 日韩福利视频 | 爽天天天天天天天 | 椎名由奈av一区二区三区 | 精品一区二区三区无码按摩 | 国产一级高清 | 国产视频97 |