【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP)

【從零開始學習計算機科學】【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP)

    • ILP
      • 流水線(pipeline)
      • 流水線調度
      • 循環展開和循環流水
        • 循環展開。循環展開的具體步驟可以描述為,
        • 軟件流水(循環流水)。我們可以通過流水線的思想處理循環的執行,即不需要這一次的循環體執行完畢,就可以開始下一次的循環體的執行。如果來自循環的迭代是獨立的,則可以通過從不同的迭代獲取指令,對于不同循環迭代的交聯指令可以重新組織循環,以便根據從原始循環的不同迭代選擇指令進行執行(類似 Tomasulo算法)
      • 動態調度
        • 記分牌(計分板)算法
      • tomasulo算法
      • 基于硬件的推測
      • 指令多發射
      • 通過存儲器體系結構和帶寬的優化來開發ILP
      • ILP的局限性
      • ILP總結

ILP

所有指令之間可能實現的通過重疊指令的執行過程成為指令級并行(ILP)。ILP通過重疊多個指令來提高性能利用執行指令所需的操作之間的并行性。即每秒鐘執行的指令數增加。而一個指令所需的時間不會更改,但是有可能會增加。ILP對高級(操作系統、程序)不可見。以下為一些常用的ILP技術。

流水線(pipeline)

流水線是實現指令級并行的有效措施之一。本書通過經典的MIPS五周期流水線CPU介紹pipeline技術。當然,流水線并不是只能用于指令級并行,流水線的核心思想可以擴展到許多應用場景,需要我們具體問題具體分析。

我們可以劃分指令的執行為以下 5 個經典的階段:

  • IF:指令提取
    IF階段根據程序計數器(PC)從內存獲取當前指令。
    通過向 PC 添加 4 個指令(因為每個指令是 4 個字節),按順序將 PC 更新到下一個指令的地址。

  • ID: 指令解碼 (帶寄存器提取)
    解碼指令并讀取寄存器;在讀取寄存器時,對可能的分支執行相等性測試(提前分支判斷)。在需要的情況下,對指令的偏移字段進行符號擴展; 通過將符號擴展偏移量添加到遞增的 PC 來計算可能的分支目標地址。在實現了提前分支判斷的CPU中,如果條件測試為true,可以通過將目標地址存儲到 PC 中完成分支指令。

  • EX:執行
    執行或有效地址計算,在載入-存儲體系結構中,無需指令同時計算數據地址并執行數據操作。 ALU 將處理兩種可能性之一。

  • MEM:內存訪問
    訪存階段,對于load指令,ALU的輸出為要讀取的數據的地址,對于store指令,將寄存器的數據寫回到指定存儲器地址,ALU的輸出為要存入的數據的地址。

  • WB: (注冊) 回寫
    寫回階段,將ALU計算的數據或load指令讀出的數據存入寄存器中。

流水線對單個任務的延遲沒有幫助,它有助于整個工作負載的吞吐量。流水線時鐘頻率速率受最慢管道階段限制,流水線的時鐘周期時間的最小值等于這五個階段關鍵路徑的延遲的最大值與寄存器延遲的和。流水線CPU的多個指令在同時運行,并且流水線的最大加速比等于流水線級數。流水線可以縮短每條指令的平均執行時間,這可認為是降低了CPI或時鐘周期時間。實際上,流水線并沒有縮短每條指令執行的總時間。反而,由于流水線開銷,指令的延遲實際上略有增加。

流水線的開銷主要表現在,第一,不平衡的管道階段,最慢的階段主導著總吞吐量。第二,流水線寄存器和時鐘偏斜,第三,寄存器的設置時間存在延遲。

實際中還存在時鐘偏斜,我們假設所有寄存器同時在時鐘邊緣觸發。在實際工作中,由于物理設計不完善,一些寄存器比其他人更早的到達時鐘邊緣。

