• 沒有找到結果。

3.3. 以資料流向為主的程式化方法

3.3.1. 檢查 ISA 的限制

在把求得表 3-2 的解後檢查以下 ISA 和硬體的限制才能確定所求得之解 是否可以改寫成程式:

(1) 暫存器的使用量:硬體架構中暫存器的數量是有限的,而 SIU DSG 中暫存器的用量是經由生命週期分析而來取決於原始 DFG 的大小 及資料的相依性。因此 16 個暫存器的硬體架構只能實現一定大小 以內的 DFG,對於太大的 DFG 則必需先用人工區分成幾個較小的 DFG 再分別執行。

(2) 存取埠(IO port)的限制:在 DRF 中每一個 RF 都只有一個寫入埠,

所以在 SIU 中如果有兩個以上的運算單元要在同一個 time slot 寫入同一個 DRF 時,這樣就會出現埠數不足的情形。

(3) 乘法器和乘法器的專屬暫存器不能同時工作:這並非是硬體架構的 限制,而是在設計指令集時為了將指令長度簡化到 64 位元以內而 做的取捨。正如 3.2.3 所言,在指令中使用 M 或 fM 的指令時 MR 的 資料就無法被更新,反之亦然。

因此在繼續改成程式碼前必需先考慮硬體架構或 ISA 這些限制的部分。

繼續之前的例子,求解表 3-2,當 N=6 時可得一組如下的解滿足表 3-2 的不等式方程組:

T[1..4]=[4 3 2 1], T[5..8]=[0 5 3 1]

T[9 10]=[2 5]

把求得之解再代回表 3-2 驗証可得表 3-3(a)的聯立方程組,在表 3-3(a) 中,最後結果等於 0 的式子在指令中都可以用 bypass 的方式從輸出結果 直接 bypass 到下一個運算單元當輸入運算子,只有結果不等於 0 的式子 所代表的資料才需要存入暫存器,因此只需要檢查這些不等於 0 的式子是 否有以上的限制的情形即可。以表 3-3(a)的生命週期的式子和 T[1..10]

的解,可以得到表 3-3(b)的生命週期分析圖。在表 3-3(b)把表 3-3(a)中 不等於 0 的式子在資料的出生時間標上”I”;當資料要送到運算單元時標 上”O”。

由表 3-3(b)可以直接看出 AR 的暫存器需求為 3,MR 為 2。並未超出 16 個暫存器的限制。

接著檢查每個 time slot 中在每個 DRF 中標示”I”的數量,不能超過一 個。在表 3-3(b)中,AR 在 time slot=0,3,5 時都必需用到 DRF 的輸入埠,

MR 在 time slot=0 時會用到輸入埠。且都只有 1 個,所以第(2)項限制也 沒問題。

最後檢查 MR 的部分,”I”和”O”不能在同一個 slot。檢查的結果發現:

在 time slot=0 時,”I”和”O”會同時出現,因此第(3)項限制就發生了。

如果沒有發生限制的情形就可以接著把 SIU 的解寫成指令集的程式。在

下節將繼續介紹消除這些限制和改寫成指令的方法。

能完成。

繼續上例,在表 3-3(b)中依暫存器使用量做暫存器分派(register allocation)。分派完暫存器後由表 3-3(b)中雙線的中間部分,可以映射

若要使用(2)的方法時,檢查(2)中的兩個條件。當 time slot=0 時,MR 的輸入埠受到限制,但是 SR 的輸入埠在 time slot=0 時是閒置的,另外

當 time slot=1,3,5 時,乘法器需要該筆資料,因此位移器必需在 time slot=5,1,3 時把資料送出來才能經由 xbar bypass 給乘法器。檢查位移 器在這 3 個 time slot 亦為閒置的,因此可以使用位移器做替代的路徑,

因此把原來程式中,MR5 和 MR6 的值以 SR0 和 SR1 替代。再把運算單元的 排程寫成指令的格式。因此原程式就會變成以下主要迴圈的程式碼:

//assign: R9= input address pointer; R10= output address pointer //change: MR5 -> SR0; SR6 -> SR1 值時,位拸器必需在第 1,3,5 個時脈把值送出來,再經由 crossbar router 的 R13 直接 bypass 到乘法器當運算子。而此迴圈所表示的實際硬體資料 流即如圖 3-5。

圖 3-5 SIU with input queue style 2D

