1. 程式人生 > >ARM Cortex系列(A8/A9/A15/A7) NEON多媒體處理SIMD引擎優化

ARM Cortex系列(A8/A9/A15/A7) NEON多媒體處理SIMD引擎優化

Cortex-A9的NEON多媒體處理器是基於ARMv7的SIMD(Single Instruction Multiple Data)和向量浮點VFPv3(Vector Floating-Point)指令集的,在具體的晶片設計中NEON元件是可選的,NEON處理器是面向音訊、視訊編解碼器、影象處理和語音訊號處理以及其他的基帶等資訊處理領域的。 本文介紹了NEON處理器的基本架構、NEON處理器的併發情況下Cortex-A8和Cortex-A9的區別、NEON的暫存器組和資料型別、NEON程式設計的針對編譯器、彙編器的優化方法以及其他的提高效能的並行方法。

圖1. ARM體系結構的演進

Cortex-A9
處理器簡介

2. Coretex-A9處理器的架構框圖(View Larger Cortex-A9 處理器 Image)

Cortex-A9 是效能最高的 ARM 處理器,可實現受到廣泛支援的 ARMv7 體系結構的豐富功能。Cortex-A9 處理器的設計旨在打造最先進的、高效率的、長度動態可變的、多指令執行超標量體系結構,提供採用亂序猜測方式執行的 8 階段管道處理器,憑藉範圍廣泛的消費類、網路、企業和移動應用中的前沿產品所需的功能,它可以提供史無前例的高效能和高能效。ARM Cortex?-A9 處理器提供了史無前例的高效能和高能效,從而使其成為需要在低功耗或散熱受限的成本敏感型裝置中提供高效能的設計的理想解決方案。它既可用作單核處理器,也可用作可配置的多核處理器,同時可提供可合成或硬巨集實現。該處理器適用於各種應用領域,從而能夠對多個市場進行穩定的軟體投資。

Cortex-A9 微體系結構既可用於可伸縮的多核處理器(Cortex-A9 MPCore? 多核處理器),也可用於更傳統的處理器(Cortex-A9 單核處理器)。可伸縮的多核處理器和單核處理器支援 1632 64KB 4 路關聯的 L1 快取記憶體配置,對於可選的 L2 快取記憶體控制器,最多支援 8MB L2 快取記憶體配置,它們具有極高的靈活性,均適用於特定應用領域和市場。

窗體頂端

與高效能運算平臺消耗的功率相比,ARM Cortex-A9 處理器可提供功率更低的卓越功能,其中包括:

  • 無與倫比的效能,2GHz 標準操作可提供 TSMC 40G 硬巨集實現
  • 以低功耗為目標的單核實現,面向成本敏感型裝置
  • 利用高階 MPCore 技術,最多可擴充套件為 4 個一致的核心
  • 可選 NEON? 媒體和/浮點處理引擎

通過共享以下常見需求,Cortex-A9 處理器可提供滿足各種不同市場應用需求的可擴充套件解決方案,包括移動手機以及高效能的消費類產品和企業產品:

  • 通過提高效能、降低功耗來提高能效;
  • 提高最高效能,滿足要求更高的應用需求;
  • 能夠在多個裝置之間共享軟體和工具投資;

Cortex-A9 MPCore 多核處理器集成了經驗證非常成功的 ARM MPCore 技術以及更多增強功能,以此簡化了多核解決方案,並使其應用範圍得到擴充套件。Cortex-A9 MPCore 處理器可提供史無前例的可擴充套件的最高效能,同時還支援靈活設計和新功能,從而進一步降低和控制處理器和系統級的能耗。藉助 Cortex-A9 MPCore 處理器的定向實現,移動裝置的最高效能還可在現在的解決方案的基礎上不斷提高,具體方法是:利用設計靈活性和 ARM MPCore 技術提供的高階功率管理技術,在散熱受限以及移動電源預算緊張的情況下維持執行。使用可伸縮的最高效能,該處理器可超過現今類似的高效能嵌入式裝置的效能,並可在拓寬市場的基礎上進行穩定的軟體投資。

Cortex-A9多核處理器是首款結合了Cortex應用級架構以及用於可擴充套件效能的多處理能力的ARM處理器,提供了下列增強的多核技術:

  *加速器一致性埠(ACP),用於提高系統性能和降低系統能耗

  *先進匯流排介面單元(Advanced Bus Interface Unit),用於在高頻寬裝置中實現低延遲時間

  *多核TrustZone® 技術,結合中斷虛擬,允許基於硬體的安全和加強的類虛擬(paravirtualization)解決方案

*通用中斷控制器(GIC),用於軟體移植和優化的多核通訊

Cortex-A9 NEON 媒體處理引擎 (MPE)

Cortex-A9 MPE 可用於任一 Cortex-A9 處理器,並可提供一個具有 Cortex-A9 浮點單元的效能和功能以及 NEON 高階 SIMD 指令集實現的引擎,以便進一步提高媒體和訊號處理功能的速度。MPE 可擴充套件 Cortex-A9 處理器的浮點單元 (FPU),提供一個 quad-MAC 以及附加的 64 位和 128 位暫存器集,在每個週期 8 位、16 位和 32 位整型以及 32 位浮點資料量的基礎上支援一組豐富的 SIMD 操作。