并且,流水線中存在流水線冒險現象,其會阻止指令流的下一條指令執行。冒險會降低流水化帶來的加速比。

冒險通常會帶來流水線停頓,對于存在冒險的流水線的加速比,我們可以通過以下方式計算。加速比等于1除以1與每條指令的平均流水線停頓周期的和再乘流水線深度,流水線深度等于非流水化時鐘周期除以流水化時鐘周期。

冒險通常分為以下三類,1,結構冒險,即指令所需計算資源繁忙(例如,需要多個階段的指令,在這條指令執行的過程中,不能執行使用這個資源的其他指令)2,數據冒險,即指令之間的數據依賴關系,需要等待以前的指令來完成其數據讀/寫。3,控制冒險,執行流取決于以前的指令。比如分支跳轉指令。

對于不同的冒險,我們采用不同的方法來解決,但是解決這三種不同冒險的思路相似的。

對于結構冒險,其本質上是由于資源不足或者某一模塊流水化程度低導致的,為了避免結構冒險,最簡單方法解決方法便是流水線停頓,即等待上一條指令執行到消除冒險后再執行下一條指令。停頓通常稱為流水線氣泡,或稱為氣泡。對于只有一個寫端口的寄存器堆,在同一個時鐘周期內,若有兩條指令同時去寫寄存器堆,就會產生結構冒險,但是,一般來說,在同一個時鐘周期內,一條指令讀一條指令寫寄存器堆不會產生結構冒險。對于結構冒險的最有力的解決措施是添加硬件資源,可以(幾乎)消除結構危害。完全避免結構性危險是非常昂貴的,對于流水線功能單元成本更高(流水線式 FP ALU 成本高)。如果結構危險是罕見的,就忽略它。例如,如果 FP 操作很少,則只需使用非流水式 FP ALU。

對于數據冒險,數據冒險是由于指令之間的依賴導致的。通常情況下指令之間存在著依賴關系,即數據相關,我們可以把數據相關分為(真)數據相關,名稱相關和控制相關,對于存在依賴關系的兩條指令,其必須順序執行,不能進行重排序。對于真數據相關,我們可以通過合適的調度盡可能地在保持依賴關系的同時減少冒險的發生,對于名稱相關,我們可以通過寄存器重命名解決。數據冒險一定發生于存在依賴關系的指令之間,但是存在依賴關系的指令執行時不一定發生數據冒險。對于控制相關,其主要表現為控制相關的指令受到其對應的控制指令(一般是分支指令)控制,只有在應當執行時去執行。對于控制相關,我們可以通過推測來實現存在控制相關的指令的調度。

數據冒險按數據依賴關系劃分可以分成以下三類。

1,寫后讀(RAW)。寫后讀冒險是由于在寫指令i執行前讀指令j試圖讀取相應的寄存器。

2,讀后寫(WAR)。WAR冒險是由于讀指令i執行前寫指令j試圖寫入相應的寄存器。

3,寫后寫(WAW)依賴。WAR冒險是由于寫指令i執行前寫指令j試圖寫入相應的寄存器。

對于RAW冒險,其來源于真數據依賴,而對于WAR和WAW冒險,其來源于名稱相關,因此,WAR和WAW冒險可以通過寄存器換名解決。

一般來說,對于數據冒險,我們可以通過旁路(數據前推或短路)和流水線暫停實現數據冒險的解決。旁路技術主要是通過將計算結果通過流水線寄存器轉發到當前執行的其他指令之中,其他指令可以通過流水線寄存器獲取存在數據依賴的指令的執行結果而不必要等其執行完畢后才獲取。比如,對于

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71881.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android edittext 防止輸入多個小數點或負號

有些英文系統的輸入法,或者定制輸入法。使用xml限制不了輸入多個小數點和多個負號。所以代碼來控制。 一、通過XML設置限制 <EditTextandroid:id="@+id/editTextNumber"android:layout_width="wrap_content"android:layout_height="wrap_conten…