在主要的迴圈寫好後,最後加上迴圈控制的程式碼:加入 IO 所需要實 體的記憶體位址的運算和一些迴圈的所需要的指令就算完成,在此假設輸 入資料的位址已經存於 R9,要輸出資料的位址存於 R10,而迴圈 loop:的 位址存於 R1,以及每次迴圈位址的增加量存於 AR15。因此上面的程式就 可寫成:

//assign: R9= input address pointer; R10= output address pointer //change: MR5 -> SR0; SR6 -> SR1

assign: R1=loop; AR15=4(address increment per loop) loop:

|ADL R0 R0 000|fM MR1 MR5 0| ; //slot=0 cycle=0 |ADD AR3 AR2 000|fM MR4 MR6 0| ; //slot=1 cycle=1 LW R9 |ADD R12 AR1 000| | ; //slot=2 cycle=2 |ADL MO AR2 R11 AR0 000|fM MR3 MR5 0| ; //slot=3 cycle=3 |ADD R11 R14 000| | ; //slot=4 cycle=4 SW R10 R11 |ADL MO AR1 R0 R0 000|fM MR2 MR5 0| ; //slot=5 cycle=5 |ADL AO AR0 R0 R0 000|fM MR1 R11 0|SLA SR1 ; //slot=0 cycle=6 |ADD R12 AR2 000|fM MR4 MR5 0| SR1 0 ; //slot=1 cycle=7 LW R9 |ADD R12 AR1 000| | ; //slot=2 cycle=8 SW R0 R9 |ADL MO AR2 R11 AR0 000|fM MR3 R13 0| SR1 0 ; //slot=3 cycle=9 SW R0 R10 |ADD R11 R14 000| | ; //slot=4 cycle=10 SW R10 R11 |ADL MO AR1 R14 AR15 000|fM MR2 R13 0| SR1 0 ; //slot=5 cycle=11 |ADD AO AR0 R14 AR15 000|LM AO MR5 ;

SW R0 R1 A0 R9 |ADD MO AR3 R0 R0 000|LM SO MR6 ; LW R0 Z AO R10;

LW R0 IO J ;

在加入迴圈的控制後使得原本 12 個時脈的指令變成了 16 個時脈,換句 話說,平均 8 個時脈可完成一次 biquard filter 的運算,比起 folding 方法的 6 個 time slot 多了兩個時脈。這是 unroll 兩層迴圈的情形,由 於計數器暫存器最多可以支援 16 個 word 的資料循序讀寫的容量,所以在 此 ISA 中最多可以 unroll 到 16 層迴圈。當 unroll 到最大 16 層的迴圈時,

加上迴圈控制所花費的 4 個時脈被平分下來就只多了 0.25 個時脈。這樣 就可以幾乎接近 folding 的最佳解的效率。

總結本節的程式化過程可以整理以下的流程圖(圖 3-6)。經過反覆的求 解,檢查即可得到一個較有效率的排程。

圖 3-6 Coding method flow

3.4. 結論

我們提出的 ISA 把暫存器和交換電路規化成 SIU DSG,讓運算單元在經 過排程後可以全力投入 DSP 運算路徑的計算工作。這樣的規劃方法應用於 靜態排程下會讓運算單元的利用變得十分有效率,即使運算單元增加,使 用解方程組的方法一樣能解出平行度相當高的解,讓硬體的利用率提高,

但 SIU DSG 並無法處理需要動態判斷決定運算方式的情形,遇到這樣的情 形還是得靠程式流程或條件式的執行來處理。因此,在分類上此 ISA 架構 十分適合處理資料量大且運算方式固定的 DSP 問題,對於以控制為主的一 般 RISC 應用並無法得到良好的加速的效果。

Start from DFG

Operation allocation

Delay calculation

Solve causality equation

Checking ISA conflict

Finding substitute datapath

of conflicts

Increase N

Life-time analysis Register allocation loop code mapping loop control

code

N

N

Y

Y

第4章 硬體實現

效率比較

於上一章引述了 SIU DSG 的想法,並提出一組 VLIW ISA 和 DRF 的架構。

在本章中,將以這樣的想法實作一個 VLIW DSP 處理器核心。由 3.1 的硬體 架構中,每個欄位的指令解碼成微指令後必需有三種信號控制三種電路(圖 3-1)。

4.1. 微處理器的架構設計 4.1.1. 軟體效能驗証

首先,為了驗証指令集的完整性和效能,首先,我們以 C++寫成一個指 令集模擬器(instruction set simulator;簡稱 ISS)。在這個 ISS 上我 們試著將一些 DSP 的核心,如 DCT, FFT, filter 等等,以手動排程寫成 程式碼。之後再將程式的計算結果和 Matlab 運算結果比較誤差值,確定 ISA 能確實合成 DSP 核心,且程式碼的功能也正確無誤。。