Cortex-A9 浮點單元 (FPU)

在與任一 Cortex-A9 處理器一起實現時,FPU 可提供與 ARM VFPv3 體系結構相容的高效能的單雙精度浮點指令,該體系結構是與上一代 ARM 浮點協處理器相容的軟體。

物理IP:提供在Cortex-A9處理器上實現低功耗、高效能應用所需的眾多標準單元庫和儲存器。標準單元包括功耗管理工具包,可實現動態和漏洩功耗節省技術,例如時鐘門控、多電壓島和功率門控。還提供具有先進的功耗節省功能的儲存編譯器

  · Fabric IP:Cortex-A9處理器得到廣泛的PrimeCell® fabric IP元件的支援。這些元件包括:一個動態儲存控制器、一個靜態儲存控制器、一個AMBA® 3 AXI可配置的內部互連及一個優化的L2 Cache 控制器,用於匹配Cortex-A9處理器在高頻設計中的效能和吞吐能力。

  · 圖形加速: ARM Mali? 圖形處理單元及Cortex-A9處理器的組合,將使得SoC合作活動能夠創造高度整合的系統級解決方案,帶來最佳的尺寸、效能和系統頻寬優勢。

  · 系統設計:ARM RealView® SoC Designer工具提供快速的架構優化和效能分析,並允許在硬體完成以前很長時間即可進行軟體驅動程式和對時間要求很嚴格的程式碼的早期開發。RealView系統發生器(RealView System Generator)工具為基於Cortex-A9處理器的虛擬平臺的採用提供超快建模能力。Realview工具中關於Cortex-A9處理器的基於週期的(cycle based)及程式設計師視角的模型將於2008年第二季度上市。

  · 除錯: ARM CoreSight?片上技術加速了複雜除錯的時間,縮短了上市時間。程式追蹤巨集單元技術(Program Trace Macrocell technology)具有程式流追蹤能力,能夠將處理器的指令流完全視覺化,同時配置與ARMv7架構相容的除錯介面,實現工具標準化和更高的除錯效能。用於Cortex-A9處理器的CoreSight設計工具包擴充套件了其除錯和追蹤能力,以涵蓋整個片上系統,包括多個ARM處理器、DSP以及智慧外設。

 · 軟體開發:ARM RealView開發套件(ARM RealView Development Suite)包括先進的程式碼生成工具,為Cortex-A9處理器提供卓越的效能和無以比擬的程式碼密度。這套工具還支援向量編譯,用於NEON媒體和訊號處理擴充套件集,使得開發者無需使用獨立的DSP,從而降低產品和專案成本。包括先進的交叉觸發在內的Cortex-A9 MPCore多核處理器除錯得到RealView ICE和Trace產品的支援,同時也得到一系列硬體開發板的支援,用於FPGA系統原型設計和軟體開發。

作為許多下一代裝置的核心,Cortex-A9 處理器通常與許多其他 IP 塊整合。

系統 IP

系統 IP元件對於在晶片上構建複雜的系統至關重要,通過利用系統 IP 元件,開發人員可以顯著縮短開發和驗證週期,從而節約成本並縮短產品的上市時間。

工具支援

所有 ARM 處理器均受系列開發工具以及各種第三方工具、作業系統和 EDA 供應商的支援。ARM RealView 工具獨一無二,所提供的解決方案涉及從概念到最終產品部署的整個開發過程。

圖3. 基於Coretex-A9核的主要晶片

NEON 多媒體SIMD引擎簡介

NEON是一個SIMD資料處理架構,256位元組的暫存器堆包含32個64-bit位寬的暫存器或者16個128-bit位寬的暫存器。所有的暫存器都被視為具有相同資料型別的一個向量,支援的資料型別包括有符號或者無符號的8-bit、16-bit、32-bit和64-bit的整型資料或者單精度浮點資料。NEON指令都是針對相同資料型別的通道處理的,即所有通道執行相同的指令操作。如下圖4所示。

圖4. ARM NEON處理器的SIMD操作

NEON的暫存器組:NEON和VFPv3 浮點協處理器共享暫存器組,這些暫存器和ARM核的暫存器截然不同,NEON還會採用ARM的暫存器作為地址暫存器間接定址。圖5是NEON暫存器的檢視,16個128-bit的4位元組暫存器Q0~Q15,或者32個64bit的雙字暫存器D0~D31,VFPv3的暫存器堆還有32個32-bit的暫存器S0~S31.

圖5. NEON和VFPv3協處理器的暫存器堆檢視

NEON指令支援的運算元型別包括:有符號或者無符號的8-bit、16-bit、32-bit和64-bit的整型資料(I8、S8、U8、I16、S16、U16、I32、S32、U32、I64、S64、U64)或者單精度浮點資料(F32)。

