NEON_4

Armv8 Neon技術的基本原理
Armv8-A包括32位和64位執行狀態,每種狀態都有自己的指令集:

AArch64是用於描述Armv8-A體系結構的64位執行狀態的名稱。
在AArch64狀態下,處理器執行A64指令集,其中包含Neon指令(也稱爲SIMD指令)。 GNU和Linux文檔有時將AArch64稱爲ARM64。
AArch32描述了Armv8-A體系結構的32位執行狀態,該狀態與Armv7幾乎相同。

在AArch32狀態下,處理器可以執行A32(在體系結構的早期版本中稱爲ARM)或T32(Thumb)指令集。 A32和T32指令集向後兼容Armv7,包括Neon指令。

 

本指南將重點介紹針對Armv8-A架構的AArch64執行狀態使用A64指令進行Neon編程。

如果要編寫Neon代碼以在Armv8-A架構的AArch32執行狀態下運行,則應參考《 Neon程序員指南》的1.0版。

 

寄存器,向量,通道和元素
如果您熟悉Armv8-A架構配置文件,您會注意到,在AArch64狀態下,Armv8內核是64位架構,並使用64位寄存器,但是Neon單元使用128位寄存器進行SIMD處理。

這是可能的,因爲Neon單元在128位寄存器的單獨寄存器文件上運行。 Neon單元完全集成到處理器中,並共享用於整數運算,循環控制和緩存的處理器資源。 與硬件加速器相比,這大大減少了面積並降低了功耗。 由於Neon單元使用與應用程序相同的地址空間,因此它還使用了更爲簡單的編程模型。

 

Neon寄存器文件是寄存器的集合,可以作爲8位,16位,32位,64位或128位寄存器進行訪問。

Neon寄存器包含相同數據類型的元素向量。 輸入和輸出寄存器中相同的元素位置稱爲通道。

通常,每條Neon指令都會導致n個操作並行發生,其中n是輸入向量被劃分爲的通道數。 每個操作都包含在通道中。 從一個通道到另一個通道不能有進位或溢出。

 

Neon向量中的通道數量取決於向量的大小以及向量中的數據元素。

128位Neon向量可以包含以下元素大小:

16個8位元素(操作數後綴.16B,其中B表示字節)
八個16位元素(操作數後綴.8H,其中H表示半字)
四個32位元素(操作數後綴.4S,其中S表示單詞)
兩個64位元素(操作數後綴.2D,其中D表示雙字)

 

64位Neon向量可以包含以下元素大小(128位寄存器的高64位清除爲零):

八個8位元素(操作數後綴.8B,其中B表示字節)
四個16位元素(操作數後綴.4H,其中H表示半字)
兩個32位元素(操作數後綴.2S,其中S表示單詞)

向量中的元素從最低有效位開始排序。 即,元素0使用寄存器的最低有效位。 讓我們看一個Neon指令的例子。 指令ADD V0.8H,V1.8H,V2.8H對V1和V2中的向量執行八個通道的16位(8 x 16 = 128)整數元素的並行加法,並將結果存儲在V0中:

一些Neon指令與向量一起作用於標量。 使用標量的指令指定通道索引來引用寄存器中的特定元素。 例如,指令MUL V0.4S,V2.4S,V3.S [2]將V2中的四個32位元素中的每一個乘以V3通道2中的32位標量值,並將結果向量存儲在V0中 。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章