1. 程式人生 > >設計一個簡易的處理器(7)--流水線的相關和冒險

設計一個簡易的處理器(7)--流水線的相關和冒險

PIPE-已經是一個流水線化的處理器了,但是當相近指令間存在相關時PIPE-會出現問題.後一指令引用前一指令的結果,是非常常見的,所以一個完整的處理器必須要解決這個問題.

本文探討流水線的兩種形式的相關及其冒險.

相關的兩種形式

————

相關有兩種形式

(1).資料相關.下一條指令要用到上一條指令計算出的結果.

(2).控制相關.一條指令要確定下一條指令的位置.比如:跳轉指令,呼叫或者返回指令.

這些相關導致流水線得到不正確的計算結果,稱為冒險(hazard).相應地,分別對應資料冒險和控制冒險.

資料冒險

————

1.資料相關一例

irmovl$10,%edx

irmovl$3,%eax

addl %edx, %eax

2.資料冒險

指令的執行在流水線處理器中被劃分為若干階段,同一個時刻有多條指令處於流水線的不同階段(所以, SEQ/SEQ+不會存在這個問題).當出現讀取資料和寫入資料之間的時空相關性時,如果不加以處理,可能會發生資料冒險.

有三種可能的資料冒險:寫後讀(RAW),讀後寫(WAR),寫後寫(WAW).

對於簡單的PIPELINE來說,只有RAW可能會導致資料冒險.另外兩種情況在superscalar處理器(亂序處理器)中才會發現.

3.資料相關可能導致資料冒險

假定程式暫存器原始值為0.

1:  3 Nop's 資料相關造成資料冒險.

2: 2 Nop's

資料相關造成資料冒險

3: 1 Nop資料相關造成資料冒險

4: No Nop資料相關造成資料冒險

4.資料冒險的本質和種類

SEQ/SEQ+中不用考慮冒險的問題,因為每條指令都是等到前面的指令執行完才進入CPU,換一句話說,前一條指令的可見狀態都一次性更新之後才會執行下一條指令,也就是說,當前指令執行所需要的資料都有了.PIPE會產生冒險就在於讀取下一條指令所需要的資料並沒有完全準備好.

前面說過,PIPE的實現中,只需要考慮寫後讀(RAW)的問題.根據程式的可見狀態可以具體到以下幾種:

(1).程式暫存器

-這是最典型導致資料冒險的情形.

-讀取程式暫存器在Decode階段,

更新程式暫存器在Write Back階段發生(2種情況,以後討論).

(2).控制碼

/寫控制碼都在執行階段發生.所以不會發生資料冒險.

(3). PC

-/ PC會導致控制冒險.

(4).儲存器

-/寫儲存器都在Memory階段發生.

-儲存器在Memory階段被當作資料存取,Fetch階段被當作程式碼存取.如果程式碼會修改自身,那麼就有可能出冒險.

-本系統不允許"修改自身的程式碼",所以,也就不會發生冒險.

控制冒險

————

1.兩種控制冒險

(1).預測錯誤的分支

例如:

0x000:    xorl %eax,%eax

0x002:    jne t         # Not taken

0x007:    irmovl $1, %eax# Fall through

0x00d:    nop

0x00e:    nop

0x00f:     nop

0x010:    halt

0x011: t:irmovl $3, %edx# Target (Should not execute)

0x017:    irmovl $4, %ecx   # Should not execute

0x01d:    irmovl $5, %edx   # Should not execute

5:分支預測錯誤,導致控制冒險

(2). ret

前文說過, PIPE不對retPC進行預測.所以ret也會導致控制冒險.

