指令調(diào)度的問(wèn)題與約束
指令調(diào)度受到多方面的約束,如數(shù)據(jù)依賴(lài)約束、功能部件約束、寄存器約束等^[3]^,在這些約束下,尋找到最優(yōu)解,降低指令流水間的stall,就是指令調(diào)度的終極目標(biāo)。
指令流水間的stall主要由數(shù)據(jù)型冒險(xiǎn)、結(jié)構(gòu)性冒險(xiǎn)、控制型冒險(xiǎn)導(dǎo)致。
- 數(shù)據(jù)型冒險(xiǎn):當(dāng)前指令的執(zhí)行依賴(lài)與上一條指令執(zhí)行的結(jié)果。數(shù)據(jù)型冒險(xiǎn)共有三種:寫(xiě)后讀(RAW)、讀后寫(xiě)(WAR)、寫(xiě)后寫(xiě)(WAW)。數(shù)據(jù)冒險(xiǎn)可能產(chǎn)生數(shù)據(jù)流依賴(lài)。
- 結(jié)構(gòu)型冒險(xiǎn):多條指令同時(shí)訪(fǎng)問(wèn)一個(gè)硬件單元的時(shí)候,由于缺少相應(yīng)的資源,導(dǎo)致結(jié)構(gòu)型冒險(xiǎn)。
- 控制型冒險(xiǎn):存在分支跳轉(zhuǎn),無(wú)法預(yù)測(cè)下一條要執(zhí)行的指令,導(dǎo)致其產(chǎn)生的控制型冒險(xiǎn)。
編譯器解決上述冒險(xiǎn)的方法就是通過(guò)插入 NOP
指令,增加流水間的stall來(lái)化解冒險(xiǎn)。
下面簡(jiǎn)單介紹一下三種數(shù)據(jù)型冒險(xiǎn)(即數(shù)據(jù)依賴(lài)):
- 寫(xiě)后讀(RAW):一條指令讀取前一條指令的寫(xiě)入結(jié)果。寫(xiě)后讀是最常見(jiàn)的一種數(shù)據(jù)依賴(lài)類(lèi)型,這種依賴(lài)被稱(chēng)為真數(shù)據(jù)依賴(lài)(true dependence)。
x = 1; y = x;
- 讀后寫(xiě)(WAR):一條指令寫(xiě)入數(shù)據(jù)到前一條指令的操作數(shù)。這種依賴(lài)被稱(chēng)為反依賴(lài)或反相關(guān)(anti dependence)。
y = x; x = 1;
- 寫(xiě)后寫(xiě)(WAW):兩條指令寫(xiě)入同一個(gè)目標(biāo)。這種依賴(lài)被稱(chēng)為輸出依賴(lài)(output dependence)。
x = 1; x = 2;
指令調(diào)度算法之表調(diào)度(List Scheduling)
表調(diào)度是一種貪心+啟發(fā)式方法,用以調(diào)度基本塊中的各個(gè)指令操作,是基本塊中指令調(diào)度的最常見(jiàn)方法?;诨緣K的指令調(diào)度不需要考慮程序的控制流,主要考慮數(shù)據(jù)依賴(lài)、硬件資源等信息。
表調(diào)度的基本思想:維護(hù)一個(gè)用來(lái)存儲(chǔ)已經(jīng)準(zhǔn)備執(zhí)行的指令的ready列表和一個(gè)正在執(zhí)行指令的active列表,ready列表的構(gòu)建主要基于數(shù)據(jù)依賴(lài)約束和硬件資源信息;根據(jù)調(diào)度算法以周期為單位來(lái)執(zhí)行具體的指令調(diào)度,包括從列表中選擇及調(diào)度指令,更新列表信息。
基本的表調(diào)度算法大致分為以下三步:
- 根據(jù)指令間依賴(lài),建立依賴(lài)關(guān)系圖。
- 根據(jù)當(dāng)前指令節(jié)點(diǎn)到根節(jié)點(diǎn)的長(zhǎng)度以及指令的latency,計(jì)算每個(gè)指令的優(yōu)先級(jí)。
- 不斷選擇一個(gè)指令,并調(diào)度它,
- 使用兩個(gè)隊(duì)列維護(hù)ready的指令和正在執(zhí)行的active的指令;
- 在每個(gè)周期:選擇一個(gè)滿(mǎn)足條件的ready的指令并調(diào)度它,更新ready隊(duì)列;檢查active的指令是否執(zhí)行完畢,更新active列表。
指令調(diào)度案例^[4]^
本案例選自卡內(nèi)基梅隆大學(xué)(Carnegie Mellon University)的Compiler Design課程。
假設(shè)當(dāng)前CPU有兩個(gè)計(jì)算單元(即每個(gè)周期可以執(zhí)行兩條指令);加法指令的latency為 2 cycles,其他指令為 1 cycle。
- 根據(jù)數(shù)據(jù)依賴(lài)關(guān)系構(gòu)建出依賴(lài)關(guān)系圖。
- 計(jì)算指令節(jié)點(diǎn)優(yōu)先級(jí)
優(yōu)先級(jí)計(jì)算公式如下:
其中,表示當(dāng)前指令節(jié)點(diǎn),表示的子節(jié)點(diǎn),表示 "true dependency" ,表示 "anti-dependency" 。
其中I10
為葉節(jié)點(diǎn),優(yōu)先級(jí)為其latency,故結(jié)果為1;I4
為非葉節(jié)點(diǎn),優(yōu)先級(jí)為當(dāng)前節(jié)點(diǎn)latency(I4
為加法指令,latency為2)+ 子節(jié)點(diǎn)的優(yōu)先級(jí),故結(jié)果為3。本例中無(wú)反依賴(lài)(anti-dependency)情形。 - 執(zhí)行調(diào)度
在實(shí)際執(zhí)行調(diào)度時(shí),對(duì)于同等優(yōu)先級(jí)的指令,由于具體調(diào)度方案的不同,會(huì)出現(xiàn)不同的情況,例如本例中出現(xiàn)的場(chǎng)景,可以通過(guò)添加其他度量標(biāo)準(zhǔn)進(jìn)一步優(yōu)化優(yōu)先級(jí)計(jì)算方案。盡管表調(diào)度方法不能保證得到最優(yōu)調(diào)度結(jié)果,但它是接近最優(yōu)解的。
本文只是簡(jiǎn)單介紹了最基本的表調(diào)度方法,在實(shí)際應(yīng)用中,存在各種基于該方法的改進(jìn)方案。關(guān)于LLVM編譯器中的表調(diào)度算法,可以先自行閱讀其源碼,更多相關(guān)介紹,敬請(qǐng)期待。
結(jié)語(yǔ)
本文簡(jiǎn)單介紹了指令調(diào)度的基本概念,指令調(diào)度的原因與影響以及基本的指令調(diào)度算法。
指令調(diào)度作為NP完全問(wèn)題目前依舊尚未有一個(gè)完美的解決方案,對(duì)指令調(diào)度算法的探索與優(yōu)化尚有很大的發(fā)展空間。
LLVM之父Chris Lattner認(rèn)為“編譯器的黃金時(shí)代”已經(jīng)降臨^[5]^。隨著計(jì)算機(jī)架構(gòu)的復(fù)興,未來(lái)的N年里將是每一位編譯器工程師大顯身手的時(shí)代。
參考
- Keith D. Cooper, Linda Torczon. Engineering a Compiler (Second Edition).
- https://zhuanlan.zhihu.com/p/360364235
- Andrew W.Apple, Maia Ginsburg. Modern Compiler Implementation in C.
- https://www.cs.cmu.edu/afs/cs/academic/class/15745-s19/www/lectures/L18-Instruction-Scheduling-pre-class.pdf
- https://zhuanlan.zhihu.com/p/502730940
-
處理器
+關(guān)注
關(guān)注
68文章
19896瀏覽量
235281 -
cpu
+關(guān)注
關(guān)注
68文章
11080瀏覽量
217114 -
指令調(diào)度器
+關(guān)注
關(guān)注
0文章
4瀏覽量
1586
發(fā)布評(píng)論請(qǐng)先 登錄
應(yīng)急通信調(diào)度指揮系統(tǒng)的原理
編譯器優(yōu)化的靜態(tài)調(diào)度介紹
基于ARM Cortex-M3的μCOS-II任務(wù)調(diào)度硬件指令實(shí)現(xiàn)

同時(shí)多線(xiàn)程處理器的指令調(diào)度器設(shè)計(jì)
云環(huán)境下基于動(dòng)態(tài)蟻群遺傳算法的調(diào)度方法研究_尚志會(huì)
柔性負(fù)荷調(diào)度,發(fā)電調(diào)度的補(bǔ)充

Storm環(huán)境下基于權(quán)重的任務(wù)調(diào)度算法

如何在云計(jì)算環(huán)境下進(jìn)行資源調(diào)度算法的研究

機(jī)場(chǎng)智能調(diào)度系統(tǒng)的功能及應(yīng)用方案
HLS優(yōu)化設(shè)計(jì)的最關(guān)鍵指令
云環(huán)境下HEDSM工作流調(diào)度策略綜述
異構(gòu)環(huán)境下的多DAG任務(wù)調(diào)度算法綜述
什么是指令調(diào)度(上)

基于優(yōu)先級(jí)調(diào)度的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核詳解(下)

評(píng)論