最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

自編教材分享:第七章—數(shù)據(jù)級(jí)并行(一)

2023-10-23 18:02 作者:先進(jìn)編譯實(shí)驗(yàn)室  | 我要投稿


數(shù)據(jù)級(jí)并行是指處理器能夠同時(shí)處理多條數(shù)據(jù)的并行方式,大部分處理器采用SIMD向量擴(kuò)展作為計(jì)算加速部件,SIMD擴(kuò)展部件可以將原來(lái)需要多次裝載的標(biāo)量數(shù)據(jù)一次性裝載到向量寄存器中,通過(guò)一條向量指令實(shí)現(xiàn)對(duì)向量寄存器中數(shù)據(jù)元素的并行處理。使用SIMD方法執(zhí)行的代碼稱為向量代碼,將標(biāo)量代碼轉(zhuǎn)換成向量代碼的過(guò)程即為向量化。通常使用兩種方式獲得向量程序:

(1)由程序設(shè)計(jì)人員編寫(xiě)向量代碼。

(2)借助于編譯器的向量化編譯自動(dòng)生成向量代碼。

為了讓程序獲得更好的向量化性能,優(yōu)化人員需了解程序在向量化過(guò)程中面臨的問(wèn)題,這樣不僅有利于輔助編譯器生成更有效的向量程序,也有利于自行編寫(xiě)出高效的向量程序,將從向量程序的編寫(xiě)和優(yōu)化兩個(gè)方面展開(kāi)具體介紹。示例多以intel SIMD擴(kuò)展指令改寫(xiě),為了便于說(shuō)明,本文使用128位向量寄存器操作指令進(jìn)行演示。常用的指令按照釋義劃分如下表所示。

向量化的本質(zhì)是重寫(xiě)程序,以便其同時(shí)對(duì)多個(gè)數(shù)據(jù)進(jìn)行相同的操作。編寫(xiě)向量化程序時(shí)可以從循環(huán)、基本塊以及函數(shù)等層次發(fā)掘數(shù)據(jù)的并行性,本節(jié)將分為以下六個(gè)部分展開(kāi)討論。

(1)循環(huán)的向量化

(2)基本塊的向量化

(3)函數(shù)的向量化

(4)分支的向量化

(5)歸約的向量化

(6)合適的向量長(zhǎng)度

循環(huán)的向量化

當(dāng)需要計(jì)算的數(shù)據(jù)較多時(shí),直接進(jìn)行計(jì)算需要多個(gè)for循環(huán),代碼冗長(zhǎng)且不好理解。而將循環(huán)向量化后可以將多次for循環(huán)變成一次計(jì)算,較為方便且代價(jià)小。有些循環(huán)不適合直接進(jìn)行向量化,此時(shí)可以使用循環(huán)變換技術(shù)對(duì)循環(huán)進(jìn)行變換,例如循環(huán)分布可以將可向量化和不可向量化的語(yǔ)句分塊,循環(huán)剝離可以使得循環(huán)內(nèi)的數(shù)據(jù)引用變得對(duì)齊,循環(huán)交換可以使得內(nèi)層循環(huán)的訪存變得連續(xù),同時(shí)還可以通過(guò)將某個(gè)外層循環(huán)交換至最內(nèi)層進(jìn)行向量化。

下方代碼中,每次迭代內(nèi)賦值由一次變?yōu)樗拇?,循環(huán)的迭代次數(shù)由原來(lái)100次減少為25次,在理想情況下該程序向量化后運(yùn)行速度可以提升近4倍。

原始代碼:

128位向量指令改寫(xiě)后:

面對(duì)多層循環(huán)時(shí),最內(nèi)層循環(huán)的依賴關(guān)系更容易計(jì)算清楚,因此一般都選擇最內(nèi)層循環(huán)作為向量化的目標(biāo)。以矩陣乘代碼為例。

原始代碼:

128位向量指令改寫(xiě)后:

當(dāng)最內(nèi)層循環(huán)存在依賴環(huán)向量化后不再滿足正確性要求或優(yōu)化效果不佳時(shí),且無(wú)法使用循環(huán)交換的前提下,可以考慮對(duì)外層循環(huán)進(jìn)行向量化。

示例代碼在Intel平臺(tái)上進(jìn)行測(cè)試,只對(duì)內(nèi)層循環(huán)向量化的代碼相對(duì)于原始代碼加速比為1.12,而進(jìn)行外層循環(huán)向量化的代碼相對(duì)于原始代碼加速比為1.9。由此可以看出,不同的向量化方案性能存在明顯的差異,選擇一個(gè)合適的SIMD向量化方案是取得好的向量化優(yōu)化效果的關(guān)鍵。

外層循環(huán)向量化后的代碼為:

基本塊的向量化

面向基本塊的向量化又叫直線型向量化,其要求基本塊內(nèi)有足夠的并行性,否則會(huì)因?yàn)橛写罅康南蛄亢蜆?biāo)量之間的轉(zhuǎn)換而影響向量化效果,基本塊級(jí)向量化方法與循環(huán)級(jí)向量化方法不同,是指從指令級(jí)并行中挖掘數(shù)據(jù)級(jí)并行。

面向基本塊的向量化方法中常常提到打包、解包的概念,包是一個(gè)同構(gòu)語(yǔ)句的集合,即語(yǔ)句參數(shù)可能不同但可編譯的部分是相同的,將多條同構(gòu)語(yǔ)句組成包的過(guò)程稱為打包,反之則稱為拆包。

