[zt] CPU分支指令預測技術

http://apps.hi.baidu.com/share/detail/20163374

http://hi.baidu.com/www690998078/blog/item/984f0f4cef52c8f0d62afc7a.html

CPU分支指令預測技術
2009年06月19日 星期五 下午 03:57

分支指令預測技術 
     1.分支指令預測 
     在程序中一般都包含有分支轉移指令,據統計,平均每七條指令中就有一條是分支轉移指令.在指令流水線結構中,對於分支轉移指令相當敏感。假設在80486的指令流水線中的第一條指令已進入到譯碼階段,而第二條指令已進入到提取階段(準備進入譯碼器),如果發現第一條指令是分支指令(如跳轉到某個地址),則指令預取隊列中下一條及下下條等指令預取無效。這時(確切地說,等到第一條指令執行期間形成了分支的目標地址),需從目標地址中現取指令,並交付執行,同時應立即清除指令預取隊列,再將目標地址後面的指令預取過來填到隊列中。這表明,一遇到分支指令,整個指令流水線就被打亂一次,稍後才能恢復到正常。顯然,這影響了機器的運行速度。爲此,在Pentium處理器中使用了分支目標緩衝器(Branch Target Buffer,BTB)來預測分支指令。 
       BTB實際是一個能存若干(通常爲256或512)條目的地址存儲部件。當一條分支指令導致程序分支時,BTB就記下這條指令的目標地址,並用這條信息預測這一指令再次引起分支時的路徑,預先從該處預取。下面看一下BTB在循環程序中應用。循環程序在程序設計中使用得十分普遍。在指令級目標程序中構成循環程序需要用轉移指令(條件轉移指令或無條件轉移指令)。看下例: 
                         MOV CX.100 
       LOOP:          …… 
                             ……
                        DEC CX 
                        JNZ LOOP 
                             ……
       在第一次執行到JNZ指令時,預測的轉移地址是存在BTB中的前面一條JNZ指令的目標地址,不是LOOP,這一次預測是錯誤的。但執行後目標地址LOOP便存入到BTB中。等到下一次執行到JNZ指令,就按BTB中的內容來預測,轉移到LOOP,這是正確的。如此,一直到cx的值變爲0之前,也都是對的。當再循環一次CX的值變爲0時,JNZ指令因條件不成立而不實行轉移,而預測仍是LOOP,預取仍按該預測進行,這是第二次預取錯誤。可見,該例中100次循環,有98次預測,確切地說,有98次預測指導下的預取是正確的。同理,對於1000次循環,就會有998次的預取是正確的。即循環次數越多,BTB帶來的效益就越高。 
       圖8.1所示是Pentium處理器的分支預測機制示意圖。指令預取器從位於CPU內
部的L1指令Cache中預取指令(一般情況,從中可以取到,如果其中沒有則訪問位於主板上的L2 Cache,若再沒有則訪問主存儲器),指令預取隊列中的指令按照管道方式(即先進先出)依次進入指令譯碼器,當譯碼時發現是一條分支指令,則檢查BTB中有無該種分支指令的記錄,若有,則立即按照所記錄的目標地址進行預取(目標地址對應的指令及其後面的指令),替代原先已進入指令預取隊列中的指令。在這條指令執行完畢前夕,將該指令的實際目標地址再添入BTB中(當然,在預測正確時,目標地址不會變),以使BTB中總保持最近遇到的分支指令及其目標地址。 
       細心的讀者可能會發現,這似乎和上面提到的沒有分支預測的80486差不多。應該指出,Pentium的分支預測確實是晚了一些,但畢竟作了預測,並根據預測的結果進行了預取。說它進行了預測和預取,是因爲這些是在譯碼後立即做的,從80386開始指令部件中設置了已譯碼指令隊列(參看第七章的圖7.1),指令從譯碼到執行還有一段時間。此外,對條件分支指令判斷條件是否成立以及分支目標地址的形成也需要時間,而這些是在指令執行時進行的。說它預測晚了一些,是因爲總是希望預測在譯碼之前,即在指令預取的過程中進行預測。實際上,這就是在第六代微處理器中得以實現的動態分支預測。 
       2.推測執行與動態分支預測 
       推測執行技術又稱預測執行技術。它的基本思想是:在取指階段,在局部範圍內預先判斷下一條待取指令最有可能的位置,即在取指部件就具有部分執行功能,以便取指的分支預測,保證取指部件所取的指令是按照指令代碼的執行順序取入,而不是完全按照程序指令在存儲器中的存放順序取入。 
       動態分支預測是推測執行的一種具體做法,它是相對靜態分支預測而言的。靜態分支預測在指令到了譯碼器,進行譯碼時,利用BTB中目標地址信息預測分支指令的目標地址(如Pentium處理器那樣);而動態分支預測的預測發生在譯碼之前,即對指令緩衝器(與8086、80386的指令預取隊列基本相同,但有區別。)中尚未進入譯碼器中的那部分標明每條指令的起始和結尾,並根據BTB中的信息進行預測,這樣發現分支指令要早。因此,對動態分支預測,一旦預測有誤,已進入到流水線中需要清除的指令比靜態分支預測時要少,從而提高了CPU的運行效率。

 

Everest的測試項目:
CPU Queen是測試CPU的分支預測能力,以及預測錯誤時所造成的效能影響。 
CPU PhotoWorxx著重於CPU的整數運算能力,利用模擬數位影像處理來進行CPU效能的評估 
CPU ZLib是另一項針對CPU整數運算的測試,利用Zlib這個壓縮函式庫,來計算CPU在處理壓縮檔案時的能力。 
FPU Julia是利用朱利亞碎形幾何運算,來評估CPU的單精度(32bit)浮點運算能力。 
FPU Mandel則利用了"Mandelbrot″碎形幾何運算,來評估CPU的倍精度(64bit)運算能力。 
FPU SinJulia則是利用修改過的朱利亞碎形運算,來評估CPU的延伸精度(80bit)浮點運算能力。

發佈了1 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章