版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
簡述影響指令執(zhí)行時間的主要不確定因素 處理器流水線機制論壇上經常有人問,某段語句的執(zhí)行時間是多少;或者是某幾段語句,那段執(zhí)行時間快。絕大多數朋友也會帶著好奇的觀點,在旁邊觀戰(zhàn);通常的回答是:你看芯片手冊吧。類似的帖子和類似的回答很多,但是很少有人能把這個問題回答的清晰和徹底。我覺得,這種提問本來就不專業(yè),答案也不唯一。至于原因?因為一條指令的執(zhí)行時間不僅取決于處理器的頻率,還取決于許多處理器以外的因素。芯片手冊上指令的執(zhí)行時間,通常是不考慮外界因素的:不考慮總線沖突、不考慮內存延遲、不考慮高速緩存機制、不考慮流水線的相關性等。這里我打算分兩次主要介紹下,高速緩存和處理器的流水線機制如何影響指令的執(zhí)行時間的。本次先介紹流水線相關機制。1.流水線技術現(xiàn)代絕大多數的處理器在某個時刻,并不是只處理一個指令,而是按照流水線的形式處理,這和我們實際生活中,車間里的流水線是一個原理。下面我們假設某個處理器有三級流水線:譯指/運算/寫存。這里只是假設,不要對號入座。譯指:處理器讀取并分析指令的功能,比如mov是賦值,add是加法;譯指為下一步的運算提供數據輸入和選擇相應的硬件單元。運算:處理器進行加減乘除移位比較等等運算,不需要運算的指令進行下一步驟排隊”寫存:處理器將運算單元的輸入寫回內存或者寄存器,并更新pc。假設該處理器正在處理四條指令ABCD。每條指令又有三個處理過程,即譯指/運算/寫存。某個時刻處理器的狀態(tài)如下:流水線某個時刻各處理單元的狀態(tài)為:|C指令譯指|B指令運算|A指令寫存|一個coreclock(處理器時鐘)后,流水線的狀態(tài)為:|D指令譯指|C指令運算|B指令寫存|流水線的每個階段,都可以設計出獨立的硬件單元,這些單元之間可以并行運行,從而提高了處理器的并行處理能力。我們假設流水線的每個階段需要耗時1ns,一條指令的完整執(zhí)行時間就是3ns;不采用流水線時,指令的完整執(zhí)行時間是3ns。那么,流水線每1ns有一條指令執(zhí)行完畢,而不采用流水線則3ns才執(zhí)行完畢一條完整的指令;可以看出使用流水線技術后的執(zhí)行效率是原處理器的3倍。(該例子只說明流水線的優(yōu)勢,實際并不那么簡單的數學公式)但是,流水線各個階段的實現(xiàn)需要考慮很多因素。一方面,流水線的多個階段之間相互獨立,前一階段的執(zhí)行輸出是后一階段的執(zhí)行輸入,所以必須有一個地方存儲前一階段的輸出,這樣就必須在流水線的各階段之間插入''暫存器〃。通常它是一類寄存器,對該寄存器的訪問是需要時間的。另一方面,流水線各個階段的功能劃分和執(zhí)行時間的劃分會影響流水線的性能。這里不討論流水線的劃分了,人_人水平不夠。那么,流水線是否會任何時間都這樣平穩(wěn)執(zhí)行呢?有些主要并常見的因素會影響指令的有條不紊執(zhí)行。2.數據相關和數據冒險所謂相關,指前后的指令存在某種關聯(lián);相關分為數據相關和控制相關。我們先介紹數據相關。比如下面的程序:main(){inta,b;a=3;main[0xe3a01003]*movr1,#3b=a;000080e0[0xe1a02001]movr2,r1}以上程序是在ADS1.2上的編譯輸出,變量a對應寄存器r1,變量b對應寄存器r2??梢钥闯?,第5行語句和第4行的語句存在直接關系。以我們前面介紹的三級流水線來看,變量a(寄存器「1)的值必須要等到寫存完畢后,其值才變?yōu)?;而緊接著的語句“movr2,r1〃是把變量a的值賦值到變量b(寄存器「2)里,若等到對變量a賦值的語句寫存完畢了,那么對變量b的賦值語句也運算完畢了,顯然運算階段輸入的數據可能不是3。這里,前者的輸出數據是后者的輸入數據,我們把這種情況叫:數據相關。處理器在處理數據相關時,可能會導致的計算失誤叫數據冒險(所以,處理器必須避免數據冒險)。為了避免處理器真正產生這樣的數據冒險,我們可以把上面的例子修改下:main()TOC\o"1-5"\h\z{inta,b;□a=3;main[0xe3a01003]*movr1,#3asm{nop;000080e0[0xe1a00000]nopnop}000080e4[0xe1a00000] nopb=a;000080e8[0xe1a02001] mov r2,r1}我們在語句“勞3”和“b=a”之間人為加上了nop指令色囂指令,處理器不會做任何顯示的事情)。那么,當語句“勞3”執(zhí)行完寫存時,語句“b=a”才準備開始譯指。這樣,b就能從對應的寄存器中取得正確的值了。通過上面的例子,我們知道,要避免處理器產生數據冒險,可以加Anop指令。但是,上層開發(fā)者如何明白這些道理呢!??!所以,處理器可能會幫助你加入類似的操作(不一定是nop指令)。下面我們介紹處理器通常的做法。另外,不光是寄存器在前后指令引用可能產生數據相關,內存數據、其他內部寄存器等都可能產生數據相關。如何解決數據相關是處理器設計者考慮的事情,但是我們看到:處理器手冊上講到某個指令的執(zhí)行時間時,不會提到這些。就意味著,若干匯編執(zhí)行完畢后,你會發(fā)現(xiàn)時間總和不是手冊上的時間總和!3.流水線停滯處理器為了自動處理數據相關,通常會采取流水線停滯的做法。流水線停滯時,處理器會暫?!毕嚓P指令的后續(xù)指令,止到冒險行為不可能發(fā)生為止。我們一聽就覺得這個棘手吧。處理器通常需要盡早的發(fā)現(xiàn)數據相關,從而盡早的把后續(xù)指令阻塞在譯指階段。阻塞在譯指階段,處理器可以放棄這條相關的指令,轉而插入一個(每個周期插入一個,但pc值不因此增加)nop指令。當冒險條件不滿足時,不再插入nop指令。在前面我們介紹使用nop指令可以解決數據冒險,很多處理器會設計為這樣。同時,插入的這個nop指令叫氣泡。所以,使流水線停滯可以解決數據相關的問題。但是,處理器停滯不是解決數據相關的唯一答案。比如,采取流水線前后的數據反饋和轉發(fā)等機制,不過這樣會加大設計難度。通常很多處理器會將停滯和轉發(fā)等技術綜合使用。要注意,流水線停滯和插入氣泡,實際上是有區(qū)別的。這里為了簡便,我們把插入氣泡也視著流水線停滯。本節(jié)主要是想讓讀者明白,我們查處理器的指令手冊來知道指令的執(zhí)行時間并不可靠??刂葡嚓P和控制冒險前面講到處理器會因為數據相關可能改變已有指令的有條不紊執(zhí)行,那么當遇到分支指令時呢?我們先看下面例子:4main()5{inta=2;main[0xe3a01002]*movr1,#2if(a==1)000080e0[0xe3510001]cmpr1,#1000080e4[0x1a000000]bne0x80ec;(main+0x10){a=3;000080e8[0xe3a01003]movr1,#310}11}000080ec[0xe3a00000]movr0,#0000080f0[0xe1a0f00e]movpc,r14上面的例子同樣是在ADS1.2上的編譯結果。首先把變量a的值賦為2,然后判斷變量a的值是否為1,若a為1則把a賦值為3。假設指令“movr1,#2”為指令(1);指令“cmpr1,#1”為指令(2);指令“bne0x80ec”為指令(3);指令“movr1,#3”為指令(4);指令“movr0,#0”為指令(5)。同樣,依前面講到的三級流水線來看。當指令(2)準備執(zhí)行寫存階段時,指令(4)是否執(zhí)行呢??擺在處理器面前的是兩條選擇:譯指指令(4)?譯指指令(5)?我們把前面這種分支語句的相關叫控制相關。同樣,處理器可能會因為控制相關而產生錯誤的行為叫控制冒險。如果你注意思考,你會發(fā)現(xiàn),使用流水線停滯同樣可以解決控制相關。不錯!所以流水線停滯是一個影響指令執(zhí)行時間的常見原因。實際實現(xiàn)時,處理器也可能會在某些控制相關停滯流水線。F面介紹處理器通常還會用什么樣的做法來解決控制相關呢?分支預測前面介紹了控制相關,產生控制相關的情況依處理器不同可能有不同,但是分支語句通常會產生控制相關;另外,函數調用和函數返回會產生控制相關;允許直接對pc賦值的處理器,在對pc賦值時,產生控制相關。所以這里我要強調依處理器不同,匯編指令有所不同。比如同樣是函數返回:X86采用ret指令;而ARM的MOV指令也可以用于函數返回(見前一節(jié)例子的最后一句匯編)。總的來說,流水線如果在譯指(流水線前端)不容易判斷的分支,那么處理器就會進行一個預測。這種預測就是分支預測。而對某些指令,流水線一看就知道要跳轉的,那么流水線通常會停滯,等待正確的pc確定。所以,我又要強調不同處理器了?。。。〖热皇穷A測,那么就會存在預測失誤的時候。預測失誤,處理器就會嘗試恢復正確的執(zhí)行“軌跡〃。要恢復正確的執(zhí)行'軌跡〃就勢必會做額外的事情。我們把這種由于預測錯誤,而帶來的額外開銷就叫預測錯誤懲罰。當處理器預測正確分支時,沒多大改變,繼續(xù)往前執(zhí)行。但是,當預測錯誤時,處理器必須丟棄預測部分的執(zhí)行結果,并恢復回剛才的預測點,重新在正確的pc處取指令開始執(zhí)行。根據很多資料介紹,預測錯誤的處罰開銷,相比停滯的開銷大很多。所以,處理器在處理預測的時候,會比較謹慎,這個部分也是處理器性能的體現(xiàn)。我們可以發(fā)現(xiàn),一個循環(huán)次數龐大的循環(huán)代碼,在一個好的分支預測處理器上運行和在一個預測能力差的處理器上運行,他們的時間可能會差距相當遠。通常,在沒有分支預測的處理器上,會采用停滯等簡單做法。預測的算法也有多種,限于水平,這里不能多介紹了。請大家見諒。通過前面幾節(jié)的介紹,我們知道:表面平靜的湖面,湖面以下可能波濤洶涌。它可能無形的影響你的代碼運行時間。亂序執(zhí)行處理器前面主要介紹流水線對指令執(zhí)行時間的影響,后面做為附加介紹吧。在前面的章節(jié),我們主要介紹的傳統(tǒng)的處理器的流水線。當編譯器把指令選取完成后,處理器只能被動的運用各種技巧來提高運行效率。有一種處理器,它可以根據自己的算法來重新選擇指令的執(zhí)行先后,從而提高執(zhí)行效率。這種處理器就叫亂序執(zhí)行處理器。不管亂序處理器如何“亂〃,它必須保證執(zhí)行結果和不'亂〃的結果一致。比如,數據相關的例子。如果語句“b=a"之后,有其他不產生任何與正在執(zhí)行的指令相關的指令時,亂序執(zhí)行的處理器就可能先執(zhí)行這樣的不相關指令了;等冒險消失后,再執(zhí)行語句'b=a"0這樣,亂序執(zhí)行,提高了流水線的利用率,流水線減少了停滯的概率。不過亂序對分支語句的效果應該不理想。所以,當你在處理器手冊上找指令的執(zhí)行時間時,再當這個處理器還是亂序執(zhí)行的處理器時,這個時間越來越偏離理論值。超標量處理器前面知道了流水線的一些知道,也許有的人會想到使用級數很多的流水線來提高流水線效率,我們把這種流水線級數的多少叫深度。超標量處理器通常就是指這種流水線深度較深的處理器,不過具體多少深度才叫超標量處理器,我也沒找到具體定義。公認的奔騰系列處理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 營銷活動策劃方案母嬰(3篇)
- 飛機大科普知識
- 2026重慶沙坪壩區(qū)陳家橋社區(qū)衛(wèi)生服務中心招聘考試參考試題及答案解析
- 2026年公安部直屬事業(yè)單位鄭州警察學院招聘(55人)考試備考試題及答案解析
- 靜脈輸血安全監(jiān)測與風險管理
- 2026年榆林市青少年宮圍棋老師招聘參考考試題庫及答案解析
- 2026北京市豐臺區(qū)消防救援支隊政府專職消防員招錄30人備考考試題庫及答案解析
- 臺州路橋農商銀行2026年招聘開始啦!備考考試題庫及答案解析
- 2026上半年杭州市第七人民醫(yī)院公開招聘高層次人才25人備考考試試題及答案解析
- 2026浙江杭州市學軍小學教育集團誠聘體育教師(非事業(yè))1人備考考試試題及答案解析
- 社區(qū)警務專業(yè)能力等級評定考試大綱練習試題
- 球囊導管擴張技術課件
- 六年級上冊英語書詞匯表
- 《微電子封裝技術》課程教學大綱
- 城市軌道交通服務員(城市軌道交通站務員)考核要素細目表與考核內容結構表
- JBT 12530.4-2015 塑料焊縫無損檢測方法 第4部分:超聲檢測
- 江西省吉安市初中生物七年級期末下冊高分預測題詳細答案和解析
- 《中國心力衰竭診斷和治療指南2024》解讀(總)
- DZ∕T 0033-2020 固體礦產地質勘查報告編寫規(guī)范(正式版)
- 瀝青拌合站方案
- 輪機英語題庫
評論
0/150
提交評論