SVE(Scalable Vector Extension)是arm AArch64架構(gòu)下的下一代SIMD指令集,旨在加速高性能計(jì)算,SVE引入了很多新的架構(gòu)特點(diǎn), 比如
? 可變矢量長(zhǎng)度
? 每通道預(yù)測(cè)
? 聚集加載和分散存儲(chǔ)
? 橫向操作
本文將對(duì)SVE做個(gè)基本介紹。
1. SIMD指令發(fā)展史 intel vs arm
從上圖我們可以看出,SIMD指令總體趨勢(shì)是向著越來越長(zhǎng)的方向發(fā)展的,到了arm SVE,最長(zhǎng)可以支持2048位的矢量操作。
2. 背景
Armv7的高級(jí)SIMD (即arm NEON 或“MPE” 多媒體處理引擎) 指令集自2005年發(fā)布,已經(jīng)面世十幾年了。Armv7 NEON的主要特性如下:
? 支持8/16/32位整數(shù)操作,支持非IEEE兼容單精度浮點(diǎn)操作,支持指令條件執(zhí)行
? 32個(gè)64位矢量寄存器,也可視為16個(gè)128位矢量寄存器
? 旨在CPU端加速多媒體處理任務(wù)
在升級(jí)到armv8架構(gòu)時(shí),AArch64 NEON指令集做出了許多改進(jìn),比如:
? 支持IEEE兼容單精度和雙精度浮點(diǎn)操作和64位整數(shù)矢量操作
? 32個(gè)128位矢量寄存器
? 這些改進(jìn)使NEON指令集更適用于通用計(jì)算,而不僅僅是多媒體計(jì)算
但是到了現(xiàn)在,armv8的新市場(chǎng)需要更徹底的SIMD指令改進(jìn)。我們需要能夠并行處理非常規(guī)數(shù)據(jù)和復(fù)雜數(shù)據(jù)結(jié)構(gòu),也需要更長(zhǎng)的矢量,SVE因此而生,SVE旨在加速高性能計(jì)算。
3. SVE特性
SVE是armv8 AArch64架構(gòu)的下一代SIMD指令集,它不是NEON的替代,而是聚焦于高性能計(jì)算。主要特性如下:
? 可變矢量長(zhǎng)度
? 128位的整數(shù)倍。 最高可支持2048位
? 不同的實(shí)現(xiàn)可以適應(yīng)不同的應(yīng)用場(chǎng)景,不用更改指令集
? 每通道預(yù)測(cè)
? 支持復(fù)雜嵌套循環(huán)和if/then/else條件跳轉(zhuǎn), 沒有循環(huán)尾數(shù)。
? 聚集加載和分散存儲(chǔ)支持復(fù)雜數(shù)據(jù)結(jié)構(gòu),如步長(zhǎng)數(shù)據(jù)存取、數(shù)組索引,鏈表等。
? 橫向操作
? 支持基本的reduction操作,降低循環(huán)依賴性
4. SVE寄存器
SVE寄存器有兩種:矢量寄存器和預(yù)測(cè)寄存器。
SVE共有32個(gè)可變長(zhǎng)矢量寄存器Z0-Z31(128位的整數(shù)倍, 最高可達(dá)2048位) ,其中Z0-Z31的低128位[127:0],與AArch64 SIMD&FP寄存器V0-V31共享硬件資源。假設(shè)SVE的矢量長(zhǎng)度為256,其矢量寄存器視圖如下。SVE支持8/16/32/64位整數(shù)操作和單精度/雙精度浮點(diǎn)操作。
SVE預(yù)測(cè)寄存器用于控制每通道操作,有16個(gè)可變長(zhǎng)預(yù)測(cè)寄存器P0-P15。每一個(gè)預(yù)測(cè)寄存器的位對(duì)應(yīng)矢量寄存器的字節(jié)。假設(shè)SVE的矢量長(zhǎng)度為256,預(yù)測(cè)寄存器在管理32位和64位操作時(shí),其視圖如下。在控制32位數(shù)據(jù)操作時(shí),如果Pg寄存器的最低為1,則該通道操作為激活狀態(tài),該通道操作結(jié)果被正常存儲(chǔ)到目的寄存器;如果Pg寄存器的最低為0,則該通道操作為未激活狀態(tài),該通道操作結(jié)果不會(huì)被存儲(chǔ)到目的寄存器,目的寄存器的該通道數(shù)據(jù)有兩種可能:
? 指令指定為Pg/z - 清零模式,該通道數(shù)據(jù)被清零。
? 指令指定為Pg/m – 合并模式,該通道數(shù)據(jù)保持原值
5. SVE指令實(shí)例
下面我們通過一些實(shí)例來介紹常用SVE指令的用法。
a. 矢量加法
大家也許都熟悉NEON的指令格式(如下),NEON指令通過對(duì)指令助記符添加“f”前綴來區(qū)分整數(shù)操作和浮點(diǎn)操作,如“add”和“fadd”;另外通過寄存器后綴“.2s”、“.4s”、“.2d”表示操作兩個(gè)32位、四個(gè)32位數(shù)據(jù)、兩個(gè)64位數(shù)據(jù)。
? add v0.4s, v0.4s, v1.4s
? fadd v0.2s, v0.2s, v1.2s
? fadd v0.2d, v0.2d, v1.2d
SVE指令也通過對(duì)指令助記符添加 “f” 前綴來區(qū)分整數(shù)操作和浮點(diǎn)操作。但是SVE是未知矢量長(zhǎng)度編程,因此在指令中我們只需要指明操作數(shù)據(jù)類型就可以了。
? add z0.s, z0.s, z1.s
? fadd z0.s, z0.s, z1.s
? fadd z0.d, z0.d, z1.d
b. 矢量加載
對(duì)于加載指令,NEON指令通過助記符“l(fā)d1”、“l(fā)d2”表示加載一維數(shù)組、二維數(shù)組;通過寄存器后綴“.8h”、“.4s”表示加載八個(gè)16位、四個(gè)32位數(shù)據(jù)。
? ld1 {v0.8h}, [x1]
? ld1 {v0.4s}, [x1]
? ld2 {v0.4s, v1,4s}, [x1]
SVE加載指令添加指令助記符后綴 “h“、”w“表示讀取存儲(chǔ)元素寬度;寄存器后綴”.h“、”.s“表示元素在寄存器中的寬度。寄存器元素寬度必須大于等于讀取存儲(chǔ)寬度。對(duì)于加載指令,讀取元素可以通過符號(hào)擴(kuò)展或者零擴(kuò)展填充到矢量寄存器;對(duì)于存儲(chǔ)指令,每個(gè)矢量元素被截?cái)嗪蟠鎯?chǔ)到內(nèi)存中。
? ld1h {z0.h}, p0/z, [x1]
? ld1w {z0.s}, p0/z, [x1]
? ld2w {z0.s, z1.s}, p0/z, [x1]
6. 小結(jié)
本文簡(jiǎn)單介紹了SVE架構(gòu)特性和指令基本用法,后續(xù)還會(huì)再寫文章介紹如何在C程序中利用SVE。
原文標(biāo)題:一文了解SIMD指令集SVE(可伸縮矢量擴(kuò)展),加速高性能計(jì)算
文章出處:【微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
指令集
+關(guān)注
關(guān)注
0文章
227瀏覽量
23400 -
SIMD
+關(guān)注
關(guān)注
0文章
35瀏覽量
10311
原文標(biāo)題:一文了解SIMD指令集SVE(可伸縮矢量擴(kuò)展),加速高性能計(jì)算
文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論