圖6. 單個暫存器組的元素分配

NEON支援的一些資料訪問:支援非對齊訪問但對齊的訪問速度更快,可以通過訪問@bits來指定地址對齊的位數,如@32、@64、@128等。載入和儲存支援打包的資料型別,即可以有2、3、4個通道的interleave的資料載入和儲存,還能在標量和向量間進行資料的移動,但是速度比較慢、還能支援單精度浮點的資料運算。

NEON 指令集

圖7. NEON的線性載入和儲存指令

圖8. 交織的資料載入和儲存指令

圖9. 使用結構化的載入指令載入RGB資料

vld1.32 {d16-d19}, [r1]!

vmul.f32 q12, q8, d0[0]

vmla.f32 q12, q9, d0[1]

vst1.32 {d24-d27}, [r0]!

NEON的並行優化方法

ARM編譯器優化方法

NEON並行化和向量化的編譯選項:ARM RVDS 3.0以上版本或者DS-5使用編譯選項armcc --vectorize或者Codesourcery 2007q3之後的gcc版本使用如下編譯選項使能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的並行處理。一般認為RVDS或者DS-5編譯器的armcc針對並行處理效能很差,即使調整演算法的結構以適合編譯器進行NEON指令的優化,但是生成的程式碼還是難以讓人滿意。而GCC的自動並行化處理的結果效能更差,針對Android開發,只能採用Google提供的NDK的GCC工具鏈可以用來開發。但ARM EABI提供了編譯器支援的C內聯intrinsics。可以參考ARM V7-A的 ABI手冊以及arm_neon.h檔案。

ARM彙編器的優化方法

使用NEON的intrinsic指令進行優化需要對NEON的指令集非常熟悉,而且使用intrinsics沒法控制暫存器分配和記憶體對齊等,因而很多的NEON的優化還是基於彙編程式碼。當然手工寫彙編程式碼總是需要很多的額外開銷的,而且還要了解ARM EABI程式設計規範。

NEON程式設計優化的基本方法

一般NEON優化是針對需要大量資料處理的函式,而函式的基本操作都是先載入資料,然後進行資料處理,最後把計算的結果儲存到記憶體。首先針對NEON資料的載入和儲存,可以參考http://houh-1984.blog.163.com/blog/static/3112783420111159169507/,即適當考慮結構化的載入/儲存以有效的進行資料載入成為有利於並行處理的方式,當然除了資料載入有利於並行處理,還要考慮資料載入有利於cache效能的優化。然後採用NEON指令進行計算,針對資料訪問,可以考慮使用Q0~Q3的引數暫存器以及Q8~Q15暫存器,而對於Q4~Q7暫存器則必須根據EABI的規範在函式呼叫內儲存。

另外就是關需資料的載入型別,一個是資料的對齊,雖然NEON完全支援非對齊訪問,但是對齊資料一個是有利於載入、儲存,另外一個是也更cache友好,非對齊的資料訪問要消耗更多的時鐘週期尤其是在非對齊還要跨越cache行的情況下,資料對齊方式可以採用[<Rn>,:<align>],其中align可以為32、64、128、256位。軟體流水是非常重要的優化工具,因為現在的ARM基於RISC的處理器,流水線是必須的,因而針對流水線需要更好的優化方法,雖然NEON的流水線在Coretex-A8和Cortex-A9的處理器上不同,NEON的指令一般都是在一個週期內發出,但是執行結果可能若干個週期才能有效,只有簡單的如VSUB、VADD和VMOV指令才能在下一個週期可以用。併發的指令發出也是需要提到的。另外從NEON的暫存器把資料儲存到ARM暫存器非常耗時,需要至少20個週期的延時,因而儘量避免這類操作,NEON沒有提供除法和求平方根的操作,而VFPv3則存在這些指令。但是由於NEON處理器和VFP單元共用硬體,因而不要混合使用NEON和VFP指令。最後是儘量避免ARM和NEON處理器訪問相同的資料區域。

Vld1.8 {D0}, [R1:64]

Vld1.8 {D0,D1}, [R1:128]!

Vld1.8 {D0,D1,D2,D3}, [R2:256]!,R3

Cortex-A8和Cortex-A9的多指令併發有所不同,A8是每次併發兩次fetch,而A9除了多次併發外,還能亂序執行,因而指令重排的優化非常重要。一般而言NEON的SIMD優化能提高至少2倍的系統性能,取決於實際處理的位寬。

Cortex-A9的NEON多媒體處理器是基於ARMv7的SIMD(Single Instruction Multiple Data)和向量浮點VFPv3(Vector Floating-Point)指令集的,在具體的晶片設計中NEON元件是可選的,NEON處理器是面向音訊、視訊編解碼器、影象處理和語音訊號處理以及其他的基帶等資訊處理領域的。 本文介紹了NEON處理器的基本架構、NEON處理器的併發情況下Cortex-A8和Cortex-A9的區別、NEON的暫存器組和資料型別、NEON程式設計的針對編譯器、彙編器的優化方法以及其他的提高效能的並行方法。