ARM Cortex系列(A8/A9/A15/A7) NEON多媒體處理SIMD引擎優(yōu)化
圖1. ARM體系結(jié)構(gòu)的演進(jìn)
Cortex-A9處理器簡介
圖2. Coretex-A9處理器的架構(gòu)框圖(View Larger Cortex-A9處理器Image)
Cortex-A9是性能最高的ARM處理器,可實(shí)現(xiàn)受到廣泛支持的ARMv7體系結(jié)構(gòu)的豐富功能。Cortex-A9處理器的設(shè)計(jì)旨在打造最先進(jìn)的、高效率的、長度動態(tài)可變的、多指令執(zhí)行超標(biāo)量體系結(jié)構(gòu),提供采用亂序猜測方式執(zhí)行的8階段管道處理器,憑借范圍廣泛的消費(fèi)類、網(wǎng)絡(luò)、企業(yè)和移動應(yīng)用中的前沿產(chǎn)品所需的功能,它可以提供史無前例的高性能和高能效。ARMCortex?-A9處理器提供了史無前例的高性能和高能效,從而使其成為需要在低功耗或散熱受限的成本敏感型設(shè)備中提供高性能的設(shè)計(jì)的理想解決方案。它既可用作單核處理器,也可用作可配置的多核處理器,同時可提供可合成或硬宏實(shí)現(xiàn)。該處理器適用于各種應(yīng)用領(lǐng)域,從而能夠?qū)Χ鄠€市場進(jìn)行穩(wěn)定的軟件投資。
Cortex-A9微體系結(jié)構(gòu)既可用于可伸縮的多核處理器(Cortex-A9 MPCore?多核處理器),也可用于更傳統(tǒng)的處理器(Cortex-A9單核處理器)??缮炜s的多核處理器和單核處理器支持16、32或64KB 4路關(guān)聯(lián)的L1高速緩存配置,對于可選的L2高速緩存控制器,最多支持8MB的L2高速緩存配置,它們具有極高的靈活性,均適用于特定應(yīng)用領(lǐng)域和市場。
下載Cortex-A9白皮書
窗體頂端
與高性能計(jì)算平臺消耗的功率相比,ARM Cortex-A9處理器可提供功率更低的卓越功能,其中包括:
- 無與倫比的性能,2GHz標(biāo)準(zhǔn)操作可提供TSMC 40G硬宏實(shí)現(xiàn)
- 以低功耗為目標(biāo)的單核實(shí)現(xiàn),面向成本敏感型設(shè)備
- 利用高級MPCore技術(shù),最多可擴(kuò)展為4個一致的內(nèi)核
- 可選NEON?媒體和/或浮點(diǎn)處理引擎
通過共享以下常見需求,Cortex-A9處理器可提供滿足各種不同市場應(yīng)用需求的可擴(kuò)展解決方案,包括移動手機(jī)以及高性能的消費(fèi)類產(chǎn)品和企業(yè)產(chǎn)品:
- 通過提高性能、降低功耗來提高能效;
- 提高最高性能,滿足要求更高的應(yīng)用需求;
- 能夠在多個設(shè)備之間共享軟件和工具投資;
Cortex-A9 MPCore多核處理器集成了經(jīng)驗(yàn)證非常成功的ARM MPCore技術(shù)以及更多增強(qiáng)功能,以此簡化了多核解決方案,并使其應(yīng)用范圍得到擴(kuò)展。Cortex-A9 MPCore處理器可提供史無前例的可擴(kuò)展的最高性能,同時還支持靈活設(shè)計(jì)和新功能,從而進(jìn)一步降低和控制處理器和系統(tǒng)級的能耗。借助Cortex-A9 MPCore處理器的定向?qū)崿F(xiàn),移動設(shè)備的最高性能還可在現(xiàn)在的解決方案的基礎(chǔ)上不斷提高,具體方法是:利用設(shè)計(jì)靈活性和ARM MPCore技術(shù)提供的高級功率管理技術(shù),在散熱受限以及移動電源預(yù)算緊張的情況下維持運(yùn)行。使用可伸縮的最高性能,該處理器可超過現(xiàn)今類似的高性能嵌入式設(shè)備的性能,并可在拓寬市場的基礎(chǔ)上進(jìn)行穩(wěn)定的軟件投資。
Cortex-A9多核處理器是首款結(jié)合了Cortex應(yīng)用級架構(gòu)以及用于可擴(kuò)展性能的多處理能力的ARM處理器,提供了下列增強(qiáng)的多核技術(shù):
*加速器一致性端口(ACP),用于提高系統(tǒng)性能和降低系統(tǒng)能耗
*先進(jìn)總線接口單元(Advanced Bus Interface Unit),用于在高帶寬設(shè)備中實(shí)現(xiàn)低延遲時間
*多核TrustZone® 技術(shù),結(jié)合中斷虛擬,允許基于硬件的安全和加強(qiáng)的類虛擬(paravirtualization)解決方案
*通用中斷控制器(GIC),用于軟件移植和優(yōu)化的多核通信
Cortex-A9 NEON媒體處理引擎(MPE)
Cortex-A9 MPE可用于任一Cortex-A9處理器,并可提供一個具有Cortex-A9浮點(diǎn)單元的性能和功能以及NEON高級SIMD指令集實(shí)現(xiàn)的引擎,以便進(jìn)一步提高媒體和信號處理功能的速度。MPE可擴(kuò)展Cortex-A9處理器的浮點(diǎn)單元(FPU),提供一個quad-MAC以及附加的64位和128位寄存器集,在每個周期8位、16位和32位整型以及32位浮點(diǎn)數(shù)據(jù)量的基礎(chǔ)上支持一組豐富的SIMD操作。
Cortex-A9浮點(diǎn)單元(FPU)
在與任一Cortex-A9處理器一起實(shí)現(xiàn)時,F(xiàn)PU可提供與ARM VFPv3體系結(jié)構(gòu)兼容的高性能的單雙精度浮點(diǎn)指令,該體系結(jié)構(gòu)是與上一代ARM浮點(diǎn)協(xié)處理器兼容的軟件。
物理IP:提供在Cortex-A9處理器上實(shí)現(xiàn)低功耗、高性能應(yīng)用所需的眾多標(biāo)準(zhǔn)單元庫和存儲器。標(biāo)準(zhǔn)單元包括功耗管理工具包,可實(shí)現(xiàn)動態(tài)和漏泄功耗節(jié)省技術(shù),例如時鐘門控、多電壓島和功率門控。還提供具有先進(jìn)的功耗節(jié)省功能的存儲編譯器。
· Fabric IP:Cortex-A9處理器得到廣泛的PrimeCell® fabric IP元件的支持。這些元件包括:一個動態(tài)存儲控制器、一個靜態(tài)存儲控制器、一個AMBA® 3 AXI可配置的內(nèi)部互連及一個優(yōu)化的L2 Cache 控制器,用于匹配Cortex-A9處理器在高頻設(shè)計(jì)中的性能和吞吐能力。
· 圖形加速: ARM Mali? 圖形處理單元及Cortex-A9處理器的組合,將使得SoC合作活動能夠創(chuàng)造高度整合的系統(tǒng)級解決方案,帶來最佳的尺寸、性能和系統(tǒng)帶寬優(yōu)勢。
· 系統(tǒng)設(shè)計(jì):ARM RealView® SoC Designer工具提供快速的架構(gòu)優(yōu)化和性能分析,并允許在硬件完成以前很長時間即可進(jìn)行軟件驅(qū)動程序和對時間要求很嚴(yán)格的代碼的早期開發(fā)。RealView系統(tǒng)發(fā)生器(RealView System Generator)工具為基于Cortex-A9處理器的虛擬平臺的采用提供超快建模能力。Realview工具中關(guān)于Cortex-A9處理器的基于周期的(cycle based)及程序員視角的模型將于2008年第二季度上市。
· 調(diào)試: ARM CoreSight?片上技術(shù)加速了復(fù)雜調(diào)試的時間,縮短了上市時間。程序追蹤宏單元技術(shù)(Program Trace Macrocell technology)具有程序流追蹤能力,能夠?qū)⑻幚砥鞯闹噶盍魍耆梢暬?,同時配置與ARMv7架構(gòu)兼容的調(diào)試接口,實(shí)現(xiàn)工具標(biāo)準(zhǔn)化和更高的調(diào)試性能。用于Cortex-A9處理器的CoreSight設(shè)計(jì)工具包擴(kuò)展了其調(diào)試和追蹤能力,以涵蓋整個片上系統(tǒng),包括多個ARM處理器、DSP以及智能外設(shè)。
· 軟件開發(fā):ARM RealView開發(fā)套件(ARM RealView Development Suite)包括先進(jìn)的代碼生成工具,為Cortex-A9處理器提供卓越的性能和無以比擬的代碼密度。這套工具還支持矢量編譯,用于NEON媒體和信號處理擴(kuò)展集,使得開發(fā)者無需使用獨(dú)立的DSP,從而降低產(chǎn)品和項(xiàng)目成本。包括先進(jìn)的交叉觸發(fā)在內(nèi)的Cortex-A9 MPCore多核處理器調(diào)試得到RealView ICE和Trace產(chǎn)品的支持,同時也得到一系列硬件開發(fā)板的支持,用于FPGA系統(tǒng)原型設(shè)計(jì)和軟件開發(fā)。
作為許多下一代設(shè)備的核心,Cortex-A9處理器通常與許多其他IP塊集成。
系統(tǒng)IP
系統(tǒng)IP組件對于在芯片上構(gòu)建復(fù)雜的系統(tǒng)至關(guān)重要,通過利用系統(tǒng)IP組件,開發(fā)人員可以顯著縮短開發(fā)和驗(yàn)證周期,從而節(jié)約成本并縮短產(chǎn)品的上市時間。
工具支持
所有ARM處理器均受ARM RealView?系列開發(fā)工具以及各種第三方工具、操作系統(tǒng)和EDA供應(yīng)商的支持。ARM RealView工具獨(dú)一無二,所提供的解決方案涉及從概念到最終產(chǎn)品部署的整個開發(fā)過程。
圖3. 基于Coretex-A9核的主要芯片
NEON多媒體SIMD引擎簡介
NEON是一個SIMD數(shù)據(jù)處理架構(gòu),256字節(jié)的寄存器堆包含32個64-bit位寬的寄存器或者16個128-bit位寬的寄存器。所有的寄存器都被視為具有相同數(shù)據(jù)類型的一個向量,支持的數(shù)據(jù)類型包括有符號或者無符號的8-bit、16-bit、32-bit和64-bit的整型數(shù)據(jù)或者單精度浮點(diǎn)數(shù)據(jù)。NEON指令都是針對相同數(shù)據(jù)類型的通道處理的,即所有通道執(zhí)行相同的指令操作。如下圖4所示。
圖4. ARM NEON處理器的SIMD操作
NEON的寄存器組:NEON和VFPv3 浮點(diǎn)協(xié)處理器共享寄存器組,這些寄存器和ARM核的寄存器截然不同,NEON還會采用ARM的寄存器作為地址寄存器間接尋址。圖5是NEON寄存器的視圖,16個128-bit的4字節(jié)寄存器Q0~Q15,或者32個64bit的雙字寄存器D0~D31,VFPv3的寄存器堆還有32個32-bit的寄存器S0~S31.
圖5. NEON和VFPv3協(xié)處理器的寄存器堆視圖
NEON指令支持的操作數(shù)類型包括:有符號或者無符號的8-bit、16-bit、32-bit和64-bit的整型數(shù)據(jù)(I8、S8、U8、I16、S16、U16、I32、S32、U32、I64、S64、U64)或者單精度浮點(diǎn)數(shù)據(jù)(F32)。
圖6. 單個寄存器組的元素分配
NEON支持的一些數(shù)據(jù)訪問:支持非對齊訪問但對齊的訪問速度更快,可以通過訪問@bits來指定地址對齊的位數(shù),如@32、@64、@128等。加載和存儲支持打包的數(shù)據(jù)類型,即可以有2、3、4個通道的interleave的數(shù)據(jù)加載和存儲,還能在標(biāo)量和向量間進(jìn)行數(shù)據(jù)的移動,但是速度比較慢、還能支持單精度浮點(diǎn)的數(shù)據(jù)運(yùn)算。
NEON指令集
圖7. NEON的線性加載和存儲指令
圖8. 交織的數(shù)據(jù)加載和存儲指令
圖9. 使用結(jié)構(gòu)化的加載指令加載RGB數(shù)據(jù)
vld1.32 {d16-d19}, [r1]!
vmul.f32 q12, q8, d0[0]
vmla.f32 q12, q9, d0[1]
vst1.32 {d24-d27}, [r0]!
NEON的并行優(yōu)化方法
ARM編譯器優(yōu)化方法
NEON并行化和向量化的編譯選項(xiàng):ARM RVDS 3.0以上版本或者DS-5使用編譯選項(xiàng)armcc --vectorize或者Codesourcery 2007q3之后的gcc版本使用如下編譯選項(xiàng)使能vfp:-mcpu=cortex-a8 -mtune=cortex-a8 -O3 -mfloat-abi=softfp -mfpu=vfp或者使用-mcpu=cortex-a8 -mtune=cortex-a8 -O3 -mfloat-abi=softfp -mfpu=neon -ftree-vectorize來使能NEON的并行處理。一般認(rèn)為RVDS或者DS-5編譯器的armcc針對并行處理性能很差,即使調(diào)整算法的結(jié)構(gòu)以適合編譯器進(jìn)行NEON指令的優(yōu)化,但是生成的代碼還是難以讓人滿意。而GCC的自動并行化處理的結(jié)果性能更差,針對Android開發(fā),只能采用Google提供的NDK的GCC工具鏈可以用來開發(fā)。但ARM EABI提供了編譯器支持的C內(nèi)聯(lián)intrinsics??梢詤⒖糀RM V7-A的 ABI手冊以及arm_neon.h文件。
ARM匯編器的優(yōu)化方法
使用NEON的intrinsic指令進(jìn)行優(yōu)化需要對NEON的指令集非常熟悉,而且使用intrinsics沒法控制寄存器分配和內(nèi)存對齊等,因而很多的NEON的優(yōu)化還是基于匯編代碼。當(dāng)然手工寫匯編代碼總是需要很多的額外開銷的,而且還要了解ARM EABI編程規(guī)范。
NEON編程優(yōu)化的基本方法
一般NEON優(yōu)化是針對需要大量數(shù)據(jù)處理的函數(shù),而函數(shù)的基本操作都是先加載數(shù)據(jù),然后進(jìn)行數(shù)據(jù)處理,最后把計(jì)算的結(jié)果保存到內(nèi)存。首先針對NEON數(shù)據(jù)的加載和存儲,可以參考http://houh-1984.blog.163.com/blog/static/3112783420111159169507/,即適當(dāng)考慮結(jié)構(gòu)化的加載/存儲以有效的進(jìn)行數(shù)據(jù)加載成為有利于并行處理的方式,當(dāng)然除了數(shù)據(jù)加載有利于并行處理,還要考慮數(shù)據(jù)加載有利于cache性能的優(yōu)化。然后采用NEON指令進(jìn)行計(jì)算,針對數(shù)據(jù)訪問,可以考慮使用Q0~Q3的參數(shù)寄存器以及Q8~Q15寄存器,而對于Q4~Q7寄存器則必須根據(jù)EABI的規(guī)范在函數(shù)調(diào)用內(nèi)保存。
另外就是關(guān)需數(shù)據(jù)的加載類型,一個是數(shù)據(jù)的對齊,雖然NEON完全支持非對齊訪問,但是對齊數(shù)據(jù)一個是有利于加載、存儲,另外一個是也更c(diǎn)ache友好,非對齊的數(shù)據(jù)訪問要消耗更多的時鐘周期尤其是在非對齊還要跨越cache行的情況下,數(shù)據(jù)對齊方式可以采用[
Vld1.8 {D0}, [R1:64]
Vld1.8 {D0,D1}, [R1:128]!
Vld1.8 {D0,D1,D2,D3}, [R2:256]!,R3
Cortex-A8和Cortex-A9的多指令并發(fā)有所不同,A8是每次并發(fā)兩次fetch,而A9除了多次并發(fā)外,還能亂序執(zhí)行,因而指令重排的優(yōu)化非常重要。一般而言NEON的SIMD優(yōu)化能提高至少2倍的系統(tǒng)性能,取決于實(shí)際處理的位寬。
http://houh-1984.blog.163.com/
http://baike.baidu.com/view/2937500.htm
http://www.arm.com/zh/products/processors/cortex-a/cortex-a9.php
Cortex-A9的NEON多媒體處理器是基于ARMv7的SIMD(Single Instruction Multiple Data)和向量浮點(diǎn)VFPv3(Vector Floating-Point)指令集的,在具體的芯片設(shè)計(jì)中NEON組件是可選的,NEON處理器是面向音頻、視頻編解碼器、圖像處理和語音信號處理以及其他的基帶等信息處理領(lǐng)域的。 本文介紹了NEON處理器的基本架構(gòu)、NEON處理器的并發(fā)情況下Cortex-A8和Cortex-A9的區(qū)別、NEON的寄存器組和數(shù)據(jù)類型、NEON編程的針對編譯器、匯編器的優(yōu)化方法以及其他的提高性能的并行方法。
評論