例如:

        (Copyright© 2011, Randal E. Bryant and David R. O'Hallaron )

reference:

相關推薦

設計一個簡易處理器(7)--流水線相關冒險

PIPE-已經是一個流水線化的處理器了,但是當相近指令間存在相關時PIPE-會出現問題.後一指令引用前一指令的結果,是非常常見的,所以一個完整的處理器必須要解決這個問題. 本文探討流水線的兩種形式的相關及其冒險. 相關的兩種形式 ———— 相關有兩種形式 (1).資料相

設計一個簡易處理器(6)--簡單的流水線實現PIPE-

上一篇已經介紹了SEQ+的實現,本篇介紹流水線的通用原理及其簡單的流水線實現PIPE-. SEQ/SEQ+的侷限性 ———— 通過前面幾篇文章介紹SEQ/SEQ+,不難發現SEQ/SEQ+的一些侷限性. -實際中的SEQ/SEQ+太慢, CPU的時鐘太慢,效能太差.

設計一個簡易處理器(4)--SEQ CPU的實現(2):SEQ CPU的控制邏輯與硬體實現

接上文,本文介紹SEQ CPU的邏輯和硬體實現.著重使用HCL語言描述SEQ CPU的邏輯. Y86/SEQ概述 ———— SEQ是 Sequential CPU的實現,表現在指令的執行要依次經歷各個階段(Fetch->Decode->Execut-&g

設計一個簡易處理器(1)--定義指令集體系結構(ISA)

處理器的主要作用就是執行指令,那麼設計處理器的第一步就是要定義或者相容指令集體系結構(Instruction Set Architecture,ISA). 定義一個指令集體系結構,包括定義各種狀態元素,指令集及編碼,一組程式設計規範和異常事件處理. 傳統的指令集的設計

筆試題:設計一個登入程式,不同的使用者名稱對應密碼存在一個字典裡面...........,具體如下

實現如下:def Login(): while True: username = input("請輸入使用者名稱:") if username not in passwd.keys() or username == "" \

《JAVA繼承與多型》【Person、Student、Employee類】(注:此題在書上原題基礎上有修改)設計一個名為Person的類它的兩個名為StudentEmployee子類。

題目:【Person、Student、Employee類】(注:此題在書上原題基礎上有修改)設計一個名為Person的類和它的兩個名為Student和Employee子類。 每個人都有姓名和電話號碼。學生有年級狀態(大一、大二、大三或大四)。將這些狀態定義為常

android 設計一個簡易的Http網路請求框架

    一.開發初衷:最近專案中需要用到版本升級這一塊,需要用到一些基本的資料請求與檔案下載功能。之前做專案都是用別人的網路框架,類似retrofit 、 okhttp、 fresco等框架,用的多了,發現這幾個網路請求框架,無非都是 按解決以下幾個問題為導向的:   1

設計一個演算法,刪除遞增有序連結串列中值大於mink且小於maxk的所有元素(minkmaxk是給定的兩個引數,其值可以表中的元素相同,也可以不同)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

已知兩個連結串列AB分別表示兩個集合,其元素遞增排列。請設計一個演算法,用於求出A與B的交集,並存放在A連結串列中。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值最小值;教材2-15

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值; 解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值 可以用陣列第一個元素來初始化max,min 然後遍歷陣列,分別和max,min比較,一遍就可以找

H5 寫一個3x3表格,合併12單元格,47單元格

<!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">    &nb

走進設計模式的世界7:我們很像但不是一個人好嗎?-介面卡模式外觀模式

介面卡模式: 將一個類的介面,轉接成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。 外觀模式: 提供了一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。 設計原則:最少知識原則:只和你的密友談話。 解釋:當需要使用一個現有

設計一個具有陣列越界的異常處理的程式,假設計算n個實數的,用陣列存放。分別採用3種異常處理方式設計程式

Java三種不同的異常處理方法 第一種:不處理,交給jvm處理 package chuki; import java.util.*; public class one { public static void main(String[] args) { int n, sum = 0

Connectionist Temporal Classification(CTC)、音識別模型小型綜述一個簡易的語音識別模型的tensorflow實現

CTC是一種端到端的語音識別技術,他避免了需要字或者音素級別的標註,只需要句子級別的標註就可以進行訓練,感覺非常巧妙,也很符合神經網路浪潮人們的習慣。特別是LSTM+CTC相較於之前的DNN+HMM,LSTM能夠更好的捕捉輸入中的重要的點(LSTM隨著狀態數目增加引數呈線性增加,而HMM會平

利用HTMLCSS設計一個靜態的“小米商城官網首頁”

一、小專案說明   這是個例行的小專案練習,主要利用html和css的基礎知識,復刻一個縮減版的小米商城網頁。包括【導航欄】、【頭部logo區,快捷鍵、搜尋框】、【網頁主體】、【網頁尾部】幾個部分。目前只實現靜態的網頁顯示。最終效果圖如下:   二、程式框架   按照開發規範,先

2018年,Mixin 如何在不可能三角的限制下設計一個高併發快速確認的閃電網路

不可能三角 : 一個分散式記賬系統,不可能同時滿足 可擴充套件性,安全性,和去中心化。 可擴充套件性 :指效能,或者併發能力 安全性 :指賬本一致 去中心化 :這個最有迷惑性,因為人們會把去中心化當作目的。但是去中心的目的是提高生存能力,去中心化越徹底,生存能力越強。 比特幣如何選擇

給出n個學生的考試成績表,每條記錄由學號、姓名分數名次組成,設計演算法完成下列操作: (1)設計一個顯示對學生資訊操作的選單函式如下所示: *************************

給出n個學生的考試成績表,每條記錄由學號、姓名和分數和名次組成,設計演算法完成下列操作: (1)設計一個顯示對學生資訊操作的選單函式如下所示: *************************        1、錄

Netty+Android搭建一個簡易聊天室(實現群聊私聊)

零,前言 JRBM專案中無論是好友私聊,公開聊天室,還是比賽平臺都需要用到長連線,之前沒有接觸過網路通訊等知識,更別說框架了,因此直接上手netty確實有些困難,在前期主要是在b站上看(https://www.bilibili.com/video/av26415011)這個

架構設計(7)—如何設計一個架構

願景已經確定架構願景和目標。 需求分析明確架構要解決當前什麼問題。 那接下來就是如何著手開始做架構設計。 一、如何開始設計一個架構:方式方法 架構不是像平常寫程式碼一樣,對就是對,錯就是錯,它並無對錯之分,是一個取捨的過程。當我們從0開始做架構的時候,的確是比