設計一個簡易的處理器(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階段,
(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不對ret的PC進行預測.所以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的類和它的兩個名為Student和Employee子類。
題目:【Person、Student、Employee類】(注:此題在書上原題基礎上有修改)設計一個名為Person的類和它的兩個名為Student和Employee子類。 每個人都有姓名和電話號碼。學生有年級狀態(大一、大二、大三或大四)。將這些狀態定義為常
android 設計一個簡易的Http網路請求框架
一.開發初衷:最近專案中需要用到版本升級這一塊,需要用到一些基本的資料請求與檔案下載功能。之前做專案都是用別人的網路框架,類似retrofit 、 okhttp、 fresco等框架,用的多了,發現這幾個網路請求框架,無非都是 按解決以下幾個問題為導向的: 1
設計一個程序,有一個虛擬存儲區和內存工作區,實現下述三種算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。算法包括:先進先出的算法(FIFO)、最少使用算法(LFU)、最近未使用算法(NUR)
== oat 程序 表示 隊列 ini ++ 等待 進程 第一部分。。。 #include <cstdlib>#include<conio.h> #include<stdio.h>#include<stdlib.h>#incl
設計一個演算法,刪除遞增有序連結串列中值大於mink且小於maxk的所有元素(mink和maxk是給定的兩個引數,其值可以和表中的元素相同,也可以不同)。
語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li
已知兩個連結串列A和B分別表示兩個集合,其元素遞增排列。請設計一個演算法,用於求出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表格,合併1和2單元格,4和7單元格
<!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會平
利用HTML和CSS設計一個靜態的“小米商城官網首頁”
一、小專案說明 這是個例行的小專案練習,主要利用html和css的基礎知識,復刻一個縮減版的小米商城網頁。包括【導航欄】、【頭部logo區,快捷鍵、搜尋框】、【網頁主體】、【網頁尾部】幾個部分。目前只實現靜態的網頁顯示。最終效果圖如下: 二、程式框架 按照開發規範,先
2018年,Mixin 如何在不可能三角的限制下設計一個高併發和快速確認的閃電網路
不可能三角 : 一個分散式記賬系統,不可能同時滿足 可擴充套件性,安全性,和去中心化。 可擴充套件性 :指效能,或者併發能力 安全性 :指賬本一致 去中心化 :這個最有迷惑性,因為人們會把去中心化當作目的。但是去中心的目的是提高生存能力,去中心化越徹底,生存能力越強。 比特幣如何選擇
給出n個學生的考試成績表,每條記錄由學號、姓名和分數和名次組成,設計演算法完成下列操作: (1)設計一個顯示對學生資訊操作的選單函式如下所示: *************************
給出n個學生的考試成績表,每條記錄由學號、姓名和分數和名次組成,設計演算法完成下列操作: (1)設計一個顯示對學生資訊操作的選單函式如下所示: ************************* 1、錄
Netty+Android搭建一個簡易聊天室(實現群聊和私聊)
零,前言 JRBM專案中無論是好友私聊,公開聊天室,還是比賽平臺都需要用到長連線,之前沒有接觸過網路通訊等知識,更別說框架了,因此直接上手netty確實有些困難,在前期主要是在b站上看(https://www.bilibili.com/video/av26415011)這個
架構設計(7)—如何設計一個架構
願景已經確定架構願景和目標。 需求分析明確架構要解決當前什麼問題。 那接下來就是如何著手開始做架構設計。 一、如何開始設計一個架構:方式方法 架構不是像平常寫程式碼一樣,對就是對,錯就是錯,它並無對錯之分,是一個取捨的過程。當我們從0開始做架構的時候,的確是比