2014-09-02 178 views
2

下面是由James Antonakos撰寫的「英特爾微處理器系列」的無序管道示例。故障紫外線管道

考慮這個指令序列。爲這個例子製作分配給每條指令的時鐘週期數。

1: MOV AL, 2  ; 1 cycle 
2: MOV DL, [SI] ; 3 cycles 
3: MUL DL   ; 2 cycles 
4: INC SI   ; 1 cycle 
5: SUB BX, 4  ; 1 cycle 
6: ADD AX, BX  ; 1 cycle 
7: MOV CX, 2000 ; 1 cycle 

調度指令爲了兩條管線之間:(我知道的這個基本概念。)

Clock Cycle  Pipeline # 1  Pipeline # 2 

1    MOV AL, 5   MOV DL, [SI] 
2    idle    busy 
3    idle    busy 
4    MUL DL   INC SI 
5    busy    SUB BX, 4 
6    ADD AX, BX  MOV CX, 2000 

調度指令無序兩條管線之間:

Clock Cycle  Pipeline # 1  Pipeline # 2 

1    MOV AL, 5   MOV DL, [SI] 
2    INC SI   SUB BX, 4 
3    MOV CX, 2000  busy 
4    MUL DL   idle 
5    ADD AX, BX  idle 

有人可以向我解釋如何處理亂序管道?謝謝!

+1

有一個單元分析即將發生的代碼,並計算出各個指令之間的依賴關係。如果(比如說)一個內存負載出現,會暫停管道一段時間,那麼CPU會嘗試在加載操作之前/之後調度一些其他獨立指令,以便它們可以在加載等待內存系統響應。正在操作相同的指令,但以較少的週期運行,因爲您在等待其他事情時浪費週期。 – 2014-09-02 16:54:32

+0

我明白了。另一個問題。當我們被要求繪製紫外線管道時,NOP被用作佔位符。流水線中的繁忙和閒置之間有什麼區別? – ellekaie 2014-09-02 17:18:50

+1

忙意味着流水線仍在完成指令(因爲某些指令需要超過1個週期)。閒置意味着管道無所事事。 – jliv902 2014-09-02 19:27:46

回答

1

亂序引擎會簡單地將任何就緒(不等待任何依賴關係的操作)操作碼(已分解爲多個部分的指令)並安排它們執行。它看起來有多遠取決於前端獲取和解碼了多少指令。

在您的亂序示例中,直到「MOV DL,[SI]」準備好SI並通過AGEN(地址生成)加載後,才能執行「INC SI」。然而,「SUB BX,4」沒有任何依賴關係,只要HW看到它就準備好執行。