0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是針對(duì)GPU單指令多數(shù)據(jù)流的編譯優(yōu)化算法

汽車電子技術(shù) ? 來源:程序芯世界 ? 作者:coderSun ? 2023-03-02 16:13 ? 次閱讀

1.單指令多數(shù)據(jù)流

首先來看一段簡(jiǎn)單的if-else語句:

if(A)
{
    B = 1;//Instruction S1
    C = 2;//Instruction S2
}
else
{
    B = 3;//Instruction S3
    C = 4;//Instruction S4
}

假設(shè)代碼中每條語句轉(zhuǎn)換成指令后分別是S1、S2、S3、S4.

如果在CPU的單指令單數(shù)據(jù)流中,A=true時(shí)會(huì)取指令S1和S2執(zhí)行,A=false時(shí)會(huì)取指令S3和S4執(zhí)行,不存在A=true和A=false同時(shí)存在的這種情況。

但是在GPU的單指令多數(shù)據(jù)流(SIMD)中卻存在A=true和A=false同時(shí)存在的情況。

如下圖所示是GPU單指令多數(shù)據(jù)流的執(zhí)行情況:

圖片

GPU單指令多數(shù)據(jù)流

從圖中可以看到,GPU共有4個(gè)通道lane1、lane2、lane3、lane4,分別對(duì)應(yīng)4筆不同的數(shù)據(jù)。這四個(gè)通道共享同一組指令S1、S2、S3、S4(如圖中左邊所示)。但是在4個(gè)不同的lane中,A的值在不同的lane中有時(shí)是true,有時(shí)是false。紅色表示執(zhí)行該指令,橙色表示不執(zhí)行該指令。

如果按照CPU單指令單數(shù)據(jù)流的方式去編譯,生成的匯編指令是大概這樣的:

goto     !A , Labe1;//如果A為false,跳轉(zhuǎn)
mov      B , 1;//指令S1
mov      C , 2;//指令S2
Lable1:
mov      B , 3;//指令S3
mov      C , 4;//指令S4

可以看到goto指令會(huì)根據(jù)A的值進(jìn)行跳轉(zhuǎn),GPU中A的值在不同的lane中取值不同,不同的lane根據(jù)自己的A值進(jìn)行跳轉(zhuǎn)是行不通的。因?yàn)樗械膌ane共享同一組指令,不可能有的lane在執(zhí)行S1、S2語句,有的lane在執(zhí)行S3、S4語句。

所以GPU的指令應(yīng)該轉(zhuǎn)換成順序執(zhí)行,類似于下面這種。

(p0) mov      B , 1;//指令S1
(p0) mov      C , 2;//指令S2
(p1) mov      B , 3;//指令S3
(p1) mov      C , 4;//指令S4

此時(shí)不同的lane都會(huì)按照順序取值S1,S2,S3,S4,但是具體的lane中會(huì)根據(jù)前面的p寄存器的取值確定是否執(zhí)行該指令。例如對(duì)于同一條指令S1,根據(jù)A的輸入,有的lane是執(zhí)行的(紅色),有的lane是不執(zhí)行的(橙色)。

一句話總結(jié)就是:GPU是單指令多數(shù)據(jù)流(SIMD)架構(gòu),當(dāng)多筆數(shù)據(jù)過來時(shí),不一定同時(shí)跳轉(zhuǎn),本文介紹的if-conversion算法能夠消除所有的跳轉(zhuǎn)指令,可以將控制依賴轉(zhuǎn)換為數(shù)據(jù)依賴。

2.if-conversion算法

總共分四步:

  1. 計(jì)算直接后繼支配節(jié)點(diǎn)
  2. 計(jì)算控制依賴CD
  3. 計(jì)算R&K函數(shù)
  4. Augment K

首先要計(jì)算直接后繼支配節(jié)點(diǎn),因?yàn)樵诳刂埔蕾嘋D的計(jì)算中需要用到。

什么是控制依賴CD,一個(gè)簡(jiǎn)單的例子就是if語句中的block y是受if語句所在的block x所控制的。此時(shí)CD(y) = x, 稱為y控制依賴于x。

R&K分別對(duì)應(yīng)寄存器p的use與def,即寄存器p的使用與定義。

R(x):表示分配給block x的謂詞寄存器。block x的執(zhí)行與否受R(x)中的寄存器控制。也可以說是p的use,即寄存器p用于block x。

