FPU(Floating-Point Unit)
浮點(diǎn)運(yùn)算單元是處理器內(nèi)部用于執(zhí)行浮點(diǎn)數(shù)計(jì)算的邏輯部件。因?yàn)椴⒉皇撬械奶幚砥鞫夹枰邆湓摴δ埽砸恍┨幚砥鲗?shí)現(xiàn)的時(shí)候可以配置為包含或不包含該部件。
如果處理器包含了該運(yùn)算部件那么表現(xiàn)形式就取決于ARM架構(gòu)的定義, 要么是作為處理器架構(gòu)里面定義好的一部分,要么是作為處理器基礎(chǔ)架構(gòu)之外的擴(kuò)展。浮點(diǎn)運(yùn)算部件除了滿足IEEE754標(biāo)準(zhǔn),另外也會(huì)定義相關(guān)的FPU工作方式以及相對(duì)應(yīng)的指令集。即便處理器里面并沒有包含F(xiàn)PU單元,也仍然可以使用軟件的方式來執(zhí)行相關(guān)的浮點(diǎn)計(jì)算,但是使用軟件完成這些運(yùn)算跟使用硬件FPU相比會(huì)慢許多。
不同的浮點(diǎn)運(yùn)算單元支持不同大小的浮點(diǎn)數(shù)據(jù)類型,所以對(duì)于一些處理器來說可以配置為僅支持單精度浮點(diǎn)數(shù)或者是單、雙精度浮點(diǎn)數(shù)均支持。
VFP(Vector Floating Point)
“VFP”表示的是向量浮點(diǎn)運(yùn)算單元,并且也是在ARMv8架構(gòu)之前已經(jīng)出現(xiàn)了的浮點(diǎn)運(yùn)算擴(kuò)展單元的名稱。ARM架構(gòu)默認(rèn)并不支持向量浮點(diǎn)運(yùn)算運(yùn)算,因此相關(guān)的定義與實(shí)現(xiàn)都是通過架構(gòu)的VFP擴(kuò)展提供的。
之所以稱為“向量”浮點(diǎn)是因?yàn)樵贏RMv6及以前這個(gè)擴(kuò)展不只是用于增加浮點(diǎn)數(shù)計(jì)算處理,同時(shí)也用于類似向量的SIMD浮點(diǎn)數(shù)計(jì)算處理。在本文中,“向量”用于表示對(duì)打包成單個(gè)大數(shù)據(jù)集的一項(xiàng)乘法運(yùn)算(例如把多個(gè)獨(dú)立的數(shù)值合并存儲(chǔ)到一個(gè)寄存器內(nèi)相乘)。
在ARMv7架構(gòu)中,這種使用VFP來處理向量浮點(diǎn)數(shù)據(jù)的方式不建議采用,相關(guān)的功能可以使用“先進(jìn)SIMD擴(kuò)展”來替代。
VFP有多個(gè)不同的版本 (VFPv1, VFPv2, VFPv3, VFPv4)用來支持不同的特性與數(shù)據(jù)類型。VFPv2用于ARMv5和ARMv6架構(gòu)擴(kuò)展,VFPv3與VFPv4用于ARMv7架構(gòu)擴(kuò)展使用。
ASE(Advanced SIMD Extension)
“ASE”是“先進(jìn)SIMD擴(kuò)展”的英文首字母縮寫。它是ARMv7架構(gòu)上用于提供額外SIMD運(yùn)算的擴(kuò)展,既可以使用整數(shù)(即INT整型),也可以使用浮點(diǎn)數(shù)。
同VFP擴(kuò)展相似,先進(jìn)SIMD擴(kuò)展也有多個(gè)版本(Advanced SIMDv1、半精度Advanced SIMD以及Advanced SIMDv2)用來支持不同的特性與數(shù)據(jù)類型。
盡管架構(gòu)上的擴(kuò)展是“先進(jìn)SIMD擴(kuò)展”,但實(shí)際用于描述這個(gè)特性的產(chǎn)品名為“NEON”。這兩個(gè)名稱代表的是相同的部件。
對(duì)于ARMv8A架構(gòu)中,在默認(rèn)的架構(gòu)上包含了對(duì)向量SIMD運(yùn)算的處理所以先進(jìn)SIMD擴(kuò)展也不再認(rèn)為是一種擴(kuò)展。它仍然作為NEON并且呈現(xiàn)在所有標(biāo)準(zhǔn)的ARMv8-A處理器核心中,因此在某些架構(gòu)的核心上可能不包括它。.
NEON
如上面簡短的提及,“NEON”是用于ARMv7和ARMv8 Cortex-A與Cortex-R處理器的先進(jìn)SIMD功能的產(chǎn)品名稱。
需要注意的是NEON(或ASE)的支持在不同處理器上可能有不同的形式呈現(xiàn),但基本的功能都是一樣的,也就是說,它允許在整數(shù)或者浮點(diǎn)數(shù)據(jù)執(zhí)行SIMD運(yùn)算。 所使用的向量大小、向量的數(shù)量、所支持的浮點(diǎn)數(shù)類型等都取決于其具體的實(shí)現(xiàn)。
有關(guān)于NEON指令的更多信息可以從這里獲得。
MPE
MPE(Media Processing Engine)是一些ARMv7A處理器當(dāng)中先進(jìn)SIMD部件使用的名稱:Cortex-A5、Cortex-A7以及Cortex-A9。它通常也被稱作“NEON MPE”或者“NEON多媒體處理引擎”,它也是處理器實(shí)現(xiàn)ASE/NEON支持后的別稱。
SVE
SVE(Scalable Vector Extension)如前面所提到的,ARMv8-A架構(gòu)已經(jīng)包含了“先進(jìn)SIMD”支持,用于提供SIMD向量處理能力。SVE是ARMv8-A架構(gòu)的一種擴(kuò)展,它表示的是可變向量擴(kuò)展。
這個(gè)擴(kuò)展只在AArch64模式下支持使用,它提供了額外的寄存器來支持更大向量、額外的指令以及其它的特性。如果要包含SVE則需要處理器核心對(duì)NEON提供支持。
之前支持SIMD運(yùn)算使用的是固定大小的數(shù)據(jù)項(xiàng),比如ARMv7-A先進(jìn)SIMD使用16個(gè)128位的數(shù)據(jù)項(xiàng)或者32個(gè)64位的數(shù)據(jù)項(xiàng)。而SVE的好處是它擁有的32個(gè)向量寄存器可以并成一個(gè)2048位的大小,而且向量的大小是可以通過軟件來控制的。這也就是為何它叫做“可變”向量擴(kuò)展—向量的大小可以在運(yùn)行中調(diào)整為不同大小,且這個(gè)特性并不隨處理器實(shí)現(xiàn)而改變。
之前版本的SIMD支持(比如NEON)需要將數(shù)據(jù)提前處理成處理器實(shí)現(xiàn)的向量運(yùn)算所對(duì)應(yīng)的大?。ㄟ@類數(shù)據(jù)通常也稱作“已調(diào)節(jié)”數(shù)據(jù))。SVE允許向量數(shù)據(jù)的大小在運(yùn)算過程中被改變,無需重寫或重新編譯代碼,使得它更加容易實(shí)現(xiàn)那些處理SIMD運(yùn)算的軟件開發(fā)。
SVE2是SVE更新后的版本,主要區(qū)別在于附加了更多的指令支持。這樣就使得它可以在更寬的應(yīng)用范圍加速更多的算法。
有關(guān)于SVE指令的更多信息可以從這里獲得,類似的SVE2指令的更多信息可以從這里獲得。
SME
SME(Scalable Matrix Extension)是ARMv9-A架構(gòu)提供的建立在可變向量擴(kuò)展(SVE和SVE2)上增加了對(duì)矩陣處理支持。它包含了一定數(shù)量的新指令,相當(dāng)于處理器的新模式—這個(gè)模式用于執(zhí)行矩陣運(yùn)算,并且這也使得它在處理矩陣運(yùn)算以及常規(guī)的SVE SIMD運(yùn)算時(shí)更容易使用不同的向量大小。
有關(guān)SME指令的更多信息可以從這里獲得。
MVE
MVE(M-profile Vector Extension)是ARMv8-M架構(gòu)專用的,它提供了大量對(duì)SIMD運(yùn)算的支持。跟NEON作為A-系列先進(jìn)SIMD擴(kuò)展的產(chǎn)品名字一樣,“Helium”則是M-profile Vector Extension的產(chǎn)品名稱。
MVE可以分為2大類,MVE-I和MVE-F。MVE-I僅對(duì)整型向量提供支持,MVE-F則對(duì)浮點(diǎn)數(shù)據(jù)向量提供支持。要包含MVE-F那么處理器核心就需要支持MVE-I以及浮點(diǎn)擴(kuò)展。
有關(guān)MVE指令的更多信息可以從這里獲得。