本申請(qǐng)是申請(qǐng)日為2013年6月14日申請(qǐng)?zhí)枮榈?01380043007.5號(hào)發(fā)明名稱為“無消歧亂序加載存儲(chǔ)隊(duì)列”的中國(guó)專利申請(qǐng)的分案申請(qǐng)。
本申請(qǐng)要求2012年6月15日由mohammada.abdallah提交的題為“adisambiguation-freeoutoforderloadstorequeue”的共同待決共同轉(zhuǎn)讓的美國(guó)臨時(shí)專利申請(qǐng)序號(hào)61/660,528的權(quán)益,并且該申請(qǐng)被整體地并入到本文中。
本發(fā)明總體涉及數(shù)字計(jì)算機(jī)系統(tǒng),更具體地涉及用于選擇指令(包括指令序列)的系統(tǒng)和方法。
背景技術(shù):
要求處理器來處理相關(guān)或完全獨(dú)立的多個(gè)任務(wù)。此類處理器的內(nèi)部狀態(tài)通常由在程序執(zhí)行的每個(gè)特定時(shí)刻可能保持不同的值的寄存器組成。在程序執(zhí)行的每個(gè)時(shí)刻,將內(nèi)部狀態(tài)圖像稱為處理器的架構(gòu)狀態(tài)。
當(dāng)架構(gòu)代碼執(zhí)行切換成運(yùn)行另一功能(例如,另一線程、進(jìn)程或程序)時(shí),然后必須保存機(jī)器/處理器的狀態(tài),使得新功能可以利用內(nèi)部寄存器以構(gòu)建其新狀態(tài)。一旦新功能已終止,則可以丟棄其狀態(tài),并且先前情境的狀態(tài)將被恢復(fù)且該執(zhí)行又繼續(xù)。此類切換過程稱為情境切換,并且通常包括10個(gè)或數(shù)百個(gè)循環(huán),尤其是在采用大量寄存器(例如,64、128、256)和/或亂序執(zhí)行的現(xiàn)代架構(gòu)的情況下。
在線程感知硬件架構(gòu)中,硬件支持用于有限數(shù)目的硬件支持線程的多個(gè)情境狀態(tài)是正常的。在這種情況下,硬件復(fù)制用于每個(gè)所支持線程的所有架構(gòu)狀態(tài)元素。這消除了在執(zhí)行新線程時(shí)的情境切換的需要。然而,這仍具有多個(gè)缺點(diǎn),即復(fù)制用于用硬件中所支持的每個(gè)附加線程的所有架構(gòu)狀態(tài)元素(即,寄存器)的面積、功率和復(fù)雜性。另外,如果軟件線程的數(shù)目超過明確支持的硬件線程的數(shù)目,則仍必須執(zhí)行情境切換。
這變得常見,因?yàn)樵谝蟠罅烤€程的細(xì)粒度基礎(chǔ)上需要并行性。具有復(fù)制情境狀態(tài)硬件存儲(chǔ)的硬件線程感知架構(gòu)無助于非線程軟件代碼,并且僅僅減少了用于被線程化的軟件的情境切換的次數(shù)。然而,那些線程通常是針對(duì)粗粒并行性而構(gòu)造的,并且導(dǎo)致用于發(fā)起和同步、離開細(xì)粒并行性的沉重軟件開銷,諸如函數(shù)調(diào)用和回路并行執(zhí)行,而沒有高效的線程化發(fā)起/自動(dòng)生成。此類所述開銷伴隨著針對(duì)非明確/容易并行化/線程化軟件代碼而使用現(xiàn)有技術(shù)編譯程序或用戶并行化技術(shù)進(jìn)行此類代碼的自動(dòng)并行化的困難。
技術(shù)實(shí)現(xiàn)要素:
在一個(gè)實(shí)施例中,將本發(fā)明實(shí)現(xiàn)為一種無消歧亂序加載存儲(chǔ)隊(duì)列方法。該方法包括:實(shí)現(xiàn)能夠被多個(gè)異步核心訪問的存儲(chǔ)器資源;實(shí)現(xiàn)存儲(chǔ)退出緩沖器,其中來自存儲(chǔ)隊(duì)列的存儲(chǔ)具有按照原始程序順序的存儲(chǔ)退出緩沖器中的條目;并且在分派來自加載隊(duì)列的后續(xù)加載時(shí),在存儲(chǔ)退出緩沖器中搜索地址匹配。該方法還包括:在其中存在多個(gè)地址匹配的情況下,通過針對(duì)第一匹配掃描存儲(chǔ)退出緩沖器來定位正確的轉(zhuǎn)發(fā)條目;以及將來自第一匹配的數(shù)據(jù)轉(zhuǎn)發(fā)至后續(xù)加載。
前述是概要且因此必要地包含細(xì)節(jié)的簡(jiǎn)化、一般化以及省略;因此,本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到的是該概要僅僅是說明性的且并不意圖以任何方式是限制性的。單獨(dú)地由權(quán)利要求定義的本發(fā)明的其他方面、發(fā)明特征以及優(yōu)點(diǎn)在下面闡述的非限制性詳細(xì)描述中將變得顯而易見。
附圖說明
在附圖中以示例的方式而不是以限制的方式舉例說明本發(fā)明,并且在附圖中相同的附圖標(biāo)記指示類似元件。
圖1示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的加載隊(duì)列和存儲(chǔ)隊(duì)列。
圖2示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的加載和存儲(chǔ)指令分離的第一圖。
圖3示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的加載和存儲(chǔ)指令分離的第二圖。
圖4示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的過程的步驟的流程圖,其中圖示出用于實(shí)現(xiàn)從由加載存儲(chǔ)重新排序和優(yōu)化所引發(fā)的推測(cè)性轉(zhuǎn)發(fā)缺失預(yù)測(cè)/錯(cuò)誤中恢復(fù)的規(guī)則。
圖5示出了圖示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用處理器的加載隊(duì)列和存儲(chǔ)隊(duì)列資源來實(shí)現(xiàn)過程300的規(guī)則的方式的圖。
圖6示出了圖示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用處理器的加載隊(duì)列和存儲(chǔ)隊(duì)列資源來實(shí)現(xiàn)過程300的規(guī)則的方式的另一圖。
圖7示出了圖示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用處理器的加載隊(duì)列和存儲(chǔ)隊(duì)列資源來實(shí)現(xiàn)過程300的規(guī)則的方式的另一圖。
圖8示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的其中在加載之后分派存儲(chǔ)的分派功能的概述的過程的流程圖。
圖9示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的其中在存儲(chǔ)之后分派存儲(chǔ)的分派功能的概述的過程的流程圖。
圖10示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的統(tǒng)一加載隊(duì)列的圖。
圖11示出了示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的滑動(dòng)加載分派窗口的統(tǒng)一加載隊(duì)列。
圖12示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的分布式加載隊(duì)列。
圖13示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的具有按序連續(xù)性的分布式加載隊(duì)列。
圖14示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于多核處理器的分段存儲(chǔ)器子系統(tǒng)的圖。
圖15示出了如何通過本發(fā)明的實(shí)施例來處理加載和存儲(chǔ)的圖。
圖16示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的存儲(chǔ)過濾算法的圖。
圖17示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的在組成按序從存儲(chǔ)器進(jìn)行讀取的加載的存儲(chǔ)器一致性模型中具有亂序加載的信號(hào)量實(shí)現(xiàn)方式。
圖18示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的到通過使用基于鎖的模型和基于事務(wù)的模型兩者而組成按序的用于存儲(chǔ)器的加載讀取的存儲(chǔ)器一致性模型中的亂序加載。
圖19示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的多核分段存儲(chǔ)器子系統(tǒng)的多個(gè)核心。
圖20示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的訪問統(tǒng)一存儲(chǔ)隊(duì)列的異步核心的圖,其中存儲(chǔ)可以基于存儲(chǔ)資歷而從任一線程獲得。
圖21示出了描繪根據(jù)本發(fā)明的一個(gè)實(shí)施例的其中存儲(chǔ)相比于其他線程中的對(duì)應(yīng)存儲(chǔ)而言具有資歷的功能的圖。
圖22示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的非消歧亂序加載存儲(chǔ)隊(duì)列退出實(shí)現(xiàn)方式。
圖23示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的非消歧亂序加載存儲(chǔ)隊(duì)列重新排序?qū)崿F(xiàn)方式的重新排序?qū)崿F(xiàn)方式。
圖24示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的指令序列(例如,蹤跡)重新排序的推測(cè)性執(zhí)行實(shí)現(xiàn)方式。
圖25示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的示例性微處理器管線的圖。
具體實(shí)施方式
雖然已結(jié)合一個(gè)實(shí)施例描述了本發(fā)明,但本發(fā)明并不意圖局限于本文中所闡述的特定形式。相反地,其意圖涵蓋可以適當(dāng)?shù)匕ㄔ谟伤綑?quán)利要求定義的本發(fā)明的范圍內(nèi)的此類替換、修改以及等同物。
在以下詳細(xì)描述中,已闡述了許多特定細(xì)節(jié),諸如特定方法順序、結(jié)構(gòu)、元件以及連接。然而應(yīng)理解的是不需要利用這些及其他特定細(xì)節(jié)來實(shí)施本發(fā)明的實(shí)施例。在其他情況下,已省略眾所周知的結(jié)構(gòu)、元件或連接或未特別詳細(xì)地描述以避免不必要地使本描述含糊。
在本說明書內(nèi)對(duì)“一個(gè)實(shí)施例”或“實(shí)施例”的引用意圖指示在本發(fā)明的至少一個(gè)實(shí)施例中包括結(jié)合該實(shí)施例所述的特定特征、結(jié)構(gòu)或特性。短語(yǔ)“在一個(gè)實(shí)施例中”在本說明書內(nèi)的各種位置上的出現(xiàn)并不一定全部參考同一實(shí)施例,也不是其他實(shí)施例的互斥的單獨(dú)或替換實(shí)施例。此外,描述了某些實(shí)施例可展示出而其他的沒有的各種特征。同樣地,描述了對(duì)于某些實(shí)施例而言可能是要求但其他實(shí)施例并非如此的各種要求。
隨后的詳細(xì)描述的某些部分是在對(duì)計(jì)算機(jī)存儲(chǔ)器內(nèi)的數(shù)據(jù)位的操作的程序、步驟、邏輯塊、處理及其他符號(hào)表示方面提出的。這些算法描述和表示是數(shù)據(jù)處理領(lǐng)域的技術(shù)人員用來最有效地向本領(lǐng)域的其他人傳達(dá)其工作的實(shí)質(zhì)的手段。程序、計(jì)算機(jī)執(zhí)行步驟、邏輯塊、過程等在這里且一般地被設(shè)想為是導(dǎo)致期望結(jié)果的步驟或指令的自相一致序列。該步驟是要求物理量的物理操作的那些。通常但不一定,這些量采取計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的電或磁信號(hào)的形式,并且能夠在計(jì)算機(jī)系統(tǒng)中被存儲(chǔ)、傳輸、組合、比較以及操縱。主要由于一般使用的原因,已證明將這些信號(hào)稱為位、值、元素、符號(hào)、字符、項(xiàng)、數(shù)字等有時(shí)是方便的。
然而,應(yīng)記住的是所有這些和類似術(shù)語(yǔ)將與適當(dāng)?shù)奈锢砹肯嚓P(guān)聯(lián)且僅僅是應(yīng)用于這些量的方便標(biāo)記。如從以下討論顯而易見的那樣,除非另外具體地說,應(yīng)認(rèn)識(shí)到的是遍及本發(fā)明,利用諸如“處理”或“訪問”或“寫”或“存儲(chǔ)”或“復(fù)制”等等術(shù)語(yǔ)的討論指的是計(jì)算機(jī)系統(tǒng)或類似電子計(jì)算設(shè)備的動(dòng)作或過程,其對(duì)在計(jì)算機(jī)系統(tǒng)的寄存器和存儲(chǔ)器及其他計(jì)算機(jī)可讀介質(zhì)內(nèi)表示為物理(例如,電子)量的數(shù)據(jù)進(jìn)行操縱并變換成在計(jì)算機(jī)系統(tǒng)存儲(chǔ)器或寄存器或其他此類信息存儲(chǔ)、傳輸或顯示設(shè)備內(nèi)同樣地表示為物理量的其他數(shù)據(jù)。
本發(fā)明的實(shí)施例實(shí)現(xiàn)了亂序指令調(diào)度過程,其中允許輸入指令序列內(nèi)的指令在處理器資源可用于執(zhí)行它們時(shí)就立即亂序發(fā)出。本發(fā)明的實(shí)施例能夠確保外部代理見到指令按序執(zhí)行(例如,存儲(chǔ)器一致性規(guī)則/模型)。
確保指令對(duì)外部代理可見地按序執(zhí)行,從而確保無錯(cuò)誤程序執(zhí)行。本發(fā)明的實(shí)施例確保處理器的存儲(chǔ)器分級(jí)結(jié)構(gòu)(例如,l1高速緩存、l2高速緩存、系統(tǒng)存儲(chǔ)器等)見到指令的一致按序執(zhí)行。
圖1示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的加載隊(duì)列和存儲(chǔ)隊(duì)列。圖1還示出了輸入指令序列。如上所述,處理器的存儲(chǔ)器分級(jí)結(jié)構(gòu)(例如,l1高速緩存、l2高速緩存、系統(tǒng)存儲(chǔ)器等)見到指令的一致性按序執(zhí)行。其后常常稱為加載/存儲(chǔ)隊(duì)列的加載隊(duì)列和存儲(chǔ)隊(duì)列可以用來保持按序執(zhí)行的語(yǔ)義。
另外,加載和存儲(chǔ)的亂序執(zhí)行引發(fā)推測(cè)性執(zhí)行。當(dāng)執(zhí)行推測(cè)性執(zhí)行時(shí),機(jī)器需要識(shí)別推測(cè)性錯(cuò)誤。在圖1的實(shí)施例中,加載/存儲(chǔ)隊(duì)列提供了一種用于實(shí)現(xiàn)從由加載存儲(chǔ)重新排序和優(yōu)化引發(fā)的推測(cè)性轉(zhuǎn)發(fā)或缺失預(yù)測(cè)/錯(cuò)誤中恢復(fù)的系統(tǒng)。加載/存儲(chǔ)隊(duì)列包括允許從作為轉(zhuǎn)發(fā)、分支和錯(cuò)誤的結(jié)果而由加載存儲(chǔ)重新排序/優(yōu)化引發(fā)的推測(cè)性錯(cuò)誤中恢復(fù)的硬件支持。為了允許機(jī)器從推測(cè)性錯(cuò)誤中恢復(fù),將推測(cè)性執(zhí)行的結(jié)果保持在加載隊(duì)列和存儲(chǔ)隊(duì)列中。加載隊(duì)列和存儲(chǔ)隊(duì)列保持推測(cè)性執(zhí)行的結(jié)果直至可以修正錯(cuò)誤且可以使存儲(chǔ)結(jié)果退出(retire)至存儲(chǔ)器為止。加載隊(duì)列和存儲(chǔ)隊(duì)列的推測(cè)性執(zhí)行內(nèi)容對(duì)于外部代理而言是不可見的。相對(duì)于可見性,存儲(chǔ)需要按序退出至存儲(chǔ)器。
圖2示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的加載和存儲(chǔ)指令分離的第一圖。本發(fā)明的一個(gè)特征是這樣的事實(shí),即加載被分離成兩個(gè)宏指令,第一個(gè)進(jìn)行地址計(jì)算并取讀到臨時(shí)位置(加載存儲(chǔ)隊(duì)列),并且第二個(gè)是存儲(chǔ)器地址內(nèi)容(數(shù)據(jù))到寄存器或alu目的地的加載。應(yīng)注意的是雖然在將加載和存儲(chǔ)指令分離成兩個(gè)相應(yīng)宏指令并將其重新排序的情境內(nèi)描述了本發(fā)明的實(shí)施例,但可以通過在微代碼情境內(nèi)將加載和存儲(chǔ)指令分離成兩個(gè)相應(yīng)微指令并將其重新排序來實(shí)現(xiàn)該方法和系統(tǒng)。
該功能對(duì)于存儲(chǔ)而言是相同的。存儲(chǔ)也被分離成兩個(gè)宏指令。第一指令是存儲(chǔ)地址和取讀,第二指令是該地址處的數(shù)據(jù)的存儲(chǔ)。存儲(chǔ)和兩個(gè)指令的分離遵循與下面針對(duì)加載所述的相同規(guī)則。
加載到兩個(gè)指令的分離允許運(yùn)行時(shí)間優(yōu)化器在給定指令序列內(nèi)早得多地調(diào)度地址計(jì)算和取讀指令。這允許通過將數(shù)據(jù)預(yù)取讀到與高速緩存分級(jí)結(jié)構(gòu)分離的臨時(shí)緩沖器中而更容易地從存儲(chǔ)器缺失恢復(fù)。使用臨時(shí)緩沖器以便保證關(guān)于la/sa和ld/sd之間的一一對(duì)應(yīng)的經(jīng)預(yù)取讀的數(shù)據(jù)的可用性。如果存在與處于加載地址與加載數(shù)據(jù)之間的窗口中的在先存儲(chǔ)的別名使用(例如,如果從先前的存儲(chǔ)檢測(cè)到轉(zhuǎn)發(fā)情況)或者如果地址計(jì)算存在任何錯(cuò)誤問題(例如,頁(yè)面錯(cuò)誤),則對(duì)應(yīng)的加載數(shù)據(jù)指令可以重新發(fā)出。另外,將加載分離成兩個(gè)指令還可以包括將信息復(fù)制到兩個(gè)指令中。此類信息可以是地址信息、源信息、其他附加標(biāo)識(shí)符等。此復(fù)制允許在不存在la/sa的情況下進(jìn)行兩個(gè)指令的ld/sd的獨(dú)立分派。
加載地址和取讀指令可以在不等待加載數(shù)據(jù)返回的情況下從實(shí)際機(jī)器退出窗口退出,由此甚至在高速緩存缺失該地址(例如,在段落開頭處提到的加載地址)的情況下允許機(jī)器向前進(jìn)行。例如,在高速緩存缺失該地址(例如,地址x)時(shí),機(jī)器可能停頓達(dá)幾百個(gè)循環(huán)等待從存儲(chǔ)器分級(jí)結(jié)構(gòu)取讀數(shù)據(jù)。通過在不等待加載數(shù)據(jù)返回的情況下使加載地址和取讀指令從實(shí)際機(jī)器退出窗口退出,機(jī)器仍可以向前進(jìn)行。
應(yīng)注意的是指令的分離使得本發(fā)明的實(shí)施例的關(guān)鍵優(yōu)點(diǎn)能夠?qū)a/sa指令重新排序得早于且更加遠(yuǎn)離ld/sd指令序列以使得能夠?qū)崿F(xiàn)加載和存儲(chǔ)的較早分派和執(zhí)行。
圖3示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的加載和存儲(chǔ)指令分離的第二圖。圖2實(shí)施例示出了如何使用復(fù)制特征以便規(guī)定加載指令的分離。在本實(shí)施例中,將加載復(fù)制成兩個(gè)宏指令,第一個(gè)是地址計(jì)算和取讀到臨時(shí)位置(加載存儲(chǔ)隊(duì)列)中,并且第二個(gè)是存儲(chǔ)器地址內(nèi)容(數(shù)據(jù))到寄存器或alu目的地中的加載。應(yīng)注意的是雖然在將加載和存儲(chǔ)指令復(fù)制成兩個(gè)相應(yīng)宏指令并將其重新排序的情境下描述本發(fā)明的實(shí)施例,但可以通過在微代碼情境下將加載和存儲(chǔ)指令復(fù)制成兩個(gè)相應(yīng)微指令并將其重新排序來實(shí)現(xiàn)該方法和系統(tǒng)。
現(xiàn)在描述根據(jù)本發(fā)明的一個(gè)實(shí)施例的指令分離功能的更詳細(xì)描述。在一個(gè)實(shí)施例中,指令集不具有到la、sa、ld或sd的直接模擬指令。在此類實(shí)施例中,用指令前綴laf、saf、lasaf和伴隨后綴指令的組合來實(shí)現(xiàn)這些概念。并且粗略地確實(shí)映射到la上的指令集具有l(wèi)ad且sa具有sad,并且可以實(shí)現(xiàn)組合ladsad。還可以將這些概念實(shí)現(xiàn)為微代碼內(nèi)的微指令。
a)可以將在這里被定義為laf—前綴+后綴指令的描述為‘ld’。
b)可以將在這里被定義為saf—前綴+后綴指令的描述為‘sd’。
c)可以將在這里被定義為lad指令的描述為‘la’。
d)可以將在這里被定義為sad指令的描述為‘sa’。
e)此外,我們具有l(wèi)asaf指令和ladsad指令。這些指令包括可以用來實(shí)現(xiàn)信號(hào)量(鎖定原子)操作的組合laf/saf—前綴+后綴指令。還可能定義組合lad—sad指令以再次地預(yù)取讀存儲(chǔ)器操作數(shù),結(jié)果產(chǎn)生硬件的復(fù)雜化。
lad代表‘la-去融合’
lad指令發(fā)起到執(zhí)行管線中的數(shù)據(jù)預(yù)取讀。其與正常預(yù)取讀的不同之處在于其直接地加載到執(zhí)行管線中,可承擔(dān)比一級(jí)高速緩存更低的執(zhí)行時(shí)延。在一個(gè)實(shí)施例中,通過將固定儲(chǔ)存裝置用于可以使用在la—ld對(duì)之間的id鏈路(例如qid數(shù))來標(biāo)記的la—ld對(duì)來實(shí)現(xiàn)此功能。lad指令計(jì)算有效存儲(chǔ)器地址(例如,來自潛在復(fù)雜規(guī)范),指定操作數(shù)大小(字節(jié)、半字、字、雙字或更大);發(fā)起存儲(chǔ)器引用;通過tlb和高速緩存分級(jí)結(jié)構(gòu)。記錄例外(翻頁(yè)缺失、特權(quán)、保護(hù))以在laf+后綴執(zhí)行時(shí)報(bào)告,或者替換實(shí)現(xiàn)方式可以使q條目取消/無效,迫使laf+后綴指令重新執(zhí)行,并且其將出現(xiàn)例外。
lad指令具有一般格式和操作數(shù):
lad(os)qid,m[ea]
·ea—是有效地址規(guī)范,其可以是基礎(chǔ)寄存器、索引寄存器、移位因數(shù)和/或索引偏移的組合。例如m[b,ri,sf,offset]
·os—是要讀取的字節(jié)數(shù)的指示
·qid—將被用于存儲(chǔ)器引用操作的加載存儲(chǔ)器qid。其還用來鏈接lad的操作和后續(xù)laf前綴的指令。qid在1至n范圍內(nèi),n是實(shí)現(xiàn)特定值。期望值是31、63、127。qid=0被預(yù)留給不具有前l(fā)ad的laf指令的特殊情況。qid=0始終立即被laf使用,因?yàn)槠洳豢捎糜趌ad。
laf代表‘la-融合’。
laf是指令前綴,意味著其必須與后綴指令直接耦合(或融合)。后綴指令可以是獨(dú)立的。后綴指令可以是具有至少一個(gè)源寄存器的任何指令。作為前綴的laf必須被耦合。laf前綴改變后綴指令的性質(zhì)。其寄存器操作數(shù)中的一個(gè)或多個(gè)被前綴重新定義為存儲(chǔ)器隊(duì)列標(biāo)識(shí)符(qid)。此外,被關(guān)聯(lián)為源自于寄存器的數(shù)據(jù)現(xiàn)在源自于存儲(chǔ)器隊(duì)列。
laf-前綴+后綴指令可具有也可不具有前l(fā)ad指令。如果qid==0,則laf沒有前l(fā)ad。如果qid?。?,則laf具有或曾具有前l(fā)ad。當(dāng)意圖創(chuàng)建加載指令到la和ld的分離時(shí),則laf將具有qid?。?且將用在laf前面的同一qid將lad實(shí)例化(例如,這基本上創(chuàng)建la/ld對(duì))。
當(dāng)laf/后綴執(zhí)行且具有qid==0時(shí),使用存儲(chǔ)器隊(duì)列的0條目來完成‘la’操作、存儲(chǔ)器讀、將數(shù)據(jù)升級(jí)到存儲(chǔ)器隊(duì)列,并且然后通過將數(shù)據(jù)加載到后綴指令源來完成,將所應(yīng)用的操作與潛在其他源組合,并將結(jié)果寫入一個(gè)或多個(gè)后綴指令目的地寄存器。另一方面,如果qid?。?,則針對(duì)匹配qid查閱存儲(chǔ)器隊(duì)列(查找),如果存在的話,則從存儲(chǔ)器隊(duì)列讀取數(shù)據(jù),并且應(yīng)用后綴指令的操作,并將結(jié)果寫入目的地寄存器。如果匹配qid是有效但不完整的,則數(shù)據(jù)停頓直至數(shù)據(jù)可用為止。如果qid是無效的,則laf具有足夠的信息(地址和數(shù)據(jù)操作操作數(shù)大小)以重新開始該操作。匹配的qid可能由于多種原因而不存在,其中的某些是:
a)前l(fā)ad從未執(zhí)行、壞編碼或其他原因。
b)laf與前l(fā)ad之間的執(zhí)行流程被例外或中斷所打斷
c)居間的存儲(chǔ)操作與lad的地址別名使用且使其數(shù)據(jù)完整性無效。
在這些情況中的任何一個(gè)中,laf前綴+后綴具有足以重復(fù)lad(la)操作的信息。這種能力使得我們的lad指令成為暗示。lad不必成功地執(zhí)行或者在這方面甚至超過作為用于正確代碼的nop以使用它之外而實(shí)現(xiàn)。
具有后綴指令的laf指令的一般格式和操作數(shù)是:
lafm[ea]
suffix(os)rt,qid,….
laf指令借用是操作數(shù)大小、qid,并且來自后綴指令的編碼。如果后綴是simd,則其還從后綴借用操作的simd寬度。始終在后綴指令的源寄存器規(guī)范字段中的一個(gè)中對(duì)qid進(jìn)行編碼。在smi的特定實(shí)現(xiàn)方式中,這始終是位23:18,但情況不必如此。
sad代表‘sa-去融合’
sad是到僅用于存儲(chǔ)的lad的并行指令。其也預(yù)取讀數(shù)據(jù),將數(shù)據(jù)送到高速緩存以用于修改。此外,其創(chuàng)建存儲(chǔ)器存儲(chǔ)隊(duì)列條目。主要sad具有2個(gè)主要用途:
a)作為預(yù)取讀,讀取以用于數(shù)據(jù)的修改
b)保持正確的存儲(chǔ)器排序并暴露并處理在存儲(chǔ)(寫)之前促進(jìn)加載(讀)之后的潛在讀后寫危險(xiǎn)
sad是暗示指令。sad指令計(jì)算有效存儲(chǔ)器地址(潛在地來自復(fù)雜規(guī)范),指定湊作數(shù)大小(字節(jié)、半字、字、雙字等);發(fā)起存儲(chǔ)器引用;通過tlb、高速緩存/存儲(chǔ)器分級(jí)結(jié)構(gòu)。在saf+后綴執(zhí)行時(shí)記錄例外(翻頁(yè)缺失、特權(quán)、保護(hù))以重新執(zhí)行且其出現(xiàn)例外。
sad指令具有一般格式和操作數(shù):
sad(os)m[ea],qid
·ea—是有效地址規(guī)范,其可以是基礎(chǔ)寄存器、索引寄存器、移位因數(shù)和/或索引偏移的組合。例如m[b,ri,sf,offset]
·os—是要寫入ea的字節(jié)數(shù)的指示
·qid—將被用于存儲(chǔ)器引用操作的存儲(chǔ)存儲(chǔ)器qid。其還用來鏈接sad的操作和后續(xù)saf前綴指令。qid在1至n范圍內(nèi),n是實(shí)現(xiàn)特定值。期望值是31、63、127。qid=0被預(yù)留給不具有前sad的saf指令的特殊情況。此qid始終立即被saf使用。
saf代表‘sa-融合’
saf是laf前綴的并行前綴,僅用于存儲(chǔ)。作為前綴,其必須與后綴指令直接地耦合(或融合)。后綴指令可以是獨(dú)立的。后綴指令可以是具有至少一個(gè)目標(biāo)寄存器的任何指令。作為前綴的saf耦必須被合。saf改變后綴指令的性質(zhì):目的地寄存器操作數(shù)中的一個(gè)或多個(gè),其正常地是到存儲(chǔ)器存儲(chǔ)隊(duì)列標(biāo)識(shí)符(qid)中的寄存器選擇索引,并且操作從以寄存器為目標(biāo)到以存儲(chǔ)器(更確切地存儲(chǔ)器隊(duì)列條目)為目標(biāo)。同樣地,其將寄存器操作變成存儲(chǔ)存儲(chǔ)器操作。
saf指令可具有也可不具有前sad。如果qid==0,則saf沒有前sad。如果qid?。?,則saf具有或曾具有前sad。當(dāng)saf/后綴執(zhí)行時(shí),如果qid==0,則使用存儲(chǔ)器隊(duì)列的0條目來完成‘sa’操作,存儲(chǔ)器寫,將數(shù)據(jù)升級(jí)到存儲(chǔ)器隊(duì)列,并且然后通過存儲(chǔ)由后綴指令源供應(yīng)的數(shù)據(jù)來完成。另一方面,如果qid?。?,則針對(duì)匹配qid查閱存儲(chǔ)器隊(duì)列(查找),如果存在的話,數(shù)據(jù)將在應(yīng)用后綴指令時(shí)被寫入存儲(chǔ)器隊(duì)列條目。如果匹配qid是有效但不完整的,則數(shù)據(jù)停頓直至數(shù)據(jù)可用為止。如果qid是無效的,則saf具有足夠的信息(地址和數(shù)據(jù)操作操作數(shù)大小)以又繼續(xù)該操作并完成存儲(chǔ)器寫操作。。匹配qid可能由于多種原因而不存在,其中的某些是:
a)前sad從未執(zhí)行、壞編碼或其他原因。
b)saf與前sad之間的執(zhí)行流程被例外或中斷所打斷
在這些情況中的任何一個(gè)中,saf前綴+后綴具有足以重復(fù)sad(sa)操作的信息。這種能力使得我們的sad指令稱為暗示。sad不必成功地執(zhí)行或者在這方面甚至超過作為用于正確代碼的nop以使用它之外而實(shí)現(xiàn)。
lasaf是指令前綴
作為前綴的lasaf修改與源和目的地具有相同寄存器的指令。lasaf將此類指令變成原子存儲(chǔ)器引用讀/寫一次操作。使用來自加載存儲(chǔ)器隊(duì)列的一個(gè)和來自存儲(chǔ)存儲(chǔ)器隊(duì)列的一個(gè)。不存在前l(fā)ad或sad指令。
lasafm[ea3]
addqid1,qid2,r1
lasaf創(chuàng)建加載和存儲(chǔ)存儲(chǔ)器隊(duì)列兩者中的qid條目。并且其將使用qid2來讀取存儲(chǔ)器[ea3],添加r1并將結(jié)果存儲(chǔ)在存儲(chǔ)存儲(chǔ)器qid1中,實(shí)行m[ea3]的原子讀修改寫。
smi實(shí)現(xiàn)(如果我們將實(shí)現(xiàn)它)將要求qid1==qid2==0。但是我們不想只局限于該實(shí)現(xiàn)方式。
我們可以具有l(wèi)asad指令,認(rèn)為是這樣,但我們必須始終向存儲(chǔ)器隊(duì)列中進(jìn)行嗅探以完成它。使命中的嗅探上的兩個(gè)條目都無效。并且在lasaf上重新執(zhí)行加載/存儲(chǔ)。
示例性使用:
a.遠(yuǎn)遠(yuǎn)在數(shù)據(jù)的使用之前在促進(jìn)加載之后保存寄存器資源。
假設(shè)原始代碼為
ldrr1,m[ea1]
add32rt,r1,r2
為了隱藏存儲(chǔ)器訪問時(shí)延,我們希望在執(zhí)行流程中在r1數(shù)據(jù)(add)的使用之上盡快地促進(jìn)ldr。
ldrr1,m[ea1]
...許多指令
add32rt,r1,r2
這樣做的一個(gè)負(fù)面效應(yīng)是其保持r1寄存器‘忙碌’等待數(shù)據(jù),并且其不能被用于其他目的。存儲(chǔ)器隊(duì)列擴(kuò)展資源池以保持?jǐn)?shù)據(jù)。因此我們將ldr轉(zhuǎn)換成lad和后續(xù)lad:
ladqid,m[ea1]
...許多指令
lafm[ea1]
add32rt,qid,r2
由于加載隊(duì)列條目qid被使用,r1被自由地用于其他目的。
或者加載具有rt-qid的差的rt,或者如果qid不存在,則從m[ea1]重新加載數(shù)據(jù),從其減去r2,并將結(jié)果放置在rt中。
應(yīng)足以的是用上述實(shí)現(xiàn)方式,不需要存儲(chǔ)器地址計(jì)算在2個(gè)加載之間匹配。如果兩個(gè)地址計(jì)算不同且qid仍是有效的,則很有可能存在不好的程序員。os(在我們的示例32中)也不必在lad與laf之間匹配。比所需更多的數(shù)據(jù)可被lad讀取,在這種情況下,將使用數(shù)據(jù)讀取的最低有效字節(jié)?;蛘遧af+后綴可能需要比lad讀更多的數(shù)據(jù),在這種情況下將使用由lad讀取的最低有效字節(jié),后面是0直至后綴操作足夠?yàn)橹埂4送?,地址?jì)算操作數(shù)不必在lad與laf之間匹配,雖然為了有良好的編碼,其應(yīng)獲得相同的結(jié)果產(chǎn)生的有效地址。
b.通過使正常alu寄存器—寄存器操作變成alu寄存器存儲(chǔ)器操作,節(jié)省執(zhí)行循環(huán)。
在這里,我們正在使用特殊qid=0(%0)僅僅是為了將正常寄存器—寄存器add指令變成存儲(chǔ)器引用。由于laf是前綴且必須直接耦合到add,所以在中間不存在指令。qid=0始終可供使用,因?yàn)槠淞⒓幢皇褂谩?/p>
lafm[ea1]
add32rt,%qo,r2
laf有效地將以上指令變成
add32rt,m[eal],r2
我們還可以使用saf來將alu寄存器—寄存器操作變體成將alu操作的結(jié)果存儲(chǔ)到存儲(chǔ)器中的操作。
safm[ea1]
add%qo,r2,r3
將把將r2和r3相加的結(jié)果在地址ea1處存儲(chǔ)到存儲(chǔ)器中。
c.促進(jìn)存儲(chǔ)之上加載時(shí),保持順序語(yǔ)義
另一問題是我們想要促進(jìn)存儲(chǔ)(str)之上加載(ldr),其可以也可不與加載的地址別名使用。別名:ea1的某些或所有數(shù)據(jù)地址與ea2相同.
strm[ea2]
ldrr1,m[ea1]
add32rt,r1,r2
變成
ldrr1,m[ea2]
0至許多指令
strm[ea2],r3
0至許多指令
add32rt,rl,r2
為了安全地完成此操作(生成正確代碼),我們需要工具以完成此操作。在這里,我們使用lad和sad指令兩者及其相應(yīng)的laf和saf前綴+后綴指令,并且能夠保持執(zhí)行順序且生成正確的代碼。
loop:
sadm[ea2],r3
0至許多指令
a)
ladr1,m[ea1]
0至許多指令
b)
safm[ea1],r3
0至許多指令
c)
saf-后綴
lafm[ea1]
d)
brn回路
在以上代碼中,必須促進(jìn)lad和sad兩者且其保持相同的排序??赡馨l(fā)生什么?在每個(gè)點(diǎn)a、b、c、d處指示替換。
a1)中斷,使sad無效,后續(xù)saf將不許重新執(zhí)行a2,lad與sad別名使用,使sad無效,或者將相反地不會(huì)被插入存儲(chǔ)器隊(duì)列中
b1)中斷,使sad和lad無效
b2)saf與lad別名使用,并且使lad無效
b3)saf使用仍有效的saf或者重新執(zhí)行,
c1)中斷,使lad無效,
c2)如果仍有效,則laf使用lad的數(shù)據(jù),否則重新執(zhí)行。
c3)循環(huán),利用硬件,用ip標(biāo)記和執(zhí)行序列id的組合,并且適當(dāng)?shù)墓芾韖id、lad/sad/laf/saf。
在la/sa和ld/sd的上述描述中,使用la和sa相對(duì)程序順序位置來強(qiáng)制執(zhí)行用于轉(zhuǎn)發(fā)目的的順序。在另一實(shí)施例中,可以使用ld/sd相對(duì)程序順序位置來強(qiáng)制執(zhí)行用于轉(zhuǎn)發(fā)目的的順序(例如,如下所述)。
圖4示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的其中圖示出用于實(shí)現(xiàn)從由加載存儲(chǔ)重新排序和優(yōu)化引發(fā)的推測(cè)性轉(zhuǎn)發(fā)缺失預(yù)測(cè)/錯(cuò)誤中恢復(fù)的規(guī)則的過程400的步驟的流程圖。
如步驟401所示,本發(fā)明的實(shí)施例的目的是在該存儲(chǔ)與該加載之間有地址匹配時(shí)找到向加載進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)。在步驟402處,最近的早先存儲(chǔ)(例如,按機(jī)器順序)向加載進(jìn)行轉(zhuǎn)發(fā)。
在步驟403中,當(dāng)按機(jī)器順序來分配ld/sd時(shí),針對(duì)la/sa更新實(shí)際年齡。為la/sa實(shí)際年齡指派(assign)以與ld/sd年齡相同的值。ld/sd保持實(shí)際年齡并執(zhí)行原始程序順序語(yǔ)義。
步驟404—407示出了用于在支持推測(cè)性執(zhí)行的同時(shí)保持程序連續(xù)語(yǔ)義的規(guī)則。步驟404—407被示為被相互水平地布置以指示同時(shí)地實(shí)現(xiàn)這些規(guī)則功能的機(jī)制。如步驟404中所示,如果存儲(chǔ)具有實(shí)際年齡但加載還沒有獲得實(shí)際年齡,則存儲(chǔ)早于加載。如步驟405中所示,如果加載具有實(shí)際年齡但存儲(chǔ)還沒有獲得實(shí)際年齡,則加載早于存儲(chǔ)。如在步驟406中所示,如果加載或存儲(chǔ)都沒有獲得實(shí)際年齡,則將使用虛擬標(biāo)識(shí)符(vid)來找出哪個(gè)較早(例如,在某些實(shí)施例中,與加載/存儲(chǔ)指令相關(guān)聯(lián)的qid表示vid)。如步驟407中所示,如果加載和存儲(chǔ)兩者都已經(jīng)獲得實(shí)際年齡,則使用實(shí)際年齡來找出哪個(gè)較早。
應(yīng)注意的是用來確定加載與存儲(chǔ)之間的相對(duì)年齡的圖4實(shí)施例所述的算法還可以用來確定多個(gè)存儲(chǔ)之間的相對(duì)年齡。這在如下面在圖4和后續(xù)圖中所述的更新存儲(chǔ)年齡戳?xí)r有用。
圖5示出了圖示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用處理器的加載隊(duì)列和存儲(chǔ)隊(duì)列資源來實(shí)現(xiàn)過程400的規(guī)則的方式的圖。圖5實(shí)施例示出了其中指令回路已解開成兩個(gè)相同指令序列401—402的示例。應(yīng)注意的是sa和la可以自由地重新排序,然而,sd和ld必須保持其相對(duì)程序順序。較早的存儲(chǔ)可以向較晚的加載進(jìn)行轉(zhuǎn)發(fā)。較早意味著較小的vid(例如,保持在虛擬id表中)或較小的年齡。如果sa具有vid但沒有年齡,則sa比具有年齡的加載晚。la/sa的實(shí)際年齡在ld/sd分配時(shí)被更新,并被指派ld/sd的相同年齡。如果存儲(chǔ)或加載具有實(shí)際年齡,則其與實(shí)際年齡相比較,否則使用vid年齡。
應(yīng)注意的是vid表通過經(jīng)由存儲(chǔ)對(duì)應(yīng)于每個(gè)vid唯一標(biāo)識(shí)符的la/sa對(duì)應(yīng)的機(jī)器id和機(jī)器資源來跟蹤la/sa與ld/sd指令之間的關(guān)聯(lián)而運(yùn)行。還應(yīng)注意的是術(shù)語(yǔ)“vid”與術(shù)語(yǔ)“qid”是同義詞,如在圖4和圖5的討論中所描述的。
現(xiàn)在描述圖4實(shí)施例的操作示例。最初,考慮其中分配指針410最初為3的情況。v3la已在加載隊(duì)列條目#4中分派和分配。v1sa和v2sa兩者都已分派。它們與v3la相比較,并且由于v2sa小于v3la且比v1sa更接近于v3la,所以其潛在地向v3la進(jìn)行轉(zhuǎn)發(fā),并且因此其更新用于v3la加載隊(duì)列條目的存儲(chǔ)初始年齡。
分配指針現(xiàn)在移動(dòng)至6。v2sa(#5)的存儲(chǔ)實(shí)際年齡現(xiàn)在更新v3la加載隊(duì)列條目(因?yàn)関2sa是已被加戳成向此加載進(jìn)行轉(zhuǎn)發(fā)的記錄的存儲(chǔ))。v4sa現(xiàn)在分派并與加載初始年齡相比較,并且由于v4大于v3la,所以其并不進(jìn)行轉(zhuǎn)發(fā)。分配指針現(xiàn)在移動(dòng)至11。在分配v3ld時(shí),其用v3ld(#7)的實(shí)際年齡來更新加載隊(duì)列條目#4。現(xiàn)在分派v1sa#11。由于v3la#1現(xiàn)在具有實(shí)際年齡但v1sa#11沒有,則加載早于存儲(chǔ),并且因此轉(zhuǎn)發(fā)是不可能的。
預(yù)測(cè)表用于檢測(cè)其中默認(rèn)假設(shè)不正確的情況。該默認(rèn)假設(shè)是沒有存儲(chǔ)向加載進(jìn)行轉(zhuǎn)發(fā)。一旦針對(duì)加載存儲(chǔ)對(duì)檢測(cè)到轉(zhuǎn)發(fā),則記錄加載存儲(chǔ)對(duì)的程序計(jì)數(shù)器,使得加載將始終等待該存儲(chǔ)地址被分配和被計(jì)算的地址以找出該加載地址是否與該存儲(chǔ)地址匹配且因此需要從其進(jìn)行轉(zhuǎn)發(fā)。
應(yīng)注意的是在一個(gè)實(shí)施例中,本文所述的特征促進(jìn)給定指令序列中的在分支之前或在分支范圍內(nèi)的la/sa的重新排序,其中,允許ld/sd在不存在la/sa的情況下進(jìn)行分派。如果由于分支而跳過la和sa,或者由于已引發(fā)存儲(chǔ)器例外情況而將其忽視,則ld和sd仍可以正確地運(yùn)行,因?yàn)槠浒ǚ峙蓛纱嗡璧男畔ⅲ旱谝淮巫鳛閘a/sa,并且第二次作為ld/sd。在這種情況下,ld/sd的第一分派是執(zhí)行地址計(jì)算(例如,加載地址)。隨后,同一ld/sd可以再次地分派以滿足加載或存儲(chǔ)(例如,加載數(shù)據(jù))的消耗部分??梢詫⒋藱C(jī)制稱為加載和存儲(chǔ)指令的“雙重分派”。
應(yīng)注意的是在一個(gè)實(shí)施例中,ld/sd的雙重分派在對(duì)應(yīng)的經(jīng)去融合的la/sa不存在時(shí)發(fā)生(例如,如經(jīng)融合的ld/sd的情況一樣),或者如果由于分支而跳過la/sa,或者其由于已引發(fā)存儲(chǔ)器例外情況而被忽視等。
上述雙重分派功能確保ld/sd不依賴于被丟失、忽視和/或跳過la/sa而正確地執(zhí)行。由上述特征提供的益處是由加載/存儲(chǔ)指定的數(shù)據(jù)的預(yù)取讀可以通過甚至在存在分支、潛在錯(cuò)誤、例外情況等情況下較早地調(diào)度la/sa而按照程序順序較早地開始(例如,減少時(shí)延)。
圖6示出了圖示出根據(jù)本發(fā)明的另一個(gè)實(shí)施例的用處理器的加載隊(duì)列和存儲(chǔ)隊(duì)列資源來實(shí)現(xiàn)過程400的規(guī)則的方式的另一圖。在圖6實(shí)施例中,考慮其中分配指針最初為3的情況。v3la已在加載隊(duì)列條目#4中分派和分配。分配指針現(xiàn)在移動(dòng)至6。v1和v2(#4,#5)的存儲(chǔ)實(shí)際年齡現(xiàn)在用機(jī)器id2和3來更新對(duì)應(yīng)的sa。v4sa現(xiàn)在分派并與加載初始年齡相比較,并且由于v4sa大于v3la,所以其并不轉(zhuǎn)發(fā)。分配指針現(xiàn)在移動(dòng)至11。在分配v3ld時(shí),其用v3ld(#7)的實(shí)際年齡來更新加載隊(duì)列條目#4?,F(xiàn)在分派id10的v1la。
現(xiàn)在分派機(jī)器id2的v1sa和機(jī)器id3的v2sa兩者。其與id10的v1la相比較,并且由于id10的v1la不具有機(jī)器年齡(其對(duì)應(yīng)的ld尚未分配),所以雖然機(jī)器id2的v1sa和機(jī)器id3的v2sa具有實(shí)際年齡,然后已知v1和v2存儲(chǔ)比v1更早/更舊。然后,這兩個(gè)存儲(chǔ)(v2)中最新的一個(gè)可以向id10的v1進(jìn)行轉(zhuǎn)發(fā)?,F(xiàn)在分派sa(v2)#11。由于v1la和v2sa不具有實(shí)際年齡,但其vid被用于比較,并且未檢測(cè)到轉(zhuǎn)發(fā)。分配指針現(xiàn)在移動(dòng)至16。現(xiàn)在分派id16的v4sa,并且其與id10的v1la相比較,并且由于v1la具有實(shí)際年齡但v4sa不具有,所以v4sa比v1la晚。因此,不可能從此存儲(chǔ)向此較早的加載進(jìn)行轉(zhuǎn)發(fā)。
圖7示出了圖示出根據(jù)本發(fā)明的另一個(gè)個(gè)實(shí)施例的用處理器的加載隊(duì)列和存儲(chǔ)隊(duì)列資源來實(shí)現(xiàn)過程400的規(guī)則的方式的另一圖。在圖7實(shí)施例中,考慮其中分配指針最初為3的情況。在存儲(chǔ)隊(duì)列條目#4和#5中已分派并分配v1sa和v2sa。分配指針現(xiàn)在移動(dòng)至6并分派v4sa。v1sa和v2sa兩者都獲得其4和5的實(shí)際年齡。
分配指針現(xiàn)在移動(dòng)至11。v3la獲得7的實(shí)際年齡。分派v1sa#10v2sa#11。分派v3la且其將其地址與存儲(chǔ)隊(duì)列條目相比較,并且找到跨v1sa、v2sa和v4sa和v2sa#11的匹配。由于v3la的實(shí)際年齡為7,其將其實(shí)際年齡與最接近它的存儲(chǔ)年齡相比較,其為5歲,屬于v2sa,并且因此該加載將從第一存儲(chǔ)進(jìn)行轉(zhuǎn)發(fā),并在加載隊(duì)列中被這樣標(biāo)記。
圖8示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的其中在加載之后分派存儲(chǔ)的分派功能的概述的過程800的流程圖。
過程800在步驟801中開始,其中將存儲(chǔ)指令分離成sa和sd。如先前所述,sa指令隨sd指令保持語(yǔ)義以在在分離的sa與剛剛分配的sd之間不存在vid表中的匹配的情況下允許雙重分派。在步驟802中,將sa重新排序成較早的機(jī)器可見程序順序,并且使用vid表來跟蹤sa以留存原始sd程序順序。在步驟803中,在分派sa時(shí),針對(duì)加載隊(duì)列中的所有加載進(jìn)行檢查針對(duì)sa的地址匹配。
在步驟804中,在有地址匹配時(shí),通過使用加載和sa的vid號(hào)或者使用加載和存儲(chǔ)的實(shí)際年齡而比較匹配加載的程序順序與sa的程序順序。這是在圖3的討論中較早圖示出的過程。如果存儲(chǔ)具有實(shí)際年齡但加載沒有,則存儲(chǔ)早于加載。如果加載具有實(shí)際年齡但存儲(chǔ)沒有,則加載早于存儲(chǔ)。如果加載或存儲(chǔ)任一具有實(shí)際年齡,則可以使用虛擬標(biāo)識(shí)符(vid)來找出哪個(gè)較早。如果加載和存儲(chǔ)兩者都具有實(shí)際年齡,則使用實(shí)際年齡來找出哪個(gè)較早。如上所述,vid號(hào)允許跟蹤原始程序順序及重新排序的sa和la。vid表中的條目允許對(duì)應(yīng)的sd和ld在其被分配時(shí)變得與指派給sa和la的機(jī)器資源相關(guān)聯(lián)。
在步驟805中,針對(duì)按程序順序較晚的加載,存儲(chǔ)將進(jìn)行檢查以查看該加載是否已由其他存儲(chǔ)向其進(jìn)行轉(zhuǎn)發(fā)。在步驟806中,如果是這樣,則存儲(chǔ)檢查先前向此加載進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)的戳以查看該存儲(chǔ)是否按照程序順序比其本身早。在步驟807中,如果是這樣,則存儲(chǔ)檢查先前向此加載進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)的戳以查看該存儲(chǔ)是否按照程序順序比其本身早。在步驟808中,如果不是,則存儲(chǔ)不向此加載進(jìn)行轉(zhuǎn)發(fā)。
圖9示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的其中在存儲(chǔ)之后加載被分派的分派功能的概述的過程900的流程圖。
在步驟901中,以上述方式將加載指令分離成la和ld。在步驟902中,將la重新排序成較早的機(jī)器可見程序順序并使用vid表來跟蹤,如上所述。作為903的替代,針對(duì)存儲(chǔ)隊(duì)列中的所有存儲(chǔ)而檢查la針對(duì)加載的地址匹配。
在904中,在有地址匹配時(shí),通過使用加載和sa的vid號(hào)或者使用加載和存儲(chǔ)的實(shí)際年齡而比較匹配加載的程序順序與存儲(chǔ)的程序順序。這是在圖3的討論中較早圖示出的過程。如果存儲(chǔ)具有實(shí)際年齡但加載沒有,則存儲(chǔ)早于加載。如果加載具有實(shí)際年齡但存儲(chǔ)沒有,則加載早于存儲(chǔ)。如果加載或存儲(chǔ)任一具有實(shí)際年齡,則可以使用虛擬標(biāo)識(shí)符(vid)來找出哪個(gè)較早。如果加載和存儲(chǔ)兩者都具有實(shí)際年齡,則使用實(shí)際年齡來找出哪個(gè)較早。如上所述,vid號(hào)允許跟蹤原始程序順序及重新排序的sa和la。隨后,在步驟905中,使加載消耗來自按程序順序最接近于其自己的程序順序的存儲(chǔ)的數(shù)據(jù)。
圖10示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的統(tǒng)一加載隊(duì)列的圖。虛擬加載/存儲(chǔ)隊(duì)列的目的是允許處理器在機(jī)器中分配比使用其加載/存儲(chǔ)隊(duì)列的實(shí)際物理大小可以容納的更多的加載/存儲(chǔ)。作為回報(bào),這允許處理器超過其處理器的加載/存儲(chǔ)隊(duì)列的物理大小限制分配除加載/存儲(chǔ)之外的其他指令。即使某些加載/存儲(chǔ)在加載/存儲(chǔ)隊(duì)列中仍不具有空間,這些其他指令仍可以被分派和執(zhí)行。
隨著加載從加載隊(duì)列退出,加載分派窗口移動(dòng)至序列中的后續(xù)指令,并且將包括針對(duì)與已經(jīng)從加載隊(duì)列退出的加載數(shù)目等同的分派要考慮的更多已分配加載。在此圖中,加載分派窗口將從左向右移動(dòng)。
在一個(gè)實(shí)施例中,加載分派窗口將始終包括與加載隊(duì)列中的條目的數(shù)目相等的加載數(shù)目。在任何時(shí)間不能在加載分派窗口之外分派加載。除加載之外的調(diào)度器窗口中的其他指令(例如,sub、add等)可以分派。加載分派窗口內(nèi)的所有加載可以每當(dāng)其準(zhǔn)備就緒時(shí)分派。
圖11示出了根據(jù)本發(fā)明的實(shí)施例的示出滑動(dòng)加載分派窗口的統(tǒng)一加載隊(duì)列。圖11示出了與圖10相比較的后續(xù)時(shí)刻。隨著加載退出加載隊(duì)列,加載分派窗口移動(dòng)至序列中的后續(xù)指令,并且將包括針對(duì)與已經(jīng)從加載隊(duì)列退出的加載數(shù)目等同的分派要考慮的更多已分配加載。加載分派窗口將始終包括與加載隊(duì)列中的條目數(shù)目相等的加載數(shù)目。在任何時(shí)間不能在加載分派窗口之外分派加載。除加載之外的調(diào)度器窗口中的其他指令(例如,sub、add等)可以分派。加載分派窗口內(nèi)的所有加載可以每當(dāng)其準(zhǔn)備就緒時(shí)分派。因此,用此方案獲得的一個(gè)益處是如果超過加載或存儲(chǔ)隊(duì)列容量,到調(diào)度器的分配不停止,替代地,盡管已超過加載或存儲(chǔ)隊(duì)列容量,我們繼續(xù)在調(diào)度器內(nèi)部分配指令,包括加載和存儲(chǔ),加載和存儲(chǔ)動(dòng)態(tài)窗口將確保將不會(huì)分派在加載或存儲(chǔ)隊(duì)列的容量之外的加載或存儲(chǔ)。
圖12示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的分布式加載隊(duì)列。圖12實(shí)施例的目的是實(shí)現(xiàn)分布式加載隊(duì)列和分布式存儲(chǔ)隊(duì)列,其保持單個(gè)程序/線程連續(xù)語(yǔ)義,但仍允許跨多個(gè)核心/存儲(chǔ)器片段進(jìn)行加載和存儲(chǔ)的亂序分派。
圖12圖示出了避免死鎖的加載隊(duì)列擴(kuò)展解決方案。創(chuàng)建加載/存儲(chǔ)隊(duì)列的擴(kuò)展并從引發(fā)死鎖的加載/存儲(chǔ)點(diǎn)(從該點(diǎn)向前)按程序順序向該擴(kuò)展隊(duì)列分配死鎖加載/存儲(chǔ)直至加載/存儲(chǔ)隊(duì)列具有可用的自由的條目。在圖12情形中,ld3加載取決于sd,sd又取決于由于load_qb已滿而不能被分派的ld2(具有映射到load_qb的地址)。在此死鎖情形中,在檢測(cè)到死鎖時(shí),允許ld1和ld2按序一個(gè)接一個(gè)地向預(yù)留部分b中分派和退出。用于分布式加載/存儲(chǔ)隊(duì)列的保守策略是為每個(gè)加載/存儲(chǔ)預(yù)留每個(gè)加載/存儲(chǔ)分布式隊(duì)列中的條目。在此圖中,每個(gè)分配的加載需要預(yù)留load_qa中的條目和load_qb中的另一條目。
應(yīng)注意的是在分布式加載/存儲(chǔ)隊(duì)列中,存在關(guān)于已分配加載/存儲(chǔ)的問題,因?yàn)槠涞刂吩诜峙鋾r(shí)是未知的。因此,在亂序分派時(shí)僅知道給定加載或存儲(chǔ)將占用哪個(gè)分布式隊(duì)列。
本發(fā)明的實(shí)施例可以采用用于分布式加載/存儲(chǔ)隊(duì)列的三個(gè)不同解決方案來避免關(guān)于亂序分派的死鎖。
1.在死鎖(不具有分派給加載/存儲(chǔ)緩沖器的空間)的最早加載/存儲(chǔ)處引發(fā)缺失預(yù)測(cè)和清刷并開始按序分派加載/存儲(chǔ)達(dá)一段時(shí)間,或者通過其中每個(gè)加載/存儲(chǔ)在所有分布式隊(duì)列中分配空間的保守分配。一旦(在分派時(shí))知道該加載/存儲(chǔ)的地址,因此知道將接收該加載/存儲(chǔ)的特定加載隊(duì)列,其可以將其他隊(duì)列中的預(yù)留空間解除分配。
2.創(chuàng)建加載/存儲(chǔ)隊(duì)列的擴(kuò)展并用來從引發(fā)死鎖的加載/存儲(chǔ)點(diǎn)按程序順序向該擴(kuò)展隊(duì)列分配死鎖加載/存儲(chǔ)(圖9)。
3.動(dòng)態(tài)分派窗口大小確定,其中,在連續(xù)性窗口之外的未分派加載的和應(yīng)小于或等于該特定加載隊(duì)列中的自由非預(yù)留空間的數(shù)目(例如,圖11)。
圖13示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的具有按序連續(xù)性窗口的分布式加載隊(duì)列。確定動(dòng)態(tài)分派窗口大小確定,使得在連續(xù)性窗口之外的未分派加載的和應(yīng)小于或等于該特定加載隊(duì)列中的自由非預(yù)留空間的數(shù)目。每個(gè)加載隊(duì)列將使用如這里所示的其相應(yīng)分派窗口來跟蹤其條目。在任何時(shí)間用于每個(gè)加載隊(duì)列的動(dòng)態(tài)窗口大小=該隊(duì)列的實(shí)際物理大小加虛擬條目(在這種情況下6+4=10),因此在這種情況下,窗口大小應(yīng)僅覆蓋10個(gè)負(fù)載。請(qǐng)注意,不對(duì)用于其他隊(duì)列的負(fù)載進(jìn)行計(jì)數(shù)(例如,ld4)。
預(yù)留的預(yù)訂比是3。該預(yù)訂比是競(jìng)爭(zhēng)每個(gè)預(yù)留空間的按序加載的數(shù)目。在本示例中,只有前兩個(gè)按序未分派加載(從左向右掃描按序連續(xù)性窗口)可以向預(yù)留分配進(jìn)行分派(假設(shè)隊(duì)列的2個(gè)條目被分配給預(yù)留)。因此,虛擬條目的數(shù)目=(預(yù)訂比-1)*預(yù)留條目的數(shù)目=(3-1)*2=4。
關(guān)于按序連續(xù)性窗口大小確定,未被分派給加載隊(duì)列中的條目(被捕捉空間)的在任何時(shí)間的加載數(shù)目(從最舊的至最新的進(jìn)行計(jì)數(shù))加到預(yù)留空間的分派加載的數(shù)目必須小于或等于(預(yù)訂比*預(yù)留條目的數(shù)目)。在這種情況下,加載的數(shù)目必須小于或等于3。該預(yù)訂比是設(shè)計(jì)可配置性能度量,其確定預(yù)留空間的已接受(占用vs預(yù)訂)比是什么。這在最早的未分派加載不能找到要分派到預(yù)留條目外面的隊(duì)列空間的情況中實(shí)行。在這種情況下,從最早(最舊)加載開始的那些加載將競(jìng)爭(zhēng)預(yù)留空間,預(yù)訂比確定多少加載將等待占用每個(gè)預(yù)留條目,預(yù)留條目始終被首先分配給最舊的未分派加載,并且一旦該加載退出,則下一個(gè)最舊加載可以占用條目(預(yù)訂比確定從所分派的最舊的一個(gè)開始一個(gè)接一個(gè)地占用預(yù)留條目的那些加載的數(shù)目)。
應(yīng)注意的是在一個(gè)實(shí)施例中,來自每個(gè)隊(duì)列的按序連續(xù)性窗口的加載可以在該隊(duì)列的未預(yù)留部分中未留下空間(按序從最舊加載開始)時(shí)向該隊(duì)列的預(yù)留空間進(jìn)行分派。還應(yīng)注意的是在一個(gè)實(shí)施例中,在任一隊(duì)列的按序連續(xù)性窗口外面和在該隊(duì)列的動(dòng)態(tài)分派窗口內(nèi)的加載不能向該隊(duì)列的預(yù)留部分進(jìn)行分派。
還應(yīng)注意的是只要在隊(duì)列的未預(yù)留部分中存在空間,該隊(duì)列的整個(gè)動(dòng)態(tài)分派窗口內(nèi)的任何加載就可以向任何分布式隊(duì)列的未預(yù)留部分的任何條目進(jìn)行亂序分派。每個(gè)循環(huán)調(diào)整任一隊(duì)列的按序連續(xù)性窗口和動(dòng)態(tài)分派窗口兩者的大小以反映每個(gè)加載分派或退出之后的在上文提供的等式中所述的其大小限制。
圖14示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于多核處理器的分段存儲(chǔ)器子系統(tǒng)的圖。圖13示出了線程之間和/或一般地加載和存儲(chǔ)之間的同步方案的全面方案和實(shí)現(xiàn)。該方案描述跨加載/存儲(chǔ)架構(gòu)和/或跨存儲(chǔ)器引用和/或線程的存儲(chǔ)器訪問的存儲(chǔ)器引用的同步和消歧的優(yōu)選方法。在圖15中,示出了寄存器堆(地址和或數(shù)據(jù)寄存器)的多個(gè)分段以及執(zhí)行單元、地址計(jì)算單元和1層高速緩存和/或加載存儲(chǔ)緩沖器的片段和/或2層高速緩存和地址寄存器互連1200和地址計(jì)算單元互連1201。那些分段元素可以通過將其集中式資源分段并分布到多個(gè)引擎中而在一個(gè)核心/處理器內(nèi)構(gòu)造,或者其可由采取多核心/多處理器配置的不同核心/處理器的元件構(gòu)成。那些片段1211中的一個(gè)在圖中被示為片段1號(hào);可以將片段按比例縮放至大的數(shù)目(一般地至n個(gè)片段,如圖中所示)。
這種機(jī)制還充當(dāng)用于那些引擎/核心/處理器之間的存儲(chǔ)器架構(gòu)的相干性方案。此方案通過來自一個(gè)片段/核心/處理器中的地址計(jì)算單元中的一個(gè)的地址請(qǐng)求開始。例如,假設(shè)由片段1(例如,1211)請(qǐng)求地址。其可以使用屬于其自己的片段的地址寄存器和或使用地址互連總線1200根據(jù)跨其他片段的寄存器來獲得并計(jì)算其地址。在計(jì)算該地址之后,其創(chuàng)建用來訪問高速緩存和存儲(chǔ)器的32位地址或64位地址的引用地址。此地址通常被分段成標(biāo)簽字段及設(shè)定和線路字段。此特定片段/引擎/核心將把地址存儲(chǔ)到其加載存儲(chǔ)緩沖器和/或l1和/或l2地址陣列1202中,同時(shí)其將通過使用壓縮技術(shù)來創(chuàng)建標(biāo)簽的壓縮版本(具有比地址的原始標(biāo)簽字段更小的位數(shù))。
此外,不同的片段/引擎/核心/處理器將使用設(shè)定字段或設(shè)定字段的子集作為索引來識(shí)別地址被保持在哪個(gè)片段/核心/處理器中。由地址設(shè)定字段位進(jìn)行的此片段編索引確保不包括特定片段/核心/引擎中的地址的所有權(quán),即使對(duì)應(yīng)于該地址的存儲(chǔ)器數(shù)據(jù)可以存在于另一或多個(gè)其他片段/引擎/核心/處理器中。即使在每個(gè)片段中將地址cam/標(biāo)簽陣列1202/1026示為與數(shù)據(jù)陣列1207耦合,其也可能僅在放置和布局的物理接近區(qū)域中被耦合,或者甚至由于兩者都屬于特定引擎/核心/處理器但在保持在地址陣列的地址與一個(gè)片段內(nèi)部的數(shù)據(jù)陣列中的數(shù)據(jù)之間不存在關(guān)系的事實(shí)。
圖15示出了如何由本發(fā)明的實(shí)施例來處理加載和存儲(chǔ)的圖。如圖15中所描繪的,每個(gè)片段與其加載存儲(chǔ)緩沖器和存儲(chǔ)退出緩沖器相關(guān)聯(lián)。針對(duì)任何給定片段,指定與該片段或另一片段相關(guān)聯(lián)的地址范圍的加載和存儲(chǔ)被發(fā)送到該片段的加載存儲(chǔ)緩沖器以用于處理。應(yīng)注意的是其可隨著核心亂序執(zhí)行指令而亂序到達(dá)。在每個(gè)核心內(nèi),核心不僅可訪問其自己的寄存器堆,而且可訪問其他核心的寄存器堆中的每一個(gè)。
本發(fā)明的實(shí)施例實(shí)現(xiàn)分布式加載存儲(chǔ)排序系統(tǒng)。該系統(tǒng)跨多個(gè)片段分布。在片段內(nèi),由該片段來執(zhí)行本地?cái)?shù)據(jù)相關(guān)性檢查。這是因?yàn)樵撈蝺H在該特定片段的存儲(chǔ)退出緩沖器內(nèi)加載和存儲(chǔ)。這限制了必須注意其他片段以保持?jǐn)?shù)據(jù)相干性的需要。以這種方式,本地地執(zhí)行片段內(nèi)的數(shù)據(jù)相關(guān)性。
關(guān)于數(shù)據(jù)一致性,存儲(chǔ)分派門根據(jù)嚴(yán)格的按程序順序存儲(chǔ)器一致性規(guī)則來強(qiáng)制執(zhí)行存儲(chǔ)退出。存儲(chǔ)亂序到達(dá)加載存儲(chǔ)緩沖器處。加載也亂序到達(dá)加載存儲(chǔ)緩沖器處。同時(shí),亂序加載和存儲(chǔ)被轉(zhuǎn)發(fā)到存儲(chǔ)退出緩沖器以用于處理。應(yīng)注意的是雖然存儲(chǔ)在給定片段內(nèi)按序退出,但隨著其轉(zhuǎn)到存儲(chǔ)分派門,其可以亂序從多個(gè)片段出來。存儲(chǔ)分派門強(qiáng)制執(zhí)行這樣的策略,即確保即使存儲(chǔ)可亂序跨存儲(chǔ)退出緩沖器而駐留,并且即使緩沖器可相對(duì)于其他緩沖器的存儲(chǔ)亂序?qū)⒋鎯?chǔ)轉(zhuǎn)發(fā)到存儲(chǔ)分派門,分派門也確保其被嚴(yán)格地按序轉(zhuǎn)發(fā)到片段存儲(chǔ)器。這是因?yàn)榇鎯?chǔ)分派門具有存儲(chǔ)退出的全局視圖,并且僅允許存儲(chǔ)跨所有片段、例如全局地按序離開至存儲(chǔ)器的全局可見側(cè)。以這種方式,存儲(chǔ)分派門充當(dāng)全局觀察者以確保存儲(chǔ)最終跨所有片段按序返回到存儲(chǔ)器。
圖16示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的存儲(chǔ)過濾算法的圖。圖16實(shí)施例的目的是過濾存儲(chǔ)以防止所有存儲(chǔ)必須針對(duì)加載隊(duì)列中的所有條目進(jìn)行檢查。
存儲(chǔ)針對(duì)地址匹配而嗅探高速緩存以保持相干性。如果線程/核心x加載從高速緩存線進(jìn)行讀取,則其標(biāo)記其從那里加載數(shù)據(jù)的高速緩存線的部分。在另一線程/核心y存儲(chǔ)嗅探高速緩存時(shí),如果任何此類存儲(chǔ)與該高速緩存線部分重疊,則針對(duì)線程/核心x的該加載引發(fā)缺失預(yù)測(cè)。
用于過濾這些嗅探的一個(gè)解決方案是跟蹤加載隊(duì)列條目的引用。在這種情況下,存儲(chǔ)不需要嗅探加載隊(duì)列。如果存儲(chǔ)具有與訪問掩碼的匹配,則從引用跟蹤符獲得的加載隊(duì)列條目將引發(fā)該加載條目進(jìn)行缺失預(yù)測(cè)。
在另一解決方案(其中不存在引用跟蹤符)中,如果存儲(chǔ)與訪問掩碼具有匹配,則該存儲(chǔ)地址將嗅探加載隊(duì)列條目并將引發(fā)匹配的加載條目進(jìn)行缺失預(yù)測(cè)。
用兩個(gè)解決方案,一旦加載從高速緩存線進(jìn)行讀取,其設(shè)定相應(yīng)的訪問掩碼位。當(dāng)該加載退出時(shí),其將該位重置。
圖17示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的具有組成從存儲(chǔ)器按序進(jìn)行讀取的存儲(chǔ)器一致性模型中的亂序加載的信號(hào)量實(shí)現(xiàn)方式。本文所使用的術(shù)語(yǔ)信號(hào)量指的是為多個(gè)線程/核心提供對(duì)公共資源的訪問控制的數(shù)據(jù)構(gòu)造。
在圖17的實(shí)施例中,使用訪問掩碼來控制由多個(gè)線程/核心對(duì)存儲(chǔ)器資源的訪問。訪問掩碼通過跟蹤高速緩存線的哪些字具有待決加載而運(yùn)行。亂序加載在訪問高速緩存線的字時(shí)設(shè)定掩碼位,并在該加載退出時(shí)清除掩碼位。如果來自另一線程/核心的存儲(chǔ)在設(shè)定掩碼位的同時(shí)向該字進(jìn)行寫入,則其將用信號(hào)通知對(duì)應(yīng)于該加載的加載隊(duì)列條目(例如,經(jīng)由跟蹤符)以被缺失預(yù)測(cè)/清刷或用其從屬指令重試。訪問掩碼還跟蹤線程/核心。
以這種方式,訪問掩碼確保正確地實(shí)現(xiàn)存儲(chǔ)器一致性規(guī)則。存儲(chǔ)器一致性規(guī)則規(guī)定對(duì)于此信號(hào)量而言存儲(chǔ)按序更新存儲(chǔ)器且加載按序從存儲(chǔ)器讀取以跨兩個(gè)核心/線程工作。因此,由核心1和核心2執(zhí)行的代碼將被正確地執(zhí)行,其中,其兩者都訪問存儲(chǔ)器位置“標(biāo)志”和“數(shù)據(jù)”。
圖18示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的通過使用基于鎖的模型和基于事務(wù)的模型兩者而組成針對(duì)存儲(chǔ)器進(jìn)行按序讀取的加載的到存儲(chǔ)器一致性模型中的亂序加載。
如上所述,存儲(chǔ)器一致性規(guī)則規(guī)定存儲(chǔ)按序更新存儲(chǔ)器且加載按序引用存儲(chǔ)器以便兩個(gè)核心/線程適當(dāng)?shù)剡M(jìn)行通信。在圖18中的右側(cè)底部,示出了兩個(gè)核心,核心1和核心2。使用兩個(gè)存儲(chǔ)器資源,標(biāo)志和數(shù)據(jù),實(shí)現(xiàn)通信并正確地在核心1與核心2之間共享數(shù)據(jù)。例如,當(dāng)核心1想要將數(shù)據(jù)傳遞至核心2時(shí),如核心1內(nèi)的代碼所指示的,其將存儲(chǔ)數(shù)據(jù)且然后設(shè)定標(biāo)志。如核心2內(nèi)的代碼所指示的,核心2將加載標(biāo)志并檢查標(biāo)志是否等于1。如果標(biāo)志不等于1,則核心2將向后轉(zhuǎn)移并保持檢查標(biāo)志直至其確實(shí)等于1。在該時(shí)間點(diǎn)處,其將加載數(shù)據(jù)。
用其中加載和存儲(chǔ)亂序執(zhí)行的亂序架構(gòu),可以使用基于鎖的存儲(chǔ)器一致性模型來確保兩個(gè)實(shí)體(例如,核心1和核心2)保持按序存儲(chǔ)器一致性語(yǔ)義。這通過使用訪問掩碼、線程id寄存器以及跟蹤符寄存器而示出。通過在代碼的關(guān)鍵段內(nèi)設(shè)置任何加載的對(duì)應(yīng)訪問掩碼位來設(shè)定該鎖。如果發(fā)生從另一線程/核心到該高速緩存線字的任何訪問,則鎖將阻止該訪問。在一個(gè)實(shí)施例中,這可以通過將訪問示為缺失來實(shí)現(xiàn)。當(dāng)該鎖被清除時(shí),允許對(duì)該字的訪問。
替換地,可以使用基于事務(wù)的方法來保持按序存儲(chǔ)器一致性語(yǔ)義。用基于事務(wù)的方法,通過設(shè)置事務(wù)內(nèi)的任何加載的對(duì)應(yīng)訪問掩碼位來設(shè)定原子數(shù)。如果在設(shè)定掩碼位的同時(shí)發(fā)生從另一線程/核心或并行事務(wù)到該高速緩存線的任何訪問,則其將用信號(hào)通知對(duì)應(yīng)于該加載的加載隊(duì)列條目(例如,經(jīng)由跟蹤符)以被缺失預(yù)測(cè)/清刷或用其從屬指令重試。訪問掩碼還跟蹤線程/核心。當(dāng)該事務(wù)結(jié)束時(shí),掩碼位將被清除。使用線程id寄存器來跟蹤哪個(gè)線程正在訪問統(tǒng)一存儲(chǔ)隊(duì)列條目的哪個(gè)字。
圖19示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的多核分段存儲(chǔ)器子系統(tǒng)的多個(gè)核心。本實(shí)施例示出了將如何防止來自多核分段存儲(chǔ)器子系統(tǒng)內(nèi)的加載訪問被標(biāo)記為進(jìn)行中的事務(wù)的一部分(例如,看類似于鎖定情況)的字。
應(yīng)注意的是如果此多核分段子系統(tǒng)是較大集群的一部分,則存在具有共享存儲(chǔ)器子系統(tǒng)的外部處理器/核心/集群。在這種情況下,屬于其他外部處理器/核心/集群的加載將繼續(xù)進(jìn)行且將不會(huì)被防止從任何存儲(chǔ)器位置進(jìn)行加載,無論該存儲(chǔ)器位置是否是事務(wù)訪問的一部分。然而,所有加載將對(duì)訪問掩碼進(jìn)行標(biāo)記以通知作為事務(wù)的一部分的未來存儲(chǔ)。
來自其他處理器的嗅探存儲(chǔ)將其地址與掩碼相比較。如果存儲(chǔ)見到其正在嘗試存儲(chǔ)的地址在來自另一線程加載(作為事務(wù)的一部分的加載)的訪問掩碼中被標(biāo)記,則存儲(chǔ)將引發(fā)該加載被缺失預(yù)測(cè)。否則,將在該加載退出時(shí)清除該標(biāo)記(例如,由此完成事務(wù))。
圖20示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的訪問統(tǒng)一存儲(chǔ)隊(duì)列的異步核心的圖,其中存儲(chǔ)可以基于存儲(chǔ)資歷而將數(shù)據(jù)轉(zhuǎn)發(fā)到任一線程中的加載。
如上所述,存儲(chǔ)器一致性規(guī)則規(guī)定存儲(chǔ)按序更新存儲(chǔ)器且加載按序從存儲(chǔ)器進(jìn)行讀取,使得核心/線程適當(dāng)?shù)剡M(jìn)行通信。在圖20中的右側(cè)底部,示出了兩個(gè)核心,核心1和核心2。兩個(gè)核心是異步的,并執(zhí)行在每個(gè)核心內(nèi)所指示的代碼以訪問標(biāo)志和數(shù)據(jù)存儲(chǔ)器資源。
在圖20的實(shí)施例中,統(tǒng)一存儲(chǔ)隊(duì)列對(duì)于可以訪問它的多個(gè)線程中的任何線程而言是不可知的。在本實(shí)現(xiàn)方式中,來自不同線程的存儲(chǔ)可以向不同線程的加載進(jìn)行轉(zhuǎn)發(fā),而同時(shí)通過遵循一組算法規(guī)則而仍保持按序存儲(chǔ)器一致性語(yǔ)義。線程可以基于存儲(chǔ)資歷而從彼此進(jìn)行轉(zhuǎn)發(fā)。
當(dāng)在同一線程中的在一存儲(chǔ)的前面的所有加載和存儲(chǔ)都已被執(zhí)行時(shí),該存儲(chǔ)是資深的。從另一線程接收到轉(zhuǎn)發(fā)的線程不能獨(dú)立地退出加載/存儲(chǔ)。線程必須在它們從其接收到轉(zhuǎn)發(fā)的其他線程已進(jìn)行缺失預(yù)測(cè)的情況下有條件地進(jìn)行缺失預(yù)測(cè)。特定加載可以從同一線程轉(zhuǎn)發(fā)存儲(chǔ)或從不同的線程資深存儲(chǔ)進(jìn)行轉(zhuǎn)發(fā),如果在同一線程內(nèi)不存在向其進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)的話。
用圖20方法,通過設(shè)置對(duì)統(tǒng)一存儲(chǔ)隊(duì)列條目中的字內(nèi)的字節(jié)的任何訪問的對(duì)應(yīng)訪問掩碼位來設(shè)定原子數(shù)。如果在設(shè)定掩碼位的同時(shí)發(fā)生從另一線程/核心或并行事務(wù)到該存儲(chǔ)隊(duì)列條目的任何訪問,則其將用信號(hào)通知對(duì)應(yīng)于該加載的加載隊(duì)列條目(例如,經(jīng)由跟蹤符)以被缺失預(yù)測(cè)/清刷或用其從屬指令重試。訪問掩碼還跟蹤線程/核心。當(dāng)該事務(wù)結(jié)束時(shí),掩碼位將被清除。
圖21示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的描繪其中存儲(chǔ)具有資歷的功能的圖。如圖21中所描繪的,特定加載將從同一線程轉(zhuǎn)發(fā)存儲(chǔ)進(jìn)行轉(zhuǎn)發(fā)。如果不存在來自線程內(nèi)的傳送,則其可以從不同的線程資深存儲(chǔ)進(jìn)行轉(zhuǎn)發(fā)。此原理在其中多個(gè)核心/線程正在訪問共享存儲(chǔ)器的情況下起作用。在這種情況下,存儲(chǔ)可以基于存儲(chǔ)資歷從任一線程向來自任一線程的加載進(jìn)行轉(zhuǎn)發(fā),然而,只有當(dāng)不存在從線程內(nèi)向特定加載的轉(zhuǎn)發(fā)時(shí)。當(dāng)在同一線程中的在一存儲(chǔ)前面的所有加載和存儲(chǔ)都已被執(zhí)行時(shí),該存儲(chǔ)是資深的。
另外,應(yīng)注意的是線程不能獨(dú)立地退出加載/存儲(chǔ)。線程在它從其接收到轉(zhuǎn)發(fā)的另一線程進(jìn)行存儲(chǔ)缺失預(yù)測(cè)或清刷時(shí)必須進(jìn)行加載缺失預(yù)測(cè)。
圖21直觀地描述了兩個(gè)異步核心/線程(例如,核心/線程1和核心/線程2)之間的執(zhí)行的示例性流。線2101—2105示出了存儲(chǔ)基于其資歷而向不同的加載進(jìn)行轉(zhuǎn)發(fā)的方式。為了幫助舉例說明資歷如何從存儲(chǔ)向存儲(chǔ)進(jìn)展,緊挨著每個(gè)指令示出了數(shù)字以示出隨著其從0進(jìn)展至14的執(zhí)行的不同階段。特別地,根據(jù)上述規(guī)則,應(yīng)注意線2103所指示的存儲(chǔ)向同一線程內(nèi)的加載進(jìn)行轉(zhuǎn)發(fā)的方式。因此,如上所述,從其自己的線程內(nèi)進(jìn)行轉(zhuǎn)發(fā)的加載不能從任何相鄰線程進(jìn)行轉(zhuǎn)發(fā)。這用跨轉(zhuǎn)發(fā)線的黑色十字形示出。
圖22示出了非推測(cè)性的根據(jù)本發(fā)明的一個(gè)實(shí)施例的未消歧亂序加載存儲(chǔ)隊(duì)列退出實(shí)現(xiàn)方式(例如,提供低功率、低裸片面積以及較低的定時(shí)緊迫性)。
加載退出/重新排序緩沖器(srb)可以以兩個(gè)實(shí)現(xiàn)方式、退出實(shí)現(xiàn)方式和重新排序?qū)崿F(xiàn)方式進(jìn)行操作。
在退出實(shí)現(xiàn)方式中,在存儲(chǔ)退出時(shí)按照原始程序順序從存儲(chǔ)隊(duì)列將存儲(chǔ)加載到srb中,使得按照原始程序順序較早的存儲(chǔ)在srb的頂部處。后續(xù)加載然后尋找地址匹配(例如,使用地址cam),并從srb/存儲(chǔ)高速緩存中的匹配條目進(jìn)行轉(zhuǎn)發(fā)。在其中存在兩個(gè)或更多地址匹配的情況下,優(yōu)先級(jí)編碼器可以通過掃描第一個(gè)來定位正確的轉(zhuǎn)發(fā)條目。這節(jié)省了到存儲(chǔ)器的轉(zhuǎn)移并允許機(jī)器向前繼續(xù)進(jìn)行。如果分派了加載且向其進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)已退出到srb/存儲(chǔ)高速緩存,則該加載從srb/存儲(chǔ)高速緩存進(jìn)行轉(zhuǎn)發(fā)并將配對(duì)關(guān)系記錄在預(yù)測(cè)表中。為了檢測(cè)其中在向加載進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)退出到srb/存儲(chǔ)高速緩存之前分派加載的情況,加載必須創(chuàng)建地址掩碼,其在那里標(biāo)記其自己的地址。這可以以不同的方式來實(shí)現(xiàn)(例如,圖17的實(shí)施例)。
如上文所討論的,圖17描述訪問掩碼,其通過跟蹤高速緩存線的哪些字具有待決加載而運(yùn)行。亂序加載在訪問高速緩存線的字時(shí)設(shè)定掩碼,并在該加載退出時(shí)清除掩碼位。如果來自同一線程/核心的存儲(chǔ)在其退出時(shí)檢測(cè)到其在掩碼位被設(shè)置的同時(shí)向該字進(jìn)行寫入,則其將用信號(hào)通知對(duì)應(yīng)于該加載的加載隊(duì)列條目(經(jīng)由跟蹤符)以被缺失預(yù)測(cè)/清刷或用其從屬指令重試。訪問掩碼還跟蹤線程/核心。
圖22是非消歧加載存儲(chǔ)隊(duì)列,因?yàn)槠洳话ㄓ靡詫y序加載和存儲(chǔ)消歧的對(duì)應(yīng)硬件的事實(shí)。加載和存儲(chǔ)根據(jù)機(jī)器資源允許而亂序分派。傳統(tǒng)上,在加載隊(duì)列和存儲(chǔ)隊(duì)列兩者中使用地址匹配和對(duì)應(yīng)的消歧硬件以確保正確的存儲(chǔ)隊(duì)列條目被轉(zhuǎn)發(fā)到請(qǐng)求加載隊(duì)列條目,如上所述(例如,圖5和圖6)。加載隊(duì)列和存儲(chǔ)隊(duì)列的內(nèi)容對(duì)外面的核心/線程不可見。
在圖22中,分派的加載和存儲(chǔ)地址并未相對(duì)于存儲(chǔ)隊(duì)列或加載隊(duì)列中的條目而被消歧。加載/存儲(chǔ)隊(duì)里現(xiàn)在是具有減小的裸片面積、功率消耗以及定時(shí)要求的改進(jìn)的緩沖器實(shí)現(xiàn)方式。srb將執(zhí)行消歧功能。在srb中檢測(cè)到第一匹配時(shí),使用那些匹配來填充存儲(chǔ)至加載轉(zhuǎn)發(fā)預(yù)測(cè)表中的條目以隨著指令序列的執(zhí)行向前進(jìn)行而強(qiáng)制執(zhí)行轉(zhuǎn)發(fā)。
在加載被分派時(shí),其檢查預(yù)測(cè)表以查看其是否與對(duì)應(yīng)的存儲(chǔ)配對(duì)。如果加載被配對(duì)且該特定存儲(chǔ)已被分派,則加載將從在預(yù)測(cè)表中記錄的該存儲(chǔ)隊(duì)列條目號(hào)進(jìn)行轉(zhuǎn)發(fā)。如果該存儲(chǔ)尚未被分派,則加載將其加載隊(duì)列條目號(hào)寄存在預(yù)測(cè)表中并將在加載隊(duì)列中標(biāo)記其本身以等待存儲(chǔ)數(shù)據(jù)被轉(zhuǎn)發(fā)。當(dāng)稍后分派存儲(chǔ)時(shí),其檢查預(yù)測(cè)表以獲得加載隊(duì)列條目號(hào)并向該加載進(jìn)行轉(zhuǎn)發(fā)。
一旦針對(duì)加載存儲(chǔ)對(duì)檢測(cè)到轉(zhuǎn)發(fā),則記錄加載存儲(chǔ)對(duì)的pc和地址,使得地址匹配被驗(yàn)證。如果地址匹配,則加載將不會(huì)分派直至存儲(chǔ)數(shù)據(jù)被分派,并且該加載將被標(biāo)記為從其進(jìn)行轉(zhuǎn)發(fā)。使用預(yù)測(cè)閾值來設(shè)置加載存儲(chǔ)對(duì)之間的轉(zhuǎn)發(fā)關(guān)系中的置信度水平。
圖23示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的未消歧亂序加載存儲(chǔ)隊(duì)列重新排序?qū)崿F(xiàn)方式的重新排序?qū)崿F(xiàn)方式。圖23還提供非推測(cè)性的低功率、低裸片面積以及較低的定時(shí)緊迫性。
加載退出/重新排序緩沖器(srb)可以以兩個(gè)實(shí)現(xiàn)方式、退出實(shí)現(xiàn)方式和重新排序?qū)崿F(xiàn)方式進(jìn)行操作。
在圖23的重新排序?qū)崿F(xiàn)方式中,從存儲(chǔ)隊(duì)列將存儲(chǔ)地址亂序加載到srb中(例如,根據(jù)資源允許)。在分配每個(gè)存儲(chǔ)時(shí),其接收序列號(hào)。srb然后通過根據(jù)它們的序列號(hào)將存儲(chǔ)重新排序而運(yùn)行,使得它們按照原始程序順序而駐留于srb中。按照程序順序較早的存儲(chǔ)在srb的頂部處。后續(xù)加載然后尋找地址匹配和分配年齡(在加載和存儲(chǔ)的分配時(shí)間給定的程序順序序列號(hào))。隨著加載被分派,其查看srb,如果其見到尚未分派(尚無地址計(jì)算)的較早存儲(chǔ)(與其自己的序列號(hào)相比),則可以實(shí)現(xiàn)兩個(gè)解決方案中的一個(gè)。
1.加載不分派,其在其將其本身分派之前等到所有較早存儲(chǔ)都已分派。
2.加載分派并在高速緩存的訪問掩碼中標(biāo)記其地址(如圖17中所示)。后續(xù)存儲(chǔ)檢查訪問掩碼并遵循相同的方法,如圖17中所描述的。
應(yīng)注意的是優(yōu)先級(jí)編碼器如上所述地運(yùn)行以定位正確的轉(zhuǎn)發(fā)條目。
圖24示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的指令序列(例如,蹤跡)重新排序的推測(cè)性執(zhí)行實(shí)現(xiàn)方式。在推測(cè)性模式下,存儲(chǔ)在存儲(chǔ)退出時(shí)按照原始程序順序從存儲(chǔ)隊(duì)列移動(dòng)至srb中,使得按照原始程序順序較早的存儲(chǔ)在srb的頂部處。后續(xù)加載然后尋找地址匹配(例如,使用地址cam),并從srb/存儲(chǔ)高速緩存中的匹配條目進(jìn)行轉(zhuǎn)發(fā)。在其中存在兩個(gè)或更多地址匹配的情況下,優(yōu)先級(jí)編碼器可以通過掃描第一個(gè)來定位正確的轉(zhuǎn)發(fā)條目。這允許機(jī)器向前繼續(xù)進(jìn)行。如果分派了加載(其第一次檢查srb))且向其進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)退出到srb/存儲(chǔ)高速緩存,則該加載從srb/存儲(chǔ)高速緩存進(jìn)行轉(zhuǎn)發(fā)并將其配對(duì)關(guān)系記錄在預(yù)測(cè)表中。為了檢測(cè)其中在向加載進(jìn)行轉(zhuǎn)發(fā)的存儲(chǔ)退出到srb/存儲(chǔ)高速緩存之前分派加載的情況,退出時(shí)的加載將再一次檢查存儲(chǔ)隊(duì)列。如果加載發(fā)現(xiàn)轉(zhuǎn)發(fā)存儲(chǔ)匹配,則其將用信號(hào)通知對(duì)應(yīng)于該加載的加載隊(duì)列條目以使其被缺失預(yù)測(cè)/清刷或用其從屬指令進(jìn)行重試。轉(zhuǎn)發(fā)預(yù)測(cè)器將從此缺失轉(zhuǎn)發(fā)進(jìn)行學(xué)習(xí)。
應(yīng)注意的是加載將能夠針對(duì)先前的存儲(chǔ)在srb中檢查匹配地址,因?yàn)椴⒎莝rb中的所有存儲(chǔ)都將被提交給外部高速緩存/存儲(chǔ)高速緩存架構(gòu)上可見狀態(tài)(將srb存儲(chǔ)裝置留給可見存儲(chǔ)器)直至包括所述加載的蹤跡中的所有指令都已達(dá)到蹤跡提交(commit)狀態(tài)(例如,全部變成非推測(cè)性的且蹤跡整體上準(zhǔn)備好提交)。
存儲(chǔ)退出/重新排序緩沖器在功能上啟用推測(cè)性執(zhí)行。可以將推測(cè)性執(zhí)行的結(jié)果保存在存儲(chǔ)退出/重新排序緩沖器中直至已知推測(cè)性結(jié)果。推測(cè)性結(jié)果并不是在架構(gòu)上可見的。一旦提交推測(cè)性狀態(tài),則可以將存儲(chǔ)提交到存儲(chǔ)高速緩存。在提交該狀態(tài)之前,需要重新嘗試的任何例外或加載和存儲(chǔ)將用信號(hào)通知將防止?fàn)顟B(tài)提交的例外或缺失預(yù)測(cè)。存儲(chǔ)與對(duì)應(yīng)的加載之間的轉(zhuǎn)發(fā)缺失預(yù)測(cè)可以是固定的(例如,通過引發(fā)在缺失=轉(zhuǎn)發(fā)加載點(diǎn)處清刷機(jī)器的缺失預(yù)測(cè)等)。
在2012年1月27日由mohammadabdallah提交的代理人檔案號(hào)smii-033、“hardwareaccelerationcomponentsfortranslatingguestinstructionstonativeinstructions”的美國(guó)專利申請(qǐng)13/360,024中可以找到srb功能的附加描述。
圖25示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的示例性微處理器管線2500的圖。微處理器管線2500包括取讀模塊2501,其實(shí)現(xiàn)用于識(shí)別并提取包括執(zhí)行的指令的過程的功能,如上所述。在圖25的實(shí)施例中,取讀模塊后面是解碼模塊2502、分配模塊2503、分派模塊2504、執(zhí)行模塊2505和退出模塊2506。應(yīng)注意的是微處理器管線2500僅僅是實(shí)現(xiàn)上述本發(fā)明的實(shí)施例的功能的管線的一個(gè)示例。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到可以實(shí)現(xiàn)包括上述解碼模塊的功能的其他微處理器管線。
出于說明的目的,前述描述參考并不意圖為窮舉的或限制本發(fā)明的特定實(shí)施例。根據(jù)以上講授內(nèi)容,可以有許多修改和變更。選擇和描述實(shí)施例是為了最好地解釋本發(fā)明的原理及其實(shí)際應(yīng)用,從而使得本領(lǐng)域的技術(shù)人員在有和適合于其特定使用的各種修改的情況下最好地利用本發(fā)明及其各種實(shí)施例。