我想知道一個亂序超標量處理器(讓我們假設一個Intel i7處理器)的每個週期的提取指令數量是否不變,或者它可能會根據緩存未命中率或分支未命中預測數量給定的代碼/程序?如果無序超標量處理器的每個週期取指令的數量是恆定的?
如果不是恆定的,該如何解釋它背後的原因?據我所知,在現代多核處理器中,解碼器單元總是試圖解決依賴關係,並嘗試用獨立指令填充管道氣泡。因此,對於任何給定的工作負載,提取的指令數量不應總是相同(大約)?
我想知道一個亂序超標量處理器(讓我們假設一個Intel i7處理器)的每個週期的提取指令數量是否不變,或者它可能會根據緩存未命中率或分支未命中預測數量給定的代碼/程序?如果無序超標量處理器的每個週期取指令的數量是恆定的?
如果不是恆定的,該如何解釋它背後的原因?據我所知,在現代多核處理器中,解碼器單元總是試圖解決依賴關係,並嘗試用獨立指令填充管道氣泡。因此,對於任何給定的工作負載,提取的指令數量不應總是相同(大約)?
在給定週期內獲取的指令數取決於多個因素。對於Intel第四代Core處理器,當使用指令緩存而不是μop緩存時,每個週期都會獲取一個對齊的16字節指令塊。從這個塊到最多六個指令可以被解析並放置在一個指令隊列中(最多可以容納來自線程的20條指令)。如果可以融合兩條指令(也稱爲宏操作),則第一指令解碼爲不超過四個融合的微指令,並且其餘三條指令解碼爲單一融合的微指令,則來自該隊列的多達五條指令可以被解碼。得到的μops存儲在一個56個條目的μop解碼隊列中(也可用作循環緩衝區)。 (解碼爲四個以上μops的指令使用特殊的微碼引擎。)
由於x86具有可變長度指令(長達15個字節),因此16字節塊中的指令數量可能會有所不同。另外,對於採用分支,分支的目標可能不會與16字節塊對齊,並且分支指令可能不會在塊的最後一個字節上結束;這意味着具有未對齊的採納分支目標的塊的開始處的字節將被忽略,並且在採取的分支之後的塊內的字節將被忽略。如果分支目標緩衝區和指令高速緩存具有兩個週期延遲,則在採用的分支上,在該分支之後的週期中,分支指令開始被提取將不會有目標可用於獲取以下指令)
如果存在指令高速緩存未命中,則不會從該線程獲取指令,直到缺少高速緩存行變爲可用。類似地,在從指令高速緩存進一步獲取之前,必須服務TLB未命中。
μop緩存對每個週期讀取的指令數量有不同的限制。每個週期可從μop緩存中讀取四個μops。這可以對應於一條指令或(與宏操作融合)超過四條指令。由於μop緩存被虛擬尋址,因此TLB未命中不會延遲讀取(儘管在μop緩存命中時TLB未命中不太可能)。
(四μops可以從μop解碼隊列移動到60-條目調度每個週期。)
隨着分支誤預測,由於管道被沖洗,沒有一個分支之後取出的指令將有助於獲取有效指令的次數。在檢測到分支錯誤預測之前,指令將被提取(有些可能被執行),但它們不會影響提交的指令數量。
此外,指令的緩衝量有限。如果依賴於具有數據高速緩存未命中調度緩衝區的負載的μops可能會被填滿,這會導致指令在μop解碼隊列中累積(因爲該隊列將不再被排空),然後緊接在獲取之後的指令隊列會很快因爲它不能流入μop解碼隊列。
排序緩衝區(ROB)對離開μop解碼隊列的指令放置了另一個限制;當ROB滿時,沒有更多的指令可以移入調度緩衝區。如果最老的指令尚未完成,即使所有以下191條指令已完成並準備提交,也會發生這種情況。
即使沒有數據高速緩存未命中,操作之間的依賴關係也會導致緩衝區填滿,從而導致取指操作停止。你可能會猜到,擁有第二個線程可以通過減少分支預測的影響(實際上只有一半的指令從流水線刷新)並提供更多的指令級並行性(因爲指令從獨立的線程將是獨立的),它允許操作執行並最終提交,排空各種緩衝區。由於存在指令的這種實質緩衝,並且大多數軟件不能一致地充分利用執行寬度,所以獲取儘可能多的指令的壓力較小,因爲每個循環可能執行的指令較少。高質量的分支預測也意味着更多的獲取指令將被實際使用。 (在分支錯誤預測中,更廣泛的獲取會更快地填滿調度緩衝區,從而增加了獨立操作的可能性。由於多線程增加了可用的指令級並行度,這也爲更廣泛的獲取提供了動機,但它也是降低了取消檔位的頻率和成本以抵消該激勵)。
非常感謝您的詳細解釋! – precision
每個週期取指令*字節*的數量通常是恆定的,但是對於可變長度指令(或從取塊中間離開或進入的分支),取指令的數量將趨於變化。使用Pentium Pro型約束解碼器(其中只有第一條指令可以解碼爲多個μops),每個週期解碼的指令數可以少於取塊中的數(如果第二條指令將解碼爲多個μops,則它必須等待直到下一個週期)。 (稍後可以發佈實際答案。) –