1. 程式人生 > >計算機體系結構實驗——流水線及流水線中的衝突

計算機體系結構實驗——流水線及流水線中的衝突

實驗目的

  1. 加深對計算機流水線基本概念的理解。
  2. 理解MIPS結構如何用5段流水線來實現,理解各段的功能和基本操作。
  3. 加深對資料衝突、結構衝突的理解,理解這兩類衝突對CPU效能的影響。
  4. 進一步理解解決資料衝突的方法,掌握如何應用定向技術來減少資料衝突引起的停頓。

實驗平臺

實驗平臺採用指令級和流水線操作級模擬器MIPSsim。

實驗內容和步驟

一 首先要掌握MIPSsim模擬器的使用方法

(1)啟動MIPSsim。
(2)根據預備知識中關於流水線各段操作的描述,進一步理解流水線視窗中各段的功能,掌握各流水暫存器的含義。(用滑鼠雙擊各段,就可以看到各流水暫存器的內容)
(3)參照MIPSsim模擬器使用說明,熟悉MIPSsim模擬器的操作和使用方法。
可以先載入一個樣例程式(在本模擬器所在的資料夾下的“樣例程式”資料夾中)。然後分別以單步執行一條週期、執行多個週期、連續執行、設定斷點等的方式執行程式,觀察程式的執行情況,觀察CPU中暫存器和儲存器的內容的變化,特別是流水暫存器內容的變化。
(4)選擇配置選單中的“流水方式”選項,使模擬器工作於流水方式下。
(5)觀察程式在流水線中的執行情況,步驟如下:

  • 1)選擇MIPSsim的“檔案”—>“載入程式”選項來載入pipeline.s (在模擬器所在資料夾下的“樣例程式”資料夾中)。
    2)關閉定向功能。這是通過“配置”—>“定向”(使該項前面沒有√號)來實現的。
    3)用單步執行一個週期的方式(在“執行”選單中)或按F7鍵執行該程式,觀察每一個週期中,各段流水暫存器內容的變化、指令的執行情況(“程式碼”視窗)以及時鐘週期圖。
    4)當執行到第13個時鐘週期時,各段分別正在處理的指令是:
    IF:LW $r4,60($r6)
    ID:ADDI $r3,$r0,25
    EX:ADDI $r1,$r1,-1
    MEM:ADDI $
    r6,$r0,8
    WB:ADD $r2,$r1,$r0
    畫出這時的時鐘週期圖。
    1

(6)這時各流水暫存器中的內容為:
IF/ID.IR:2361655356
IF/ID.NPC:48
ID/EX.A:0
ID/EX.B:0
ID/EX.Imm:25
ID/EX.IR: 537067545
EX/MEM.ALUo:4
EX/MEM.IR:539099135
MEM/WB.LMD:0
MEM/WB.ALUo:8
MEM/WB.IR:537264136
(7)觀察和分析結構衝突對CPU效能的影響,步驟如下:

  • 1)載入structure_hz.s(在模擬器所在資料夾下的“樣例程式”資料夾中)。
  • 2)執行該程式,找出存在結構衝突的指令fadd, 對以及導致結構衝突的部件::浮點加法器。
  • 3)記錄由結構衝突引起的停頓時鐘週期數,計算停頓時鐘週期數佔總執行週期數的百分比:35/52=67.30769%。
  • 4)把浮點加法器的個數改為4個。
  • 5)再次重複步驟①~③的工作。
  • 6)分析結構衝突對CPU效能的影響,討論解決結構衝突的方法。

結構衝突對CPU效能的影響:當發生衝突時,流水線會出現停頓從而降低CPU的效能
解決結構衝突的方法:在流水線處理機中設定相互獨立的指令暫存器和資料暫存器
(8)觀察資料衝突並用定向技術來減少停頓,步驟如下:

  • 1)全部復位。
  • 2)載入data_hz.s(在模擬器所在的資料夾下的“樣例程式”資料夾中)。
  • 3)關閉定向功能。這是通過“配置”->“定向”(是該項前面沒有√號)來實現的。
  • 4)用單步執行一個週期的方式(F7)執行該程式,同時檢視時鐘週期圖,列出在什麼時刻發生了RAW(先寫後讀)衝突。
    答:在Cycle 4, 6, 7, 9, 10, 13, 14, 17, 18, 20, 21, 25, 26, 28, 29, 32, 33, 36, 37, 39, 40, 44, 45, 47, 48, 51, 52, 55, 56, 58, 59時,發生RAW衝突。
  • 5)記錄資料衝突引起的停頓時鐘週期數以及程式執行的總時鐘週期數,計算停頓時鐘週期數佔總執行週期數的百分比。
    答:資料衝突引起的停頓時鐘週期數為:31,程式執行的總時鐘週期數為:65,停頓時鐘週期數佔總執行週期數的百分比為31/65=47.69231%
  • 6)復位CPU 。
  • 7)開啟定向功能。這是通過“配置”->“定向”(是該項前面有√號)來實現的。
  • 8)用單步執行一個週期的方式(F7)執行該程式,同時檢視時鐘週期圖,列出在什麼時刻發生了RAW(先寫後讀)衝突,並與步驟3的結果進行比較。
    答:在第5,9,13,17,21,25,29,33,37發生了RAW衝突,可以看到,通過定向技術,大大
    減少了RAW衝突數目。
  • 9)記錄資料衝突引起的停頓時鐘週期數以及程式執行的總時鐘週期數。計算採用定向技術後的效能是原來的幾倍。
    答:資料衝突引起的停頓週期數為:9,程式的總時鐘週期數為:43,停頓時鐘週期數佔總執行週期數的百分比為9/43=20.93023%,採用定向技術後的效能是原來的65/43=1.51倍。