2019年藍橋杯第十屆CC++大學B組真題及代碼

目錄 1A&#xff1a;組隊&#xff08;填空5分_手算&#xff09; 2B&#xff1a;年號字符&#xff08;填空5分_進制&#xff09; 3C&#xff1a;數列求值&#xff08;填空10分_枚舉&#xff09; 4D&#xff1a;數的分解&#xff08;填空10分&#xff09; 5E&#xff1a;迷宮…

從C#中的MemberwiseClone()淺拷貝說起

MemberwiseClone() 是 C# 中的一個方法&#xff0c;用于創建當前對象的淺拷貝&#xff08;shallow copy&#xff09;。它屬于 System.Object 類&#xff0c;因此所有 C# 對象都可以調用該方法。 1. MemberwiseClone() 的含義 淺拷貝&#xff1a;MemberwiseClone() 會創建一個新…

筆記六:單鏈表鏈表介紹與模擬實現

在他一生中&#xff0c;從來沒有人能夠像你們這樣&#xff0c;以他的視角看待這個世界。 ---------《尋找天堂》 目錄 文章目錄 一、什么是鏈表&#xff1f; 二、為什么要使用鏈表&#xff1f; 三、 單鏈表介紹與使用 3.1 單鏈表 3.1.1 創建單鏈表節點 3.1.2 單鏈表的頭插、…

尚硅谷爬蟲note15n

1. 多條管道 多條管道開啟&#xff08;2步&#xff09;&#xff1a; (1)定義管道類 &#xff08;2&#xff09;在settings中開啟管道 在pipelines中&#xff1a; import urllib.request # 多條管道開啟 #(1)定義管道類 #&#xff08;2&#xff09;在setti…

oracle檢查字段為空

在Oracle數據庫中&#xff0c;檢查字段是否為空通常涉及到使用IS NULL條件。如果你想查詢某個表中的字段是否為空&#xff0c;你可以使用SELECT語句結合WHERE子句來實現。這里有一些基本示例來展示如何進行這樣的查詢。 示例1: 檢查單個字段是否為空 假設你有一個表employees…

虛幻基礎:動畫層接口

文章目錄 動畫層&#xff1a;動畫圖表中的函數接口&#xff1a;名字&#xff0c;沒有實現。動畫層接口&#xff1a;由動畫藍圖實現1.動畫層可直接調用實現功能2.動畫層接口必須安裝3.動畫層默認使用本身實現4.動畫層也可使用其他動畫藍圖實現&#xff0c;但必須在角色藍圖中關聯…

HarmonyOS學習第18天:多媒體功能全解析

一、開篇引入 在當今數字化時代&#xff0c;多媒體已經深度融入我們的日常生活。無論是在工作中通過視頻會議進行溝通協作&#xff0c;還是在學習時借助在線課程的音頻講解加深理解&#xff0c;亦或是在休閑時光用手機播放音樂放松身心、觀看視頻打發時間&#xff0c;多媒體功…

緒論數據結構基本概念(刷題筆記)

&#xff08;一&#xff09;單選題 1.與數據元素本身的形式、相對位置和個數無關的是&#xff08;B&#xff09;【廣東工業大學2019年829數據結構】 A.數據存儲結構 B.數據邏輯結構 C.算法 D.操作 2.在數據結構的討論中把數據結構從邏輯上分為&#xff08;C&#xff09;【中國…

GPTQ - 生成式預訓練 Transformer 的精確訓練后壓縮

GPTQ - 生成式預訓練 Transformer 的精確訓練后壓縮 flyfish 曾經是 https://github.com/AutoGPTQ/AutoGPTQ 現在是https://github.com/ModelCloud/GPTQModel 對應論文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式預訓練Tr…

git的使用方法