K(p):表示謂詞寄存器p需要在K(p)中的block中定義。也就是寄存器的def,即寄存器p在那個(gè)block定義。

2.1 直接后繼支配節(jié)點(diǎn)

首先要弄清楚兩個(gè)概念:后繼支配節(jié)點(diǎn)、直接后繼支配節(jié)點(diǎn)。

后繼支配節(jié)點(diǎn):如果從節(jié)點(diǎn)y到出口節(jié)點(diǎn)的每一條路徑都經(jīng)過節(jié)點(diǎn)x,則x為y的后繼支配節(jié)點(diǎn)。

記作:x pdom y

直接后繼支配節(jié)點(diǎn):x pdom y,不存在節(jié)點(diǎn)z,使得x pdom z 且 z pdom y。則x為y的直接后繼支配節(jié)點(diǎn)。

記作:x ipdom y

計(jì)算后繼支配節(jié)點(diǎn)的迭代算法:

change = true;
//init pdom set
pdom(exit_block) = {exit_block}
pdom(0:eeit_block-1) = {all blocks}
//iterate flow graph
while(change)
{
  change = false;
  for( each block n) with post order
  {
    tmp = {all blocks}; 
    //求節(jié)點(diǎn)n所有直接后繼節(jié)點(diǎn)的共同后繼支配節(jié)點(diǎn)
    for(each n's successor block p)
    {
      tmp = tmp & pdom(p);//求交集
    }
    //n的后繼支配節(jié)點(diǎn)包括他本身
    tmp = tmp | {n};
    if(tmp!=pdom(n))
    {
      pdom(n) = tmp;
      change = true;
    }
  }
}

求后繼支配節(jié)點(diǎn)的算法一句話概括:節(jié)點(diǎn)n的后繼支配節(jié)點(diǎn)包括他本身,以及他所有直接后繼節(jié)點(diǎn)的共同后繼支配節(jié)點(diǎn)。

計(jì)算直接后繼支配節(jié)點(diǎn)的算法:

//remove itself from it's pdom set
for each node n
{
  pdom(n)-={n};
}

for each node n with post order
{
  for each s in pdom(n){
  //移除直接后繼支配節(jié)點(diǎn)的后繼支配節(jié)點(diǎn) 
    for each t in set( pdom(n)-s ){
      if( t is in pdom(s) )
        pdom(n)-={t}
    }
  }
}

后繼支配節(jié)點(diǎn) = 直接后繼支配節(jié)點(diǎn) + (直接后繼支配節(jié)點(diǎn))的后繼支配節(jié)點(diǎn)

前面已經(jīng)求出了后繼支配節(jié)點(diǎn),因此在后繼支配節(jié)點(diǎn)中移除(直接后繼支配節(jié)點(diǎn))的后繼支配節(jié)點(diǎn),即可得到直接后繼支配節(jié)點(diǎn)。

下圖是一個(gè)計(jì)算直接后繼支配節(jié)點(diǎn)的例子:

圖片

直接后繼支配節(jié)點(diǎn)

2.2. CD

CD是Control Dependent的縮寫。直接上英文定義可能更準(zhǔn)確一些,詳細(xì)證明可參考文章末尾給出的論文,公眾號(hào)后臺(tái)回復(fù)SIMD關(guān)鍵字即可下載。

Y is control dependent on X iff

(1) there exists a directed path P from X to Y with any Z in P (excluding X and Y) post-dominated by Y

(2) X is not post-dominated by Y.

計(jì)算CD的算法:

pdom(x) = {y in N: y pdom x}
ipdom(x) = {y in N: y ipdom x}

for [x,y,label] in E such that y not in pdom(x)
{
    Lub = ipdom(x);
    if !label 
      x = -x
    t = y;
    while(t!=Lub)
    {
      CD(t) = CD(t) U {x}//U表示求并集
      t = ipdom(t);
    }
}

上述偽代碼中的!label表示由block x到block y的執(zhí)行條件為false。

計(jì)算CD的算法用一句話概括:對(duì)于[x,y,label],在支配節(jié)點(diǎn)樹中,從ipdom(x)到y(tǒng)的路徑上的所有節(jié)點(diǎn)都控制依賴于x,不包括ipdom(x)。

以[1,2,true]為例,ipdom(x) = 7,從下面的后繼支配節(jié)點(diǎn)樹可知,7到2經(jīng)過的節(jié)點(diǎn)有6,2(不包括7),因此節(jié)點(diǎn)6和2都控制依賴于節(jié)點(diǎn)1.

圖片

后繼支配節(jié)點(diǎn)樹

下圖是CD計(jì)算的結(jié)果:整篇文章都使用同一個(gè)控制流圖作為實(shí)例

圖片

CD計(jì)算結(jié)果

2.3. 計(jì)算R&K

p = 1;
for x in N
    t = CD(x);
    if t in K
    {
        //性質(zhì)2
        R(x) = q such that K(q) = t;
    }
    else
    {
        K(p) = t;
        R(x) = p++;
    }

性質(zhì)1:每一個(gè)block x有且僅有一個(gè)對(duì)應(yīng)的p = R(x)

性質(zhì)2:對(duì)于兩個(gè)不同的block,如果它們的控制依賴都為k(p),則這兩個(gè)block對(duì)應(yīng)的寄存器都為p(對(duì)應(yīng)上述算法中的if語句)

圖片

R與K的計(jì)算結(jié)果

2.4. Augment K

k(p)表明p需要在哪些block初始化,但是存在一條路徑,剛好沒有經(jīng)過k(p),這個(gè)時(shí)候p沒有被初始化。因此需要在start節(jié)點(diǎn)對(duì)p進(jìn)行初始化。

主要是針對(duì)類似的if語句嵌套:

//原始的控制流
if(condition1)
{
    block1
    if(codition2)
    {
        block2
    }
    else
    {
        block3
    }   
}

上面的控制流最終會(huì)轉(zhuǎn)化成如下的順序執(zhí)行,只是每個(gè)block會(huì)有一個(gè)p寄存器去guard。

最終會(huì)轉(zhuǎn)化為這樣:

//轉(zhuǎn)換后的順序執(zhí)行,是否執(zhí)行受p寄存器控制p1) block1;//p2與p3都會(huì)在block1中初始化
 (p2) block2;
 (p3) block3;

原始的控制流中p2與p3都會(huì)在block1中初始化,如果block1沒有執(zhí)行,那么p2與p3就沒有被初始化。因此需要在開始節(jié)點(diǎn)處將p2與p3初始化為false。

為什么初始化為false而不是true?因?yàn)閎lock1沒有執(zhí)行,說明block2與block3也不應(yīng)該執(zhí)行,所以初始化為false。