同構(gòu)語(yǔ)句:

考慮面向基本塊的向量化時(shí),代碼中非同構(gòu)語(yǔ)句更為常見(jiàn),但非同構(gòu)語(yǔ)句會(huì)影響后續(xù)向量化,此時(shí)可以將代碼中的非同構(gòu)語(yǔ)句轉(zhuǎn)為同構(gòu)語(yǔ)句。

示例一:

非同構(gòu)語(yǔ)句:

轉(zhuǎn)換為同構(gòu)語(yǔ)句:

示例二:

非同構(gòu)語(yǔ)句:

轉(zhuǎn)換為同構(gòu)語(yǔ)句:

示例三:

代碼中S1,S2兩條語(yǔ)句都對(duì)數(shù)組C進(jìn)行寫(xiě)操作,但是等號(hào)右側(cè)的運(yùn)算不是完全同構(gòu)的,此時(shí)可以提取兩條語(yǔ)句中的公共子表達(dá)式。提取之后可以僅對(duì)公共子表達(dá)式進(jìn)行向量化,其余部分仍然保持標(biāo)量執(zhí)行,但這個(gè)過(guò)程涉及到標(biāo)量執(zhí)行和向量執(zhí)行之間的轉(zhuǎn)換,因此優(yōu)化人員應(yīng)該確認(rèn)此種做法的收益性。

非同構(gòu)語(yǔ)句:

轉(zhuǎn)換為同構(gòu)語(yǔ)句:

//同構(gòu)

循環(huán)展開(kāi)將迭代間并行轉(zhuǎn)為迭代內(nèi)并行,可以增加循環(huán)內(nèi)語(yǔ)句的數(shù)量,因此優(yōu)化人員可以在展開(kāi)后的循環(huán)塊內(nèi)實(shí)施面向基本塊的向量化。在未進(jìn)行循環(huán)展開(kāi)且向量化因子為4的前提下,只能將基本塊內(nèi)的前4條語(yǔ)句轉(zhuǎn)為向量執(zhí)行,后2條語(yǔ)句沒(méi)有向量化成功。此時(shí)可以循環(huán)展開(kāi)4次。

示例一:

原始代碼:

基本塊向量化之后:

示例二:

循環(huán)展開(kāi)4次后,可以對(duì)循環(huán)體內(nèi)24條語(yǔ)句實(shí)施基本塊級(jí)向量化,循環(huán)展開(kāi)4次后再采用基本塊向量化方法避免了生成不連續(xù)訪存指令,程序的運(yùn)行效率得到了提高。

原始代碼:

循環(huán)展開(kāi)4次后基本塊向量化:

對(duì)于原來(lái)循環(huán),如果展開(kāi)4次可能會(huì)造成基本塊內(nèi)語(yǔ)句的條數(shù)過(guò)多,優(yōu)化人員也可以在展開(kāi)2次后實(shí)施基本塊級(jí)向量化。展開(kāi)2次后基本塊內(nèi)含有12條語(yǔ)句,語(yǔ)句數(shù)量適中,便于優(yōu)化人員進(jìn)行向量打包。具體循環(huán)展開(kāi)次數(shù)可以根據(jù)程序的特征進(jìn)行選擇,不同的展開(kāi)次數(shù)以及不同的向量化方法會(huì)獲得不同的向量化效果。

循環(huán)展開(kāi)兩次后基本塊向量化:

函數(shù)的向量化

不論是面向循環(huán)還是面向基本塊的向量化方法都是在標(biāo)量函數(shù)內(nèi)的,即該函數(shù)的參數(shù)為標(biāo)量。而函數(shù)級(jí)向量化是將幾個(gè)相鄰的計(jì)算實(shí)例合并為一個(gè)向量實(shí)例,是一種單程序多數(shù)據(jù)的程序,即函數(shù)的參數(shù)為向量,返回值也為向量。

根據(jù)標(biāo)量函數(shù)fun1生成一個(gè)向量函數(shù)vecfun1,循環(huán)內(nèi)用向量函數(shù)vecfun1代替原來(lái)的標(biāo)量函數(shù)fun1,假設(shè)SIMD擴(kuò)展部件一次可以處理4個(gè)int數(shù)據(jù),那么在向量化后的函數(shù)調(diào)用點(diǎn)處,每4個(gè)標(biāo)量函數(shù)(fun1 (x0,y0),fun1(x1,y1), fun1(x2,y2),fun1 (x3,y3))由一個(gè)向量函數(shù)vecfun1(<x0…x3>,<y0…y3>)代替,函數(shù)vecfun1的參數(shù)為向量(<x0…x3>,<y0…y3>),返回值為向量<z0…z3>。

原始代碼:

函數(shù)向量化后:


自編教材分享:第七章—數(shù)據(jù)級(jí)并行(一)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
巩义市| 醴陵市| 新蔡县| 军事| 绥宁县| 奈曼旗| 长葛市| 平定县| 北票市| 尚志市| 漳浦县| 辛集市| 申扎县| 龙州县| 绥滨县| 股票| 马边| 鹤山市| 渭南市| 东明县| 嘉兴市| 顺平县| 河东区| 车险| 六安市| 耒阳市| 安多县| 永昌县| 渑池县| 磐石市| 沙湾县| 集安市| 浦县| 白玉县| 永昌县| 开平市| 高邑县| 启东市| 天峻县| 白水县| 湛江市|