文章目錄 前言git簡介GIT的基本操作克隆倉庫 (Clone)獲取最新代碼 (Pull)提交代碼到遠程倉庫查看當前分支查看提交代碼的日志git config 配置用戶信息 GIT的實操 前言 git是一種軟件版本管理工具&#xff0c;在多人團隊軟件開發中地方非常重要。 類似與SVN&#xff0c;git工具…

php虛擬站點提示No input file specified時的問題及權限處理方法

訪問站點&#xff0c;提示如下 No input file specified. 可能是文件權限有問題&#xff0c;也可能是“.user.ini”文件路徑沒有配置對&#xff0c;最簡單的辦法就是直接將它刪除掉&#xff0c;還有就是將它設置正確 #配置成自己服務器上正確的路徑 open_basedir/mnt/qiy/te…

使用Langflow和AstraDB構建AI助手:從架構設計到與NocoBase的集成

本文由 Leandro Martins 編寫&#xff0c;最初發布于 Building an AI Assistant with Langflow and AstraDB: From Architecture to Integration with NocoBase。 引言 本文的目標是演示如何創建一個集成了 NocoBase、LangFlow 和 VectorDB 工具的 AI 助手。作為基礎&#xf…

6.聊天室環境安裝 - Ubuntu22.04 - elasticsearch(es)的安裝和使用

目錄 介紹安裝安裝kibana安裝ES客戶端使用 介紹 Elasticsearch&#xff0c; 簡稱 ES&#xff0c;它是個開源分布式搜索引擎&#xff0c;它的特點有&#xff1a;分布式&#xff0c;零配置&#xff0c;自動發現&#xff0c;索引自動分片&#xff0c;索引副本機制&#xff0c;res…

SSL VXN

SSL VPN是采用SSL&#xff08;Security Socket Layer&#xff09;/TLS&#xff08;Transport Layer Security&#xff09;協議來實現遠程接入的一種輕量級VPN技術,其基于B/S架構&#xff0c;免于安裝客戶端&#xff0c;相較與IPSEC有更高的靈活度和管理性&#xff0c;當隧道建立…

【Qt】成員函數指針

一、成員函數指針的本質 與普通函數指針的區別&#xff1a; // 普通函數指針 void (*funcPtr)() &普通函數;// 成員函數指針 void (MyClass::*memberFuncPtr)() &MyClass::成員函數;? 綁定對象&#xff1a;成員函數指針必須與類的實例對象結合使用 ? 隱含 this 指…

通義萬相2.1開源版本地化部署攻略,生成視頻再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通義萬相 2.1 開源發布&#xff0c;前兩周太忙沒空搞它&#xff0c;這個周末&#xff0c;也來本地化部署一個&#xff0c;體驗生成效果如何&#xff0c;總的來說&#xff0c;它在國內文生視頻、圖生視頻的行列處于領先位置&#xff0c…

Linux——system V共享內存

共享內存區是最快的IPC(進程內通信)形式&#xff0c;不再通過執行進入內核的系統調用來傳遞彼此的數據 1.共享內存的原理 IPC通信的本質是讓不同的進程先看到同一份資源&#xff0c;然后再進行通信&#xff0c;所以想要通過共享內存進行通信&#xff0c;那么第一步一定是讓兩個…

01 SQl注入基礎步驟(數字、字符、布爾盲注、報錯)

目錄 1、SQL注入漏洞的概要 2、SQL注入的常規思路 3、數字型注入 4、字符型注入 5、布爾盲注 6、報錯注入 1、SQL注入漏洞的概要 原理&#xff1a;通過用戶輸入的數據未嚴格過濾&#xff0c;將惡意SQL語句拼接到原始查詢中&#xff0c;從而操控數據庫執行非預期操作。 …

leetcode-sql數據庫面試題沖刺(高頻SQL五十題)

題目&#xff1a; 620.有趣的電影 表&#xff1a;cinema ------------------------ | Column Name | Type | ------------------------ | id | int | | movie | varchar | | description | varchar | | rating | float | ------------------------ id 是該表的主鍵(具有唯一值…