上述過程是為什么要做Augment K,實(shí)際上Augment K要做的只有一件事:找到未初始化的寄存器p,在start節(jié)點(diǎn)處將p初始化為false。

在程序中找到為初始化的變量很簡(jiǎn)單,從后向前做活躍變量分析,如果變量在入口處還是活躍的,則該變量沒有被初始化。

因?yàn)閺暮笙蚯白龌钴S變量分析的時(shí)候,變量的每次定義都會(huì)被Kill掉(公式1),如果在程序的入口處都沒有被Kill掉說明該變量是沒有被初始化過的。

(公式1)

(公式2)

本算法中只需要對(duì)p寄存器進(jìn)行活躍變量分析,use和def分別對(duì)應(yīng)已經(jīng)求出的R與K。

圖片

Augment K結(jié)果

四個(gè)步驟做完后最終的結(jié)果如下:

圖片

p寄存器分配的最后結(jié)果

圖中B2(t2)p2表示寄存器p2控制B2,條件t2與B2相關(guān)聯(lián)。

3.后記

剛接觸if-conversion算法的時(shí)候覺得挺復(fù)雜的,在寫文章的過程中對(duì)整個(gè)算法的理解又有了更深刻的理解,有一種無法言喻的喜悅。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10863

    瀏覽量

    211781
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    607

    瀏覽量

    35714
  • 數(shù)據(jù)流
    +關(guān)注

    關(guān)注

    0

    文章

    119

    瀏覽量

    14359
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    有限通信資源下多數(shù)據(jù)流連接的降載算法

    針對(duì)數(shù)據(jù)源節(jié)點(diǎn)通信資源十分有限的缺陷,提出一種基于直方圖的多數(shù)據(jù)流滑動(dòng)窗口連接查詢的降載策略。該算法綜合中心處理節(jié)點(diǎn)和數(shù)據(jù)源節(jié)點(diǎn)的負(fù)載情況,給出降載比例計(jì)算公
    發(fā)表于 04-11 09:33 ?17次下載

    多數(shù)單指令周期

    多數(shù)單指令周期 ATtiny10/11/12特點(diǎn)1. AVR RISC 結(jié)構(gòu)2. AVR 高性能低功耗RISC 結(jié)構(gòu)90 條指令多數(shù)單指令
    發(fā)表于 03-26 16:51 ?23次下載

    sse指令

    sse指令集 SSE(Streaming SIMD Extensions,單指令多數(shù)據(jù)流擴(kuò)展)指令集是Intel在Pentium III處理器中率先推出的。其實(shí),早在PIII正式推出
    發(fā)表于 12-25 10:59 ?1561次閱讀

    什么是因特網(wǎng)數(shù)據(jù)流單指令序列擴(kuò)展?

    什么是因特網(wǎng)數(shù)據(jù)流單指令序列擴(kuò)展?  是對(duì)MMX指令的擴(kuò)展和改進(jìn)。在MMX基礎(chǔ)上添加到70條指令,加強(qiáng)CPU處理3D網(wǎng)頁(yè)和其它音、象信
    發(fā)表于 02-04 10:33 ?600次閱讀

    網(wǎng)絡(luò)數(shù)據(jù)流存儲(chǔ)算法分析與實(shí)現(xiàn)

    針對(duì)網(wǎng)絡(luò)數(shù)據(jù)流存儲(chǔ)的瓶頸問題,提出了一種網(wǎng)絡(luò)數(shù)據(jù)流存儲(chǔ)算法分析與實(shí)現(xiàn)方法,仿真結(jié)果表明,模型能顯著提高網(wǎng)絡(luò)數(shù)據(jù)流的實(shí)時(shí)存儲(chǔ)能力
    發(fā)表于 05-26 15:57 ?21次下載
    網(wǎng)絡(luò)<b class='flag-5'>數(shù)據(jù)流</b>存儲(chǔ)<b class='flag-5'>算法</b>分析與實(shí)現(xiàn)

    一種動(dòng)態(tài)調(diào)度與靜態(tài)優(yōu)化數(shù)據(jù)流編譯系統(tǒng)

    為了解決數(shù)據(jù)流編程模型的可用性問題,使其能在兼顧程序并行性的前提下適用于動(dòng)態(tài)數(shù)據(jù)交互速率的應(yīng)用,設(shè)計(jì)了一種動(dòng)態(tài)調(diào)度與靜態(tài)優(yōu)化相結(jié)合的數(shù)據(jù)流
    發(fā)表于 11-20 09:57 ?11次下載
    一種動(dòng)態(tài)調(diào)度與靜態(tài)<b class='flag-5'>優(yōu)化</b>的<b class='flag-5'>數(shù)據(jù)流</b><b class='flag-5'>編譯</b>系統(tǒng)

    數(shù)據(jù)流編程模型優(yōu)化

    提出了新的挑戰(zhàn)。針對(duì)數(shù)據(jù)流程序在分布式架構(gòu)下所面臨的問題,設(shè)計(jì)并實(shí)現(xiàn)了數(shù)據(jù)流編程模型和分布式計(jì)算框架的結(jié)合在COStream的基礎(chǔ)上提出了面向Storm的編譯優(yōu)化框架??蚣馨▋蓚€(gè)模塊
    發(fā)表于 11-23 15:48 ?3次下載
    <b class='flag-5'>數(shù)據(jù)流</b>編程模型<b class='flag-5'>優(yōu)化</b>

    發(fā)掘函數(shù)級(jí)單指令多數(shù)據(jù)向量化的方法

    當(dāng)前面向單指令多數(shù)據(jù)( SIMD)擴(kuò)展部件的兩類向量化方法分別是循環(huán)級(jí)向量化方法和超字級(jí)并行(SLP)方法。針對(duì)當(dāng)前編譯器不能實(shí)現(xiàn)函數(shù)級(jí)向量化的問題,提出一種基于靜態(tài)單賦值的函數(shù)級(jí)向量
    發(fā)表于 11-29 16:08 ?0次下載
    發(fā)掘函數(shù)級(jí)<b class='flag-5'>單指令</b><b class='flag-5'>多數(shù)據(jù)</b>向量化的方法

    改進(jìn)的多數(shù)據(jù)流協(xié)同頻繁項(xiàng)集挖掘算法

    針對(duì)已有的多數(shù)據(jù)流協(xié)同頻繁項(xiàng)集挖掘算法存在內(nèi)存占用率高以及發(fā)現(xiàn)頻繁項(xiàng)集效率低的問題,提出了改進(jìn)的多數(shù)據(jù)流協(xié)同頻繁項(xiàng)集挖掘( MCMD-Stream)
    發(fā)表于 12-15 10:26 ?0次下載
    改進(jìn)的<b class='flag-5'>多數(shù)據(jù)流</b>協(xié)同頻繁項(xiàng)集挖掘<b class='flag-5'>算法</b>

    一種支持單雙模式選擇的SIMD編譯優(yōu)化算法

    BWDSPlOO是一款采用超長(zhǎng)指令字(VLIW)和單指令多數(shù)據(jù)流(SIMD)架構(gòu)的針對(duì)高性能計(jì)算領(lǐng)域而設(shè)計(jì)的32位靜態(tài)標(biāo)量數(shù)字信號(hào)處理器,其指令
    發(fā)表于 01-05 10:28 ?0次下載
    一種支持單雙模式選擇的SIMD<b class='flag-5'>編譯</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>算法</b>

    基于角度方差的數(shù)據(jù)流異常檢測(cè)算法

    傳統(tǒng)基于歐氏距離的異常檢測(cè)算法在高維數(shù)據(jù)檢測(cè)中存在精度無法保證以及運(yùn)行時(shí)間過長(zhǎng)的問題。為此,結(jié)合高維數(shù)據(jù)流的特點(diǎn)運(yùn)用角度方差的方法,提出一種改進(jìn)的基于角度方差的數(shù)據(jù)流異常檢測(cè)
    發(fā)表于 01-17 11:29 ?1次下載
    基于角度方差的<b class='flag-5'>數(shù)據(jù)流</b>異常檢測(cè)<b class='flag-5'>算法</b>

    關(guān)聯(lián)函數(shù)的數(shù)據(jù)流聚類算法

    傳統(tǒng)數(shù)據(jù)流聚類算法大多基于距離或密度,聚類質(zhì)量和處理效率都不高。針對(duì)以上問題,提出了一種基于關(guān)聯(lián)函數(shù)的數(shù)據(jù)流聚類算法。首先,將
    發(fā)表于 02-10 11:54 ?2次下載

    DSP的并行指令分析和冗余優(yōu)化算法

    如今單指令多數(shù)據(jù)流( SIMD)技術(shù)在數(shù)字信號(hào)處理器(DSP)上得到了廣泛的應(yīng)用,現(xiàn)有的向量化編譯器大多都實(shí)現(xiàn)了自動(dòng)向量化的功能,但是編譯器并不適合支持DSP為特征的SIMD自動(dòng)向量化
    發(fā)表于 02-24 15:17 ?0次下載
    DSP的并行<b class='flag-5'>指令</b>分析和冗余<b class='flag-5'>優(yōu)化</b><b class='flag-5'>算法</b>

    時(shí)間數(shù)據(jù)流的并行檢測(cè)算法

    針對(duì)現(xiàn)有長(zhǎng)持續(xù)時(shí)間數(shù)據(jù)流檢測(cè)算法的實(shí)時(shí)性差、檢測(cè)精度與估計(jì)精度低的問題,提出長(zhǎng)持續(xù)時(shí)間數(shù)據(jù)流的并行檢測(cè)算法?;诠蚕?/div>
    發(fā)表于 03-06 15:54 ?0次下載
    時(shí)間<b class='flag-5'>數(shù)據(jù)流</b>的并行檢測(cè)<b class='flag-5'>算法</b>

    FPGA有什么優(yōu)勢(shì),可以讓FPGA替代GPU

    目前,在AI計(jì)算平臺(tái)使用最廣泛的兩種加速部件是GPU和FPGA。GPU可適用于具備計(jì)算密集、高并行、SIMD(SingleInstructionMultipleData,單指令多數(shù)據(jù)流
    發(fā)表于 11-01 15:07 ?2915次閱讀