4.1.2. 硬體管線化的規劃

接著是指令管線化的分級。在運算單元分成兩級執行。並在後級的電路 與交換電路整合成輸出選擇(output select)級。因此以一個完整的運算 而言五級架構就如圖 4-1 所示。其中,每級所負責的工作簡述如下:

„ IF: instruction fetch,程式碼在這一級由程式匯流排中讀入

„ ID: instruction decode,在這一級將程式碼解碼微程式,並處理 程式碼中的立即數值(immediate value)和計算索引定址的位址。

另外直接指示暫存器檔和交換電路把資料送到每個執行單元的輸 入端中。

„ EX: execution stage 1, 執行階段的第一級,在這個階段四個運 算單元和四個暫存器都會同時做計算和更新資料的動作。只是在這 一級所處理的資料更新所更新的資料為前兩個指令的運算結果。

„ SEL: execution stage 2 and outputs selection, 這是運算執行 的第二階段,同時會將運算結果由交換電路送到每個暫存器檔的輸 入埠等待下一級存入暫存器中。

„ WB: write back result, 將運算結果寫回輸入佇列的目的地。

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB) Duel

圖 4-1 Pipeline Execution Parallelism

以這樣的管線化分級後,原本的 ISS 就必需更改,SIU DSG 輸入端取得 資料的時間就必需向後延遲 2 個時脈,因此在每次更新暫存檔時,所用來 更新的資料實際上為兩個時脈以前運算元的運算結果。如圖 4-2(a)所 示,SIU 要把輸入端的資料直接繞到(bypass)輸出端也需要在相對的運算 後兩個時脈才能執行。但若已經寫入佇列的資料就不需要,可以在下一個 時脈直接取用。因此以指令的方向來看,5 級的分析在每個指令中:IF、

ID 和 EX 都是處理指令本身的資料,但 SEL 和 WB 所處理的資料是兩個時 脈以前的計算結果。

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB) Register Fetch Output bypass

(a) Data dependence in Pipeline stage

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB)

IF ID EX (SEL) (WB) Branch Taken PC Updated!

Branch Target

(b) Branch control in pipeline stage 圖 4-2 pipeline stage design

另外,有關程式流程的控制,因為 PC 即 R15,是專屬控制單元暫存器 檔中的一員,因此在執行分叉(branch)的指令時,同樣的也會在兩個時脈 後分叉的新位址才會送到暫存器中,因此在分叉指令後的兩個時脈的指令 還是會被執行,這樣的方法稱為延遲分叉(delayed branch)的做法。總 之,在分叉指令後的兩個指令都還是算在迴圈內的指令。IF 要在第三個 時脈後才能取得分叉後新位址的程式碼。(圖 4-2(b))

在加入管線化後,程式必需再重新修正,因為在 SIU 中資料的輸入與輸 出順序的變動都必需重新安排排程與驗証。

4.1.3. 微處理器架構

重新驗証完因管線分級造成輸入輸出順序的變動後的 SIU,之後就每一 級電路所負責的工作定義輸入和輸出的規格,分別合成組合邏輯。

„ IF:輸入為 16 位元 PC 值,輸出為 64 位元程式碼

„ ID:ID 的工作分兩個部分:一為當時時脈的解碼器(ID),和兩個時 脈前的運算輸出的交換電路(SEL)

„ 就解碼器的部分:輸入為程式碼,輸出為運算單元的微程式碼

„ 就交換電路的部分:輸入為四個運算單元的運算結果、PC 值。輸 出為所有運算單元的運算子、所有該送入暫存器檔的資料、和下一 個 PC 值。

„ EX:EX 的工作就運算單元和暫存器檔也有兩種工作:一為運算單元 的運算(EX),和把前兩個時脈的運算結果送入暫存器更新(WB)

‹ 就運算單元部分:輸入為運算子,運算元種類,運算參數。輸 出為運算結果

‹ 就暫存器檔更新部分:輸入為要更新的資料,及存放的目的 地,無輸出。

所有單元的 IO 規格詳繪圖 4-3。再整合所有的單元加上管線化暫存器 (pipeline register)就可以得到完整的微處理器架構如圖 4-4。

圖 4-3 Function Block I/O spec IF

PC(16)

Instruction code(64) Memory select

Address(16) Data (64)

Instruction code(64) ID ALU output(16)

Instruction code(64) ID ALU output(16)

相關文件