Tomasulo 演算法(Tomasulo's algorithm)
/ toh-mah-SOO-loh /
想像一間工坊,每張工作單上帶的不是架子的名稱,而是小小的提領票,寫著「我在等 7 號工作產出的東西」。7 號工作一完成,就把自己的號碼喊遍整個房間,每張持有那張提領票的單子就抓住結果繼續做。沒人爭架子標籤,工作則隨它們的零件何時到來、以任意順序進行。Tomasulo 演算法就是 CPU 版的這套方案:由 IBM 的 Robert Tomasulo 於 1967 年設計的一種硬體方法,用保留站與以標籤為基礎的結果廣播來動態排程指令。
它把三個想法揉成一台能運作的機器。第一,透過保留站標籤做暫存器更名:運算元指名的不是某個架構暫存器,而是生產它的保留站,這自動瓦解了 WAR 與 WAW 假相依。第二,保留站緩衝每道指令,連同它已知的運算元與未知運算元的標籤。第三,一條共同資料匯流排(CDB),每個完成的結果連同其標籤都在上面廣播;每個等候的保留站監聽匯流排,擷取任何它需要其標籤的結果,齊全後就發射。每道指令的流程是:發射(配置保留站、把運算元更名成標籤)、執行(運算元就緒時)、寫結果(在 CDB 上廣播)。
它的重要性兼具歷史與實務:它是幾乎所有動態排程亂序核心的藍圖。1967 年的原始版本並不處理精確例外或推測;現代的組合加上了重排序緩衝區,使得儘管一通亂序執行,結果仍按程式順序提交、例外也精確。所以「Tomasulo 加上重排序緩衝區」就是真實亂序、推測核心的標準教科書配方。
保留站 RS3 存著「div f0 = f2 / f4」,但 f4 還沒就緒;RS3 記下 f4 生產者的標籤。當該生產者把結果與標籤放上共同資料匯流排時,RS3 擷取它,除法便繼續進行——過程中從沒有架構暫存器名稱擋路。
用標籤與廣播匯流排取代暫存器名稱,於是假相依消失。
Tomasulo 在 1967 年的原始設計帶來亂序執行,但沒有精確例外或分支推測——那些需要在其上加裝重排序緩衝區。只把現代推測核心全歸功於 Tomasulo,是高估了 1967 年那套演算法。