二 指令排程和延遲分支

  1. 啟動MIPSsim
  2. 根據預備知識中關於流水線各段操作的描述,進一步理解流水線中各段的功能,掌握各流水線的含義(用滑鼠雙擊各段,就可以看到各流水暫存器的內容)
  3. 勾選配置選單中的“流水方式”,使模擬器工作於流水方式下
  4. 用指令排程技術解決流水線中結構衝突和資料衝突
    a) 啟動MIPSsim
    b) 通過“配置”選單中的“常規配置”項把加法、乘法、除法部件的個數設定為兩個,把他們的延遲時間都設定為3個時鐘週期
    c) 用MIPSsim的“檔案”選單中的“載入程式”來載入schedule.s(在模擬器資料夾下的“樣例程式”中)
    d) 關閉定向功能
    e) 執行所載入的程式,通過檢視統計資料和時鐘週期圖,找出並記錄程式執行過程中各種衝突發生的次數、發生衝突的指令組合,以及程式執行的總時鐘週期數:33個
    答:各種衝突發生的次數:
    RAW停頓:16,佔週期總數的百分比:48.48485%,其中load停頓:6,佔所有RAW停頓的百分比:37.5%
    自陷停頓:1,佔週期總數的百分比:3.030303%
    停頓週期總數:17,佔週期總數的百分比:51.51515%
    發生衝突的指令組合:
    LW $r2,0($r1) 和 ADD $r4,$r0,$r2
    ADD $r4,$r0,$r2 和 SW $r4,0($r1)
    SW $r4,0($r1) 和 LW $r6,4($r1)
    ADD $r8,$r6,$r1 和 MUL $r12,$r10,$r1
    ADD $r16,$r12,$r1 和 ADD $r18,$r16,$r1
    ADD $r18,$r16,$r1 和 SW $r18,16($r1)
    SW $r18,16($r1) 和 LW $r20 8($r1)
    MUL $r22,$r20,$r14 和 MUL $r24,$r26,$r14
    f) 採用指令排程技術對程式進行指令排程,消除衝突。將排程後的程式放到afterschedule.s中
    g) 載入afterschedule.s
    after-schedule.s指令程式碼如下:
    .text
    main:
    ADDIU $r1,$r0,A
    MUL $r22,$r20,$r14
    LW $r2,0($r1)
    MUL $r24,$r26,$r14
    ADD $r4,$r0,$r2
    LW $r6,4($r1)
    SW $r4,0($r1)
    ADD $r8,$r6,$r1
    MUL $r12,$r10,$r1
    ADD $r18,$r16,$r1
    ADD $r16,$r12,$r1
    SW $r18,16($r1)
    LW $r20,8($r1)
    TEQ $r0,$r0
    .data
    A:
    .word 4,6,8
    h) 執行該程式,觀察程式在流水線中的執行情況,記錄程式的總時鐘週期數
    2
    指令排程後的總週期數為21。
    i) 根據記錄結果,比較排程前和排程後的效能。論述指令排程對於提高CPU的作用
    答:排程前的執行週期為33,排程後的執行週期數為21。指令排程可以消除部分的資料衝突,通過使用指令排程提高了CPU的使用率,大大減少了指令衝突的次數,提高了CPU效能。

  5. 用延遲分支減少分支指令對效能的影響
    a) 啟動MIPSsim
    b) 載入branch.asm
    c) 關閉延遲分支功能。這是通過在“配置”選單中去選“延遲分支”來實現的
    d) 執行該程式,觀察並記錄發生分支延遲的時刻,儲存下其時鐘週期圖
    答:分支延遲的時刻:Cycle 6, 9, 13, 21, 24, 28.
    時鐘週期圖如下:
    3
    4
    e) 記錄執行該程式所花的時鐘週期數:38
    假設延遲槽為一個,對branch.asm進行指令排程,然後存到delay-branch.s中
    delay-branch.s的指令程式碼:
    .text
    main:
    ADDI $r2,$r0,1024
    ADD $r3,$r0,$r0
    ADDI $r4,$r0,8
    loop:
    LW $r1,0($r2)
    ADDI $r1,$r1,1
    ADDI $r3,$r3,4
    SUB $r5,$r4,$r3
    SW $r1,0($r2)
    BGTZ $r5,loop
    ADD $r7,$r0,$r6
    TEQ $r0,$r0
    f) 載入delayed-branch.asm
    g) 開啟延遲分支功能
    h) 執行該程式,觀察其時鐘週期圖,儲存下其時鐘週期圖
    5
    6
    i) 對比上述兩種情況下的時鐘週期圖
    j) 根據記錄結果,比較沒有采用延遲分支的效能和採用了延遲分支的效能。論述延遲分支對於提高CPU效能的作用
    答:比較兩種情況的時鐘週期總數,可知:在使用延遲槽後,指令在執行到跳轉指令時,不會出現延遲等待,則能夠提高CPU的效能。