專利名稱:高效且一致的軟件事務(wù)存儲(chǔ)器的制作方法
技術(shù)領(lǐng)域:
本申請(qǐng)是2007年12月28日提交的、申請(qǐng)?zhí)枮?00710306288.5的、發(fā)明名稱為
“高效且一致的軟件事務(wù)存儲(chǔ)器”的申請(qǐng)的分案申請(qǐng)。本發(fā)明涉及處理器執(zhí)行領(lǐng)域,特別涉及成組指令的執(zhí)行。
背景技術(shù):
半導(dǎo)體工藝和邏輯設(shè)計(jì)中的進(jìn)步已使得可在集成電路設(shè)備中提供的邏輯的數(shù)量得以增加。因此,計(jì)算機(jī)系統(tǒng)配置已經(jīng)從一個(gè)系統(tǒng)中的單一或多個(gè)集成電路演進(jìn)到在單個(gè)集成電路上提供多個(gè)核心和多個(gè)邏輯處理器。一個(gè)處理器或集成電路典型地包括單個(gè)處理器管芯(die),其中該處理器管芯可以包括任意數(shù)量的核心或邏輯處理器。集成電路上不斷增加的核心和邏輯處理器數(shù)量使得能夠執(zhí)行更多的軟件線程。然而,可以被同時(shí)執(zhí)行的軟件線程數(shù)量的增加已經(jīng)產(chǎn)生了對(duì)軟件線程之間共享的數(shù)據(jù)進(jìn)行同步的問題。在多核心或多邏輯處理器系統(tǒng)中訪問共享數(shù)據(jù)的一種通常方案包括,使用鎖來確保對(duì)共享數(shù)據(jù)的多個(gè)訪問之間的互斥。然而,不斷增加的執(zhí)行多個(gè)軟件線程的能力將可能會(huì)導(dǎo)致錯(cuò)誤的爭(zhēng)用和執(zhí)行的串行化。例如,考慮一個(gè)持有共享數(shù)據(jù)的哈希表。利用鎖系統(tǒng),程序員可以鎖住整個(gè)哈希表,允許一個(gè)線程訪問整個(gè)哈希表。然而,其它線程的吞吐量和性能將可能會(huì)受到負(fù)面影響,原因在于它們無法訪問該哈希表中的任何條目,直到該鎖被釋放。作為選擇,可以對(duì)哈希表中的每個(gè)條目加鎖。然而,這增加了編程的復(fù)雜性,因?yàn)槌绦騿T不得不考慮在一個(gè)哈希表內(nèi)的更多的鎖。另一種數(shù)據(jù)同步技術(shù)包括使用事務(wù)存儲(chǔ)器(transactional memory, TM)。通常事務(wù)執(zhí)行包括推測(cè)地執(zhí)行一組的多個(gè)微操作、操作或指令。在上述例子中,兩個(gè)線程都在該哈希表內(nèi)執(zhí)行,而它們的訪問被監(jiān)視/跟蹤。如果兩個(gè)線程都訪問/改變同一條目,則可以中止其中一個(gè)事務(wù)以解決沖突。一種事務(wù)執(zhí)行包括軟件事務(wù)存儲(chǔ)器(STM),其中訪問被跟蹤,以軟件來執(zhí)行沖突解決、中止任務(wù)和其它事務(wù)任務(wù)。在一種實(shí)現(xiàn)中,跟蹤讀操作的版本以保持一致性并檢測(cè)沖突。然而,在典型的STM中,直到事務(wù)將被提交時(shí)才執(zhí)行讀操作的驗(yàn)證(validation)。因此,如果在事務(wù)期間發(fā)生了比如沖突之類的無效動(dòng)作,則某些數(shù)據(jù)可能變得不一致,且使用不一致數(shù)據(jù)可能會(huì)導(dǎo)致程序異?;驘o限循環(huán)。而且,為了發(fā)現(xiàn)所發(fā)生的不一致,在執(zhí)行該事務(wù)的其余部分期間,可能會(huì)浪費(fèi)執(zhí)行周期。
本發(fā)明通過例子進(jìn)行說明,而并不是要受附圖中的各圖所限制。圖1說明了能夠進(jìn)行事務(wù)執(zhí)行的系統(tǒng)的實(shí)施例。圖2說明了軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)的實(shí)施例。圖3說明了在STM中利用全局時(shí)間戳(global timestamp)來檢測(cè)示例性事務(wù)中的沖突的實(shí)施例。圖4a說明了高效的按需(on demand)事務(wù)驗(yàn)證的方法的流程圖的實(shí)施例。圖4b說明了繼續(xù)自圖4a的流程的實(shí)施例。圖4c說明了繼續(xù)自圖4a和圖4b的流程的實(shí)施例。圖5說明了在程序代碼中插入指令以執(zhí)行高效的按需事務(wù)驗(yàn)證的方法的流程圖的實(shí)施例。
具體實(shí)施例方式在以下說明書中,為了提供對(duì)本發(fā)明的全面理解,闡述了許多具體細(xì)節(jié),比如以下示例:對(duì)于事務(wù)執(zhí)行的具體硬件支持、具體的跟蹤/元數(shù)據(jù)方法、處理器中具體類型的局部/存儲(chǔ)器、以及具體類型的存儲(chǔ)器訪問和單元(location)等。然而,對(duì)于本領(lǐng)域技術(shù)人員顯而易見的是,本發(fā)明可以無需這些具體細(xì)節(jié)來實(shí)現(xiàn)。在其它實(shí)例中,為了避免不必要地使本發(fā)明變得晦澀,沒有詳述公知的部件或方法,比如用軟件對(duì)事務(wù)進(jìn)行編碼、事務(wù)劃分、具體的多核心和多線程處理器架構(gòu)、中斷產(chǎn)生/處理、高速緩存組織以及微處理器的具體操作細(xì)節(jié)。這里所使用的值包括數(shù)字、狀態(tài)、邏輯狀態(tài)或二進(jìn)制邏輯狀態(tài)的任何已知表示。通常,邏輯電平、邏輯值或邏輯上的值的使用也被稱為I和0,其簡(jiǎn)單地表示二進(jìn)制邏輯狀態(tài)。例如,I是指邏輯高電平,而0是指邏輯低電平。然而,在計(jì)算機(jī)系統(tǒng)中也使用了值的其它表示。例如十進(jìn)制數(shù)10也可以被當(dāng)作二進(jìn)制值1010和十六進(jìn)制字母A。此外,狀態(tài)可以由值或部分值來表示。例如,加鎖狀態(tài)可以由單元中的第一個(gè)值(比如奇數(shù))來表示,而該單元中的版本號(hào)(比如偶數(shù)值)表示未加鎖狀態(tài)。這里,第一和第二個(gè)值的一部分可以被用來表示狀態(tài),比如所述值的兩個(gè)較低位、與所述值相關(guān)聯(lián)的符號(hào)位或所述值的其它部分。這里所述的方法和裝置用于軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)中的高效且一致的驗(yàn)證。具體地,軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)中的高效且一致的驗(yàn)證主要針對(duì)多核處理器計(jì)算機(jī)系統(tǒng)來進(jìn)行討論。然而,用于軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)中的高效且一致的驗(yàn)證的方法和裝置并不被限制于此,原因在于它們可以被實(shí)現(xiàn)在、或關(guān)聯(lián)于任何集成電路設(shè)備或系統(tǒng),比如移動(dòng)電話、個(gè)人數(shù)字助理、嵌入式控制器、移動(dòng)平臺(tái)、桌面平臺(tái)和服務(wù)器平臺(tái),以及與利用事務(wù)存儲(chǔ)器的其它資源(例如硬件/軟件線程)相結(jié)合。參考圖1,說明了軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)中能夠進(jìn)行高效且一致的驗(yàn)證的處理器的實(shí)施例。在一個(gè)實(shí)施例中,處理器100是能夠并行執(zhí)行多個(gè)線程的多核處理器。然而,處理器100可以包括任何處理單元,比如能夠執(zhí)行一個(gè)線程或多個(gè)線程的嵌入式處理器、單元處理器(cell-processor)、微處理器或其它已知的處理器。作為說明性的例子,在圖1中說明了處理器的亂序(out-of-order)架構(gòu)的簡(jiǎn)化實(shí)施例。下面將更詳細(xì)討論的處理器100中所示的模塊可能用硬件、軟件、固件或它們的組合來實(shí)現(xiàn)。注意,所示的模塊是邏輯塊,其在物理上可以與其它模塊的邊界重疊,并且可以以任何方式被配置或互連。此外,如圖1所示的模塊在處理器100中不是必需的。此外,其它模塊、單元、和已知的處理器功能部件也可以包括在處理器100中??偩€接口模塊105用于與諸如系統(tǒng)存儲(chǔ)器175、芯片組、北橋或其它集成電路這樣的設(shè)備進(jìn)行通信。典型地,總線接口模塊105包括輸入/輸出(I/O)緩沖器,用以在互連170上發(fā)送和接收總線信號(hào)?;ミB170的例子包括:射電收發(fā)邏輯(Gunning TransceiverLogic, GTL)總線、GTL+總線、雙倍數(shù)據(jù)速率(DDR)總線、并發(fā)總線(pumped bus)、差分總線、高速緩存一致性總線(cache coherent bus)、點(diǎn)對(duì)點(diǎn)總線、多點(diǎn)總線或其它已知的實(shí)現(xiàn)任何已知總線協(xié)議的互連。處理器100耦合到存儲(chǔ)器175,該存儲(chǔ)器可以專用于處理器100或與系統(tǒng)中的其它設(shè)備共享。存儲(chǔ)器175的例子包括:動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)、靜態(tài)RAM(SRAM)、非易失性存儲(chǔ)器(NV存儲(chǔ)器)以及長(zhǎng)期存儲(chǔ)裝置。所示的總線接口單元105還與高級(jí)高速緩存110通信。高級(jí)高速緩存110用于對(duì)最近取出的和/或操作的元素進(jìn)行緩存。在一個(gè)實(shí)施例中,高級(jí)高速緩存110是二級(jí)數(shù)據(jù)高速緩存。然而,高級(jí)高速緩存110并不局限于此,因?yàn)樗梢允?、或包括用來存?chǔ)最近取出/解碼的指令的指令高速緩存115。指令高速緩存115也可以被稱為軌跡高速緩存(trace cache),被圖示在取出邏輯120和解碼邏輯125之前。這里,指令高速緩存115存儲(chǔ)最近取出的還沒有解碼的指令。然而,指令高速緩存115可能會(huì)放置在取出邏輯120和/或解碼邏輯125之后以存儲(chǔ)解碼的指令。取出邏輯120用于取出將要操作/執(zhí)行的數(shù)據(jù)/指令。雖然沒有示出,但是在一個(gè)實(shí)施例中,取出邏輯包括或關(guān)聯(lián)于分支預(yù)測(cè)邏輯、分支目標(biāo)緩沖器和/或預(yù)取器,用于預(yù)測(cè)將執(zhí)行/采取的分支并沿著預(yù)測(cè)的執(zhí)行分支預(yù)取出指令。這里,能夠進(jìn)行推測(cè)執(zhí)行的處理器可能會(huì)預(yù)取并且推測(cè)地執(zhí)行所預(yù)測(cè)的分支。解碼邏輯125耦合到取出邏輯120以對(duì)取出的元素進(jìn)行解碼。分配器和重命名模塊150包括用于保留資源的分配器,比如存儲(chǔ)指令處理結(jié)果的寄存器文件和跟蹤指令的重排序緩沖器。單元150還可以包括寄存器重命名器,用于將程序/指令參考寄存器重命名為處理器100內(nèi)的其它寄存器。重排序/引退(retirement)模塊155包括諸如上述的重排序緩沖器這樣的部件,以支持亂序執(zhí)行和亂序執(zhí)行的指令在稍后的引退。在一個(gè)實(shí)施例中,其中處理器100是有序執(zhí)行處理器,則可以不包括重排序/引退模塊155。在一個(gè)實(shí)施例中,調(diào)度器和執(zhí)行模塊160包括調(diào)度器單元以在執(zhí)行單元上調(diào)度指令/操作。還包括與執(zhí)行單元相關(guān)聯(lián)的寄存器文件以存儲(chǔ)信息指令處理結(jié)果。示例性執(zhí)行單元包括浮點(diǎn)執(zhí)行單元、整數(shù)執(zhí)行單元、跳轉(zhuǎn)執(zhí)行單元、加載執(zhí)行單元、存儲(chǔ)執(zhí)行單元和其它已知的執(zhí)行單元。圖1中還示出了低級(jí)數(shù)據(jù)高速緩存165。數(shù)據(jù)高速緩存165用于存儲(chǔ)最近使用/操作的元素,比如數(shù)據(jù)操作數(shù)。在一個(gè)實(shí)施例中,數(shù)據(jù)轉(zhuǎn)譯后備緩沖器(data translationlookaside buffer, DTLB)與低級(jí)數(shù)據(jù)高速緩存165相關(guān)聯(lián)。通常處理器在邏輯上將物理存儲(chǔ)器看成虛擬存儲(chǔ)空間。作為具體例子,處理器可以包括頁表結(jié)構(gòu)以將物理存儲(chǔ)器分成多個(gè)虛擬頁。這里,DTLB支持虛擬到線性/物理地址的轉(zhuǎn)譯。數(shù)據(jù)高速緩存165可以被用作事務(wù)存儲(chǔ)器或其它存儲(chǔ)器,以在事務(wù)執(zhí)行期間跟蹤試探性訪問,下面將更詳細(xì)地討論。在一個(gè)實(shí)施例中,處理器100是多核處理器。核心通常是指位于能夠維護(hù)獨(dú)立架構(gòu)狀態(tài)的集成電路上的任何邏輯,其中每個(gè)獨(dú)立維護(hù)的架構(gòu)狀態(tài)與至少一些專用執(zhí)行資源相關(guān)聯(lián)。在一個(gè)實(shí)施例中,諸如執(zhí)行模塊160這樣的執(zhí)行資源包括專用于每個(gè)核心的物理上分離的執(zhí)行單元。然而,執(zhí)行模塊160可以包括在物理上被安排為同一單元的一部分或很鄰近的多個(gè)執(zhí)行單元;然而,執(zhí)行模塊160的各個(gè)部分在邏輯上專用于每個(gè)核心。而且,每個(gè)核心可以共享對(duì)處理器資源(比如高級(jí)高速緩存110)的訪問,。在另一實(shí)施例中,處理器100包括多個(gè)硬件線程。典型地,硬件線程是指位于能夠維護(hù)獨(dú)立架構(gòu)狀態(tài)的集成電路上的任何邏輯,其中獨(dú)立維護(hù)的架構(gòu)狀態(tài)共享對(duì)一些執(zhí)行資源的訪問。例如,可以為每個(gè)硬件線程復(fù)制較少的資源,比如指令指針、重命名分配器邏輯150中的重命名邏輯、指令轉(zhuǎn)譯緩沖器(ILTB),同時(shí),硬件線程可以通過劃分來共享某些資源,比如重排序/引退單元155中的重排序緩沖器、加載/存儲(chǔ)緩沖器以及隊(duì)列。其它資源,比如低級(jí)數(shù)據(jù)高速緩存和數(shù)據(jù)TLB 165、(多個(gè))執(zhí)行單元160和部分的亂序單元155,可能會(huì)被完全共享。如可看到的,由于某些處理資源是被共享的而其它則專用于一種架構(gòu)狀態(tài),所以硬件線程與核心的命名(nomenclature)之間的線重疊。然而通常,核心和硬件線程被操作系統(tǒng)看成單獨(dú)的邏輯處理器,每個(gè)邏輯處理器能夠執(zhí)行一個(gè)線程。在這里邏輯處理器還可以被稱為資源或處理資源。因此,諸如處理器100這樣的處理器能夠在多個(gè)邏輯處理器/資源上執(zhí)行多個(gè)線程。結(jié)果,可以在處理器100中同時(shí)和/或并發(fā)地執(zhí)行多個(gè)事務(wù)。事務(wù)包括一組指令、操作或微操作,可以由硬件、軟件、固件或它們的組合對(duì)其進(jìn)行分組。例如,指令可以用來劃分事務(wù)。典型地,在事務(wù)執(zhí)行期間,對(duì)存儲(chǔ)器的更新直到該事務(wù)被提交時(shí)才是全局可見的。雖然該事務(wù)仍然未決,但是存儲(chǔ)器內(nèi)加載和寫入的單元被跟蹤。一旦成功驗(yàn)證那些存儲(chǔ)單元,就提交該事務(wù)并且使在該事務(wù)期間進(jìn)行的更新成為全局可見的。然而,如果事務(wù)在它的未決期間是無效的,則重新開始該事務(wù)而不使所述更新成為全局可見的。結(jié)果,如這里使用的,事務(wù)的未決是指已經(jīng)開始執(zhí)行且還沒有被提交或中止(即未決)的事務(wù)。事務(wù)執(zhí)行的兩個(gè)示例系統(tǒng)包括硬件事務(wù)存儲(chǔ)器(HTM)系統(tǒng)和軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)。硬件事務(wù)存儲(chǔ)器(HTM)系統(tǒng)通常涉及利用處理器100的硬件在處理器100執(zhí)行事務(wù)期間對(duì)訪問進(jìn)行跟蹤。例如,高速緩存行166用于對(duì)系統(tǒng)存儲(chǔ)器175中的數(shù)據(jù)項(xiàng)/對(duì)象176進(jìn)行緩存。在事務(wù)執(zhí)行期間,與高速緩存行166相關(guān)聯(lián)的注解/屬性字段167被用來跟蹤對(duì)行166的訪問和來自行166的訪問。例如,屬性字段167包括用于跟蹤在事務(wù)執(zhí)行期間高速緩存行166是否已經(jīng)被讀取的事務(wù)讀位和用于跟蹤在事務(wù)執(zhí)行期間高速緩存行166是否已經(jīng)被寫入的事務(wù)寫位。屬性字段167可能會(huì)被用來在事務(wù)執(zhí)行期間以及嘗試提交該事務(wù)時(shí)跟蹤訪問并檢測(cè)沖突。例如,如果字段167中的事務(wù)讀位被設(shè)置為指示在事務(wù)執(zhí)行期間發(fā)生了從行166的讀取,并且發(fā)生了來自另一事務(wù)的與行166有關(guān)的存儲(chǔ),則檢測(cè)到?jīng)_突。對(duì)于事務(wù)執(zhí)行使用屬性字段的例子被包括在代理人案卷號(hào)為042390.P20165、題目為“Transaction basedshared data operations in a Multiprocessor Environment,,的共有未決申請(qǐng)中。軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)通常涉及用軟件執(zhí)行訪問跟蹤、沖突解決或其它事務(wù)存儲(chǔ)器任務(wù)。作為一般的例子,當(dāng)由處理器100執(zhí)行時(shí),系統(tǒng)存儲(chǔ)器175中的編譯器179編譯程序代碼以將讀和寫屏障(barrier)插入到加載和存儲(chǔ)操作中,相應(yīng)地,讀和寫屏障成為程序代碼內(nèi)的事務(wù)的一部分。編譯器179也可以插入其它的事務(wù)相關(guān)操作,比如提交或中止操作。
如所示,高速緩存165還用于緩存數(shù)據(jù)對(duì)象176、以及元數(shù)據(jù)177和事務(wù)描述符178。然而,元數(shù)據(jù)單元177與數(shù)據(jù)項(xiàng)176相關(guān)聯(lián)以指示數(shù)據(jù)項(xiàng)176是否被加鎖。讀日志(可以存在于事務(wù)描述符178中)被用來記錄讀操作,而寫緩沖器或其它事務(wù)存儲(chǔ)器(可以包括低級(jí)數(shù)據(jù)高速緩存165)被用來緩沖或記錄寫操作。所插入的用于驗(yàn)證和提交的調(diào)用使用所述日志來檢測(cè)沖突并驗(yàn)證事務(wù)操作。參考圖2,說明了軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)的一實(shí)施例。數(shù)據(jù)對(duì)象201包括任何粒度的數(shù)據(jù),比如位、字、存儲(chǔ)器中的一行、高速緩存行、表、哈希表或任何其它已知的數(shù)據(jù)結(jié)構(gòu)或?qū)ο?。例如,由編程語言所定義數(shù)據(jù)對(duì)象是數(shù)據(jù)對(duì)象201。事務(wù)存儲(chǔ)器205包括任何存儲(chǔ)與事務(wù)相關(guān)的元素的存儲(chǔ)器。這里,事務(wù)存儲(chǔ)器205包括多個(gè)行210、215、220、225和230。在一個(gè)實(shí)施例中,存儲(chǔ)器205是高速緩沖存儲(chǔ)器。作為例子,數(shù)據(jù)對(duì)象201將被排成一行存儲(chǔ)在高速緩存行215中。作為選擇,數(shù)據(jù)對(duì)象201能夠被不排成一行而存儲(chǔ)在存儲(chǔ)器205中。在一個(gè)例子中,每個(gè)數(shù)據(jù)對(duì)象與元數(shù)據(jù)陣列240中的一個(gè)元數(shù)據(jù)單元相關(guān)聯(lián)。作為一說明性實(shí)施例,與高速緩存行215相關(guān)的地址被散列以定位陣列240,其將元數(shù)據(jù)單元250與高速緩存行215和數(shù)據(jù)對(duì)象201相關(guān)聯(lián)。注意,數(shù)據(jù)對(duì)象201可以與高速緩存行215大小相同、比其更小(每個(gè)高速緩存行多個(gè)元素)或更大(多個(gè)高速緩存行一個(gè)元素)。此夕卜,元數(shù)據(jù)單元250可以以任何方式與數(shù)據(jù)對(duì)象201和/或高速緩存行215相關(guān)聯(lián)。通常,元數(shù)據(jù)單元250表示數(shù)據(jù)對(duì)象201是加鎖的還是可用的。在一個(gè)實(shí)施例中,當(dāng)數(shù)據(jù)對(duì)象201被加鎖時(shí),元數(shù)據(jù)單元250包括用于表示加鎖狀態(tài)的第一值,比如讀/寫擁有狀態(tài)252。另一示例性鎖狀態(tài)是單擁有者讀鎖(Single Owner Read Lock, SORL)狀態(tài),在代理人案卷號(hào)為 042390.P24817、題目為 “A mechanism for Irrevocable Transactions”共有未決相關(guān)申請(qǐng)中更詳細(xì)地論述了該狀態(tài)。然而,可以在無數(shù)據(jù)單元250中利用和表示任何鎖或鎖狀態(tài)。當(dāng)未加鎖或可用時(shí),元數(shù)據(jù)單元250包括第二值。在一個(gè)實(shí)施例中,該第二值用于表示版本號(hào)251。這里,一旦對(duì)數(shù)據(jù)對(duì)象201有寫入,版本號(hào)251就被更新(比如遞增),以跟蹤數(shù)據(jù)對(duì)象201的當(dāng)前版本。作為說明圖2所示實(shí)施例的操作的例子,響應(yīng)于事務(wù)中涉及數(shù)據(jù)對(duì)象201/高速緩存行215的第一讀操作,該讀操作被記錄在讀日志265中。在一個(gè)實(shí)施例中,讀日志265被包括在事務(wù)描述符260中。事務(wù)描述符也可以包括寫空間270,以及其它與該事務(wù)相關(guān)的信息,比如事務(wù)標(biāo)識(shí)符(ID) 261、不可撤回事務(wù)(IRT)指示符262和其它事務(wù)信息。然而,不要求在事務(wù)描述符260中包括寫空間270和讀日志265。例如,寫空間270可以被單獨(dú)包括在與讀日志265和/或事務(wù)描述符260不同的存儲(chǔ)空間中。不可撤回事務(wù)和事務(wù)描述符在代理人案卷號(hào)為 042390.P24817、題目為 “A mechanism for Irrevocable Transactions” 的共有未決相關(guān)申請(qǐng)中有更詳細(xì)的論述。在一個(gè)實(shí)施例中,對(duì)讀操作進(jìn)行記錄包括在讀日志265中存儲(chǔ)版本號(hào)251和與數(shù)據(jù)對(duì)象201或高速緩存215相關(guān)聯(lián)的地址。這里,假定版本號(hào)251是1,以簡(jiǎn)化該例子。一旦遇到涉及與數(shù)據(jù)對(duì)象201相關(guān)的地址的寫操作,該寫操作就可能會(huì)作為一試探性更新被記錄或跟蹤。此外,該元數(shù)據(jù)單元被更新為鎖值,比如2,以表示數(shù)據(jù)對(duì)象201被事務(wù)或執(zhí)行該事務(wù)的資源加鎖。在一個(gè)實(shí)施例中,使用原子操作來更新該鎖值,所述原子操作比如讀、修改和寫(RMW)指令。RMW指令的例子包括位測(cè)試和設(shè)置(Bit-test and Set)、比較和交換(Compareand Swap)、以及相加(Add)。在一個(gè)實(shí)施例中,寫空間270是一個(gè)緩沖器,用于對(duì)要寫入到數(shù)據(jù)對(duì)象201的新值進(jìn)行緩沖/存儲(chǔ)。這里,響應(yīng)于提交,新值被“寫回”到它們相應(yīng)的單元;而響應(yīng)于中止,丟棄寫空間270中的新值。在另一實(shí)施例中,該寫操作將高速緩存行215更新為新值,而舊值272被存儲(chǔ)在寫空間270中。這里,一旦提交了該事務(wù),寫空間中的舊值就被丟棄,相反地,一旦中止了該事務(wù),該舊值就被恢復(fù),即,所述單元被“回滾”到它們?cè)谠撌聞?wù)之前的原始值。寫空間270的例子包括寫日志、一組檢查點(diǎn)寄存器、以及存儲(chǔ)空間,用于在事務(wù)期間對(duì)要被更新的值進(jìn)行記錄/設(shè)置檢查點(diǎn)。在代理人案卷號(hào)為042390.P24802、題目為“Compiler Technique for EfficientRegister Checkpointing to Support Transaction Roll-back,,的共有未決相關(guān)申請(qǐng)中論述了關(guān)于高效地對(duì)事務(wù)設(shè)置檢查點(diǎn)和進(jìn)行回滾的更多信息。繼續(xù)上面的例子,無論寫空間270是被用作寫緩沖器、寫日志或根本沒有被使用,當(dāng)提交時(shí),該寫操作就釋放鎖250。在一個(gè)實(shí)施例中,釋放鎖250包括將元數(shù)據(jù)單元250返回到值1,表示未鎖狀態(tài)。作為選擇,該值被增加為3,表示未鎖版本值251。該版本變更使其它事務(wù)通過將其它事務(wù)的讀日志中的所記錄的版本值與當(dāng)前版本值251進(jìn)行比較,可驗(yàn)證它們的加載了數(shù)據(jù)對(duì)象201的讀操作。上述例子包括實(shí)現(xiàn)STM的一個(gè)實(shí)施例;然而,可以使用STM的任何已知實(shí)現(xiàn)。在以下文章中論述了 STM:Bratin Saha, Al1-Reza Adl-Tabatabai, Rick Hudson, Chi CaoMinh 和 Ben Hertzberg 的“ Implementing a High Performance Software TransactionalMemory for a Mult1-core Runtime,,,Proceedings of the eleventh ACM SIGPLANsymposium on Principles and practice of parallel programming;N.Shavit 和D.Tuitou 的 “Software Transactional Memory,,,Proceedings of the Fourteenth ACMSIGACT-SIGOPS Symposium on Principles of Distributed Computing;T.L.Harris和 K.Fraser 的 “Language Support for Lightweight Transactions,,,Proceedings ofthe2003ACM SIGPLAN Conference on Object-Oriented Programming Systems, Languagesand Applications;以及 Al1-Reza Adl-Tabatabai, Brian Lewis, Vijay Menon, BrianMurphy, Bratin Saha 和 Tatiana Shpeisman 的“Compiler and runtime support forefficient software transactional memory”,Proceedings of the2006ACM SIGPLANconference on Programming language design and implementation。事實(shí)上,也可以使用任何已知的用于執(zhí)行事務(wù)存儲(chǔ)器的系統(tǒng),比如HTM、STM、無限制事務(wù)存儲(chǔ)器(Unbounded Transactional Memory, UTM)系統(tǒng)、混合事務(wù)存儲(chǔ)器系統(tǒng)(比如硬件加速STM(HASTM))、或任何其它事務(wù)存儲(chǔ)器系統(tǒng)。代理人案卷號(hào)為P24805、題目為“Hardware Acceleration of a write-buffering software transactional memory,,的共有未決相關(guān)申請(qǐng)討論了 STM的硬件加速。代理人案卷號(hào)為042390.P23547、題目為“Overflow Method for Virtualized Transactional Memory”的共有未決申請(qǐng)討論了擴(kuò)展/虛擬化HTM。以前,當(dāng)版本251被遠(yuǎn)程資源(比如并未執(zhí)行當(dāng)前事務(wù)的資源)更新時(shí),更新的版本251指示出,在當(dāng)前事務(wù)執(zhí)行期間所發(fā)生的由遠(yuǎn)程資源對(duì)行215的寫操作。結(jié)果,在當(dāng)前事務(wù)中先前的從行215的加載可能變成無效;然而,直到當(dāng)前事務(wù)的讀集被驗(yàn)證時(shí)試圖提交該當(dāng)前事務(wù),才會(huì)從版本251上檢測(cè)到該先前的無效加載。因此,在一個(gè)實(shí)施例中,能夠按需驗(yàn)證的、高效且一致的STM包括在執(zhí)行加載/讀操作之前和之后檢查版本251的操作。例如,當(dāng)檢測(cè)到在第一事務(wù)中從行215加載/讀數(shù)據(jù)對(duì)象201時(shí),對(duì)讀屏障的調(diào)用被插入在該加載操作之前。在一個(gè)實(shí)施例中,讀屏障用于檢查元數(shù)據(jù)單元250。如上所述,如果元數(shù)據(jù)250在版本251中包括第一未鎖值,則該第一未鎖值被記錄在讀日志265中。如果元數(shù)據(jù)250包括加鎖值,則在一個(gè)實(shí)施例中,當(dāng)前事務(wù)等待,直到元數(shù)據(jù)250被設(shè)置為未鎖值。現(xiàn)在假定,執(zhí)行加載操作,且隨后遠(yuǎn)程資源更新數(shù)據(jù)對(duì)象201并且將版本251修改為加鎖值以及隨后的版本251中的第二未鎖值。結(jié)果,該加載操作已變?yōu)闊o效,即,遠(yuǎn)程資源向第一未決事務(wù)加載的單元進(jìn)行了寫入,這是由與當(dāng)前/后續(xù)的第二未鎖版本值不同的已記錄版本第一未鎖值來表示的。這里,一檢查版本屏障也被插入到第一事務(wù)中該加載操作之后。該檢查版本屏障用于取得當(dāng)前/后續(xù)版本,并將它與讀日志265中已記錄的版本進(jìn)行比較。結(jié)果,如果在讀操作之后且在檢查版本屏障被調(diào)用之前發(fā)生了遠(yuǎn)程資源更新,則檢查版本屏障檢測(cè)到版本251中的變化,并且能夠在該點(diǎn)上中止該事務(wù),而不用等到該事務(wù)提交時(shí)才檢測(cè)到讀日志265中記錄的讀集里的無效加載操作。然而,在上面的例子中,如果在該讀操作之前或版本檢查屏障之后發(fā)生了遠(yuǎn)程資源進(jìn)行的無效的寫操作,則無效加載操作有可能不被檢測(cè)直到試圖進(jìn)行事務(wù)提交。因此,在一個(gè)實(shí)施例中,利用全局時(shí)間戳來跟蹤最新/最近提交的事務(wù)的版本。作為例子,全局時(shí)間戳中的第一值被復(fù)制到第一事務(wù)的局部時(shí)間戳(local timestamp)中。在這種情況下,力口載操作之前的讀屏障仍然讀取版本251。另外,版本251被與局部時(shí)間戳相比較。如果版本251大于局部時(shí)間戳,則第一事務(wù)的當(dāng)前讀集被驗(yàn)證。本質(zhì)上,比在事務(wù)開始時(shí)從全局時(shí)間戳復(fù)制的局部時(shí)間戳大的版本251潛在地指示另一事務(wù)或遠(yuǎn)程資源更新過行215。為了說明,假定全局時(shí)間戳被初始化為O。第一和第二事務(wù)開始將O復(fù)制到它們的局部時(shí)間戳中。第一事務(wù)從行215加載而第二事務(wù)寫入行215。隨后,第二事務(wù)提交。這里,在提交期間,第二事務(wù)將全局時(shí)間戳增加到1,并且將全局時(shí)間戳值I用于與在第二事務(wù)期間更新的行215相關(guān)聯(lián)的版本(比如版本251)。現(xiàn)在假定第一事務(wù)將要從行215執(zhí)行另一加載操作。當(dāng)執(zhí)行讀屏障時(shí),從元數(shù)據(jù)250讀取版本1,而該版本大于第一事務(wù)的局部時(shí)間戳,后者保持為值O。因此,第一事務(wù)中的先前加載操作被進(jìn)行驗(yàn)證,即,已記錄的版本值O與當(dāng)前版本值I相比較。由于版本不同,指示沖突,因此第一事務(wù)可能會(huì)在該事務(wù)中的該點(diǎn)上被中止。轉(zhuǎn)到圖3,說明了在能夠利用插入的版本檢查屏障和時(shí)間戳的STM中執(zhí)行示例性事務(wù)的實(shí)施例。這里,存儲(chǔ)單元305和310用于存儲(chǔ)元素、數(shù)據(jù)元素、指令、數(shù)據(jù)對(duì)象等。如參考圖2所討論的,存儲(chǔ)單元305和310分別與元數(shù)據(jù)(MD)單元306和311以任意方式相關(guān)聯(lián)。例如,存儲(chǔ)單元305和310是用來存儲(chǔ)數(shù)據(jù)對(duì)象的高速緩存行,并且涉及數(shù)據(jù)對(duì)象或高速緩存行305和310的地址分別被散列以定位MD單元306和311。此外,全局時(shí)間戳(GTS) 315用于存儲(chǔ)GTS值。在一個(gè)實(shí)施例中,GTS是以任何已知方式存儲(chǔ)的變量,比如在程序堆棧中、在存儲(chǔ)器中、在寄存器中,或其它存儲(chǔ)元素。資源301和302包括能夠進(jìn)行并發(fā)或同時(shí)執(zhí)行的核心和/或線程。例如,資源301和302可以是單個(gè)物理微處理器管芯上的核心,用于至少部分并發(fā)地執(zhí)行事務(wù)303和304。局部時(shí)間戳(LTS) 316和317是變量,比如分別在事務(wù)303和304中初始化的局部變量。為了說明示例性操作,在事務(wù)303開始執(zhí)行時(shí),在操作320中將LTS 316加載為GTS 315,以將初始GTS值0復(fù)制到LTS 316中。類似地,在事務(wù)304開始執(zhí)行時(shí),在操作330中把仍具有0值的GTS 315加載到與事務(wù)304相關(guān)聯(lián)的LTS 317中。首先,在存儲(chǔ)操作321之前插入的寫屏障350用于執(zhí)行寫屏障操作,包括與寫/存儲(chǔ)操作相關(guān)的任何事務(wù)任務(wù)。例如,寫屏障350用于獲取與被涉及的單元相關(guān)聯(lián)的鎖。這里,獲取單元305的鎖。然后,執(zhí)行存儲(chǔ)321。如上所述,存儲(chǔ)操作321可以更新單元305并且記錄單元305中的舊值,或者存儲(chǔ)操作321可以在寫緩沖器中對(duì)新值進(jìn)行緩沖并且在單元305中保持舊值。接著,在事務(wù)304中,在從單元310進(jìn)行加載操作331之前遇到插入的讀屏障355。這里,檢查與單元310相關(guān)聯(lián)的元數(shù)據(jù)單元。單元311指示未加鎖值O。該未加鎖值0被與也具有值0的LTS 317進(jìn)行比較。由于LTS 317和元數(shù)據(jù)單元311保持相同的值0,因此沒有執(zhí)行讀集驗(yàn)證并且版本0被記錄為已記錄的版本。執(zhí)行從單元310的加載操作331。在加載操作331之后,版本檢查屏障360檢查元數(shù)據(jù)311以確定第二、當(dāng)前或后續(xù)版本。如果第二版本不同于第一版本,則可能發(fā)生了對(duì)存儲(chǔ)單元310的修改并且可能會(huì)中止事務(wù)304。這里,在版本檢查屏障360時(shí)的版本與讀屏障355中記錄的版本相同,因此事務(wù)304的執(zhí)行繼續(xù)。接著,在事務(wù)303中,遇到了寫屏障350。獲取單元310的鎖。執(zhí)行存儲(chǔ)操作322以在單元310中存儲(chǔ)值99。然后提交事務(wù)303。在提交期間,GTS 315遞增,比如從值0增加到I。在寫緩沖STM中,新值被寫回到單元305和310。在回滾STM中,舊的記錄值被丟棄。此外,遞增后的GTS 315值I被用作針對(duì)在事務(wù)303期間執(zhí)行的寫操作的版本。因此,元數(shù)據(jù)單元306和311被更新為版本I,這是GTS 315的值。由于事務(wù)304仍然在資源302中執(zhí)行,所以遇到讀屏障355。這里,由于元數(shù)據(jù)單元306與將要由操作332從中加載的單元305相關(guān)聯(lián),所以檢查元數(shù)據(jù)單元306。已由遠(yuǎn)程資源301更新為I的元數(shù)據(jù)單元311大于局部時(shí)間戳317的O。因此,在一個(gè)實(shí)施例中,局部時(shí)間戳317被加載或重加載為GTS 315中的當(dāng)前值I。此外,事務(wù)304的讀集被驗(yàn)證。這里,在操作331之前在讀屏障355處元數(shù)據(jù)311的記錄值是0,而元數(shù)據(jù)311的當(dāng)前值是I。結(jié)果,確定加載操作331 (即事務(wù)304的讀集)和事務(wù)304可以被在這一點(diǎn)上中止并重新執(zhí)行,而不是浪費(fèi)執(zhí)行嘗試提交的執(zhí)行周期。轉(zhuǎn)到圖4a,說明了高效且一致地在STM中執(zhí)行事務(wù)的方法的流程圖的實(shí)施例。在流程405,開始事務(wù)的執(zhí)行。在一個(gè)實(shí)施例中,執(zhí)行所編譯的開始事務(wù)指令以開始該事務(wù)的執(zhí)行。作為例子,對(duì)開始事務(wù)函數(shù)的調(diào)用被編譯器插入,當(dāng)執(zhí)行時(shí),執(zhí)行初始化和其它任務(wù),比如流程410中的任務(wù)。在流程410中,響應(yīng)于第一事務(wù)的開始執(zhí)行,將第一全局時(shí)間戳(GTS)值存儲(chǔ)在與第一事務(wù)相關(guān)聯(lián)的第一局部時(shí)間戳(LTS)中。在第一 LTS中存儲(chǔ)第一 GTS的操作的示例包括:用來將第一 GTS復(fù)制到第一 LTS的復(fù)制操作、用來讀取GTS的加載操作、和用來在第一LTS中存儲(chǔ)第一 GTS的存儲(chǔ)操作。接著在流程415中,在第一事務(wù)中遇到了被包括在第一事務(wù)中且涉及第一地址和/或第一數(shù)據(jù)對(duì)象的讀操作。注意,編譯器可以在該讀操作之前插入讀屏障。結(jié)果,遇到讀操作包括遇到與該讀操作相關(guān)的讀屏障。作為例子,在讀操作之前插入對(duì)讀屏障函數(shù)的調(diào)用以執(zhí)行流程 420、421、425、426、427、428、430 和 435。
在流程420中,確定第一地址是否未加鎖。在一個(gè)實(shí)施例中,檢查與數(shù)據(jù)對(duì)象/地址相關(guān)的元數(shù)據(jù)單元。在流程421中,如果該地址并未被解鎖,即,元數(shù)據(jù)單元表示加鎖值,則執(zhí)行在流程421中等待,直到該地址被解鎖。這里,如果等待導(dǎo)致死鎖,則可以中止該事務(wù)。在地址被解鎖之后,在流程425中確定元數(shù)據(jù)單元中的第一版本是否大于LTS。響應(yīng)于第一版本大于LTS,在流程426中將局部時(shí)間戳重新加載為當(dāng)前GTS。此外,在流程427中,驗(yàn)證了第一事務(wù)中多個(gè)先前的讀操作,比如第一事務(wù)的/與第一事務(wù)相關(guān)聯(lián)的讀集。如果在流程427中確定該讀集不是有效的,則在流程428中第一事務(wù)被中止。無論是在流程425中第一版本不大于LTS、還是在流程426中確定讀集有效,在流程430中都記錄讀操作,S卩,第一 /當(dāng)前版本。接著,在流程435中,執(zhí)行該讀操作。在執(zhí)行了當(dāng)前讀操作之后,執(zhí)行流程經(jīng)436到達(dá)圖4c中的流程460。這里,在流程460中檢查/確定與第一地址相關(guān)聯(lián)的后續(xù)/第二版本。如果第一和第二版本(即已記錄的當(dāng)前版本和后續(xù)版本或者在該讀操作之前記錄的和在該讀操作之后確定的版本)并不相同,則在流程428中第一事務(wù)被中止。回到圖4b,在從圖4a的流程405和410中初始化第一事務(wù)后,可能在第一事務(wù)內(nèi)的任何時(shí)間遇到要涉及該地址或數(shù)據(jù)對(duì)象的寫/存儲(chǔ)操作,如經(jīng)411從圖4a到圖4b的執(zhí)行流程所表示的。類似于讀/加載操作,在寫操作之前可能會(huì)插入寫屏障以執(zhí)行寫屏障任務(wù),比如在流程445和446中。這里,在流程445中,確定是否已經(jīng)獲得對(duì)于該地址/數(shù)據(jù)對(duì)象的鎖。如果已經(jīng)獲得鎖,則可以在流程447中直接執(zhí)行該寫操作。然而,如果還沒有獲得鎖,則在流程446中獲得鎖。注意,在STM的替代實(shí)現(xiàn)中,可以在提交期間而不是在這里所示的事務(wù)執(zhí)行期間獲得寫鎖。接著,無論是經(jīng)流程450從圖4b到4c ( S卩,寫操作之后),還是在流程460之后(即,讀操作和版本檢查屏障之后),遇到該事務(wù)的提交。在一個(gè)實(shí)施例中,遇到提交事務(wù)指令(比如對(duì)提交函數(shù)的調(diào)用),以執(zhí)行提交操作,比如在流程470、475、480和485中的任務(wù)。在流程470中,確定LTS是否小于GTS。響應(yīng)于LTS小于GTS,在流程475中,驗(yàn)證第一事務(wù)中的每個(gè)讀操作,包括來自流程427的多個(gè)先前的讀操作和在流程430中記錄的當(dāng)前讀操作。響應(yīng)于該讀集并非有效,在流程428中第一事務(wù)被中止。然而,如果該讀集有效或者在流程470中LTS不小于GTS,比如大于或等于LTS,則在流程480中,GTS被遞增為遞增后的GTS。作為示例,可以以任意值來遞增GTS,比如增量為1、2或其它值。接著,在流程485中,元數(shù)據(jù)單元被設(shè)置為至少該遞增后的GTS值,以跟蹤第一事務(wù)是在那時(shí)最近提交的事務(wù)。轉(zhuǎn)到圖5,說明了用于插入操作/指令以在STM中執(zhí)行高效且一致的驗(yàn)證的流程圖的實(shí)施例。在一個(gè)實(shí)施例中,執(zhí)行編譯器以編譯程序代碼。在編譯期間插入指令和/或操作。指令或操作都是指用于執(zhí)行任務(wù)/操作、或一組或多個(gè)任務(wù)/操作的代碼。例如通常,指令或這里也使用的操作,包括多個(gè)微操作。例如,比較和交換指令包括多個(gè)微操作,用于原子性地將存儲(chǔ)單元的內(nèi)容與給定值進(jìn)行比較,如果它們相同,則將該存儲(chǔ)單元的內(nèi)容修改為給定的新值。因此,下面討論的指令和操作在執(zhí)行時(shí)可以包括單個(gè)或多個(gè)操作/微操作,用以執(zhí)行單個(gè)或多個(gè)任務(wù)/操作。此外,程序代碼中的指令/操作可以被檢測(cè)到和/或以任何順序插入。例如,在圖5的流程中,在流程515中檢測(cè)到加載操作,并且在流程520和525中插入相關(guān)聯(lián)的加載指令/屏障,而在流程530中檢測(cè)到存儲(chǔ)操作,并且在流程535中插入寫屏障。然而,在讀操作之前可以檢測(cè)寫操作。另外,寫和讀屏障可以是在編譯期間的任何時(shí)間(比如開始或結(jié)束時(shí))插入的函數(shù),并且當(dāng)檢測(cè)到存儲(chǔ)或讀操作時(shí),插入對(duì)所述函數(shù)的調(diào)用,以“在操作之前或之后插入屏障”。
在流程505中,檢測(cè)到開始事務(wù)指令。在流程510中,插入第一指令,當(dāng)其被執(zhí)行時(shí),用于將全局時(shí)間戳(GTS)加載到與第一事務(wù)相關(guān)聯(lián)的局部時(shí)間戳(LTS)。在一個(gè)實(shí)施例中,全局時(shí)間戳用于保持最近提交事務(wù)的最近時(shí)間戳值。作為例子,插入對(duì)開始事務(wù)函數(shù)的調(diào)用并且將第一指令插入開始事務(wù)函數(shù)中。第一指令的示例包括復(fù)制、加載、存儲(chǔ)或其它操作,用于從GTS讀取值并將該值存儲(chǔ)在LTS中,比如在執(zhí)行時(shí)將GTS復(fù)制到LTS的復(fù)制操作。接著,在流程515中,檢測(cè)到該事務(wù)中涉及一地址的加載操作。在流程520中,在該加載操作之前插入讀屏障。在一個(gè)實(shí)施例中,在該加載操作之前插入對(duì)讀屏障函數(shù)的調(diào)用。此外,在編譯期間的某點(diǎn)上,編譯器代碼在執(zhí)行時(shí)也用于插入讀屏障函數(shù)。作為例子,讀屏障函數(shù)在執(zhí)行時(shí)用于確定保持在版本單元中的第一版本,所述版本單元例如是與該地址相關(guān)聯(lián)的元數(shù)據(jù)單元。此外,讀屏障用于確定第一版本是否大于局部時(shí)間戳。響應(yīng)于第一版本大于局部時(shí)間戳:將GTS (比如當(dāng)前GTS)重新加載到LTS中,驗(yàn)證第一事務(wù)中多個(gè)先前的讀操作,并且響應(yīng)于第一事務(wù)中多個(gè)先前的讀操作之一無效而中止該第一事務(wù)。讀屏障也記錄下第一版本以用于隨后的驗(yàn)證。在下面說明了讀屏障的偽代碼的一說明性實(shí)施例。
權(quán)利要求
1.一種用于提供按需事務(wù)驗(yàn)證的裝置,包括: 存儲(chǔ)模塊,響應(yīng)于開始執(zhí)行第一事務(wù),在與所述第一事務(wù)相關(guān)聯(lián)的第一局部事務(wù)值中存儲(chǔ)用于表示最近提交的事務(wù)的全局事務(wù)值; 版本模塊,用于在與數(shù)據(jù)地址相關(guān)聯(lián)的元數(shù)據(jù)單元中保持所述數(shù)據(jù)地址的當(dāng)前版本值,所述當(dāng)前版本值基于與用于更新所述數(shù)據(jù)地址的最近事務(wù)相關(guān)聯(lián)的所述全局事務(wù)值; 驗(yàn)證模塊,用于作為對(duì)于遇到被包括在所述第一事務(wù)中、且涉及所述數(shù)據(jù)地址的當(dāng)前的讀操作的響應(yīng),響應(yīng)于來自與所述數(shù)據(jù)地址相關(guān)聯(lián)的所述元數(shù)據(jù)單元的所述當(dāng)前版本值大于用來指示比所述第一事務(wù)更近的事務(wù)已經(jīng)更新了所述數(shù)據(jù)地址的局部事務(wù)值,而驗(yàn)證來自所述第一事務(wù)的多個(gè)先前的讀操作。
2.如權(quán)利要求1所述的裝置,進(jìn)一步包括讀屏障模塊,用于響應(yīng)于遇到所述當(dāng)前的讀操作,而從與所述數(shù)據(jù)地址相關(guān)聯(lián)的所述元數(shù)據(jù)單元中讀取所述當(dāng)前版本值,檢查所述當(dāng)前版本值是否指示所述數(shù)據(jù)地址未加鎖,并且響應(yīng)于所述第一地址未加鎖而記錄所述當(dāng)前版本值為已記錄版本值。
3.如權(quán)利要求2所述的裝置,進(jìn)一步包括: 用于執(zhí)行所述當(dāng)前的讀操作的模塊; 用于加載來自與所述數(shù)據(jù)地址相關(guān)聯(lián)的所述元數(shù)據(jù)單元的后續(xù)版本值的模塊;以及 用于響應(yīng)于來自所述元數(shù)據(jù)單元的所述后續(xù)版本值不同于所述已記錄版本值而中止所述第一事務(wù)的模塊。
4.如權(quán)利要求3所述的裝置,進(jìn)一步包括:用于響應(yīng)于遇到涉及所述數(shù)據(jù)地址的寫操作而獲取與所述數(shù)據(jù)地址相關(guān)聯(lián)的所述元數(shù)據(jù)單元中的鎖的模塊。
5.如權(quán)利要求4所述的裝置,進(jìn)一步包括:用于提交所述第一事務(wù)的模塊,其中,提交所述第一事務(wù)包括: 響應(yīng)于所述第一局部事務(wù)值小于所述全局事務(wù)值,而驗(yàn)證所述第一事務(wù)中的每個(gè)讀操作,包括所述多個(gè)先前的讀操作和所述當(dāng)前的讀操作; 將所述全局事務(wù)值遞增為遞增后的全局事務(wù)值,以表示所述第一事務(wù)是最近提交的事務(wù);以及 將所述元數(shù)據(jù)單元更新為至少遞增后的全局時(shí)間戳值,以指示所述第一事務(wù)是已經(jīng)更新了所述元數(shù)據(jù)單元的最近的事務(wù)。
6.如權(quán)利要求1所述的裝置,其中,用于驗(yàn)證所述第一事務(wù)中的多個(gè)先前的讀操作的驗(yàn)證模塊包括:用于響應(yīng)于與所述多個(gè)先前的讀操作相關(guān)聯(lián)的多個(gè)已記錄版本對(duì)應(yīng)于與所述多個(gè)先前的讀操作相關(guān)聯(lián)的多個(gè)當(dāng)前版本,而確定所述多個(gè)先前的讀操作有效的模塊。
7.一種用于提供按需事務(wù)驗(yàn)證的裝置,包括: 用于在一事務(wù)中的加載操作執(zhí)行之前,確定來自與所述加載操作所涉及的地址相關(guān)聯(lián)的元數(shù)據(jù)單元的當(dāng)前版本的模塊,其中,所述事務(wù)包括多個(gè)分組的操作,并且其中,在所述事務(wù)被提交之前不使來自所述多個(gè)分組的操作的更新在所述事務(wù)外部是全局可見的; 用于將所述當(dāng)前版本記錄為已記錄版本的模塊;以及 用于在執(zhí)行所述加載操作之后并且在嘗試提交所述事務(wù)之前進(jìn)行以下操作的模塊:確定來自與所述地址相關(guān)聯(lián)的所述元數(shù)據(jù)單元的后續(xù)版本,以及響應(yīng)于所述后續(xù)版本不同于指示自確定來自所述元數(shù)據(jù)單元的所述當(dāng)前版本后已向所述地址寫入一事務(wù)的所述已記錄版本,而中止所述事務(wù)。
8.一種用于提供按需事務(wù)驗(yàn)證的裝置,包括: 用于檢測(cè)機(jī)器中保持的程序代碼中的事務(wù)的模塊; 用于在所述事務(wù)開始處插入第一指令的模塊,所述第一指令在執(zhí)行時(shí)用于把要與所述事務(wù)相關(guān)聯(lián)的局部變量初始化為表示最近提交的事務(wù)的值的全局變量的值; 用于檢測(cè)所述第一事務(wù)中涉及一地址的加載操作的模塊; 用于在所述加載操作之前插入對(duì)讀屏障函數(shù)的調(diào)用的模塊;以及用于在所述加載操作之后并且在所述事務(wù)的提交點(diǎn)之前插入對(duì)版本檢查函數(shù)的調(diào)用的模塊。
9.如權(quán)利要求8所述的裝置,進(jìn)一步包括: 用于確定保持在與所述地址相關(guān)聯(lián)的元數(shù)據(jù)單元中的第一版本的模塊; 用于確定所述第一版本是否大于局部時(shí)間戳的模塊; 用于響應(yīng)于所述第一版本大于所述局部時(shí)間戳而進(jìn)行以下操作的模塊:將全局時(shí)間戳重新加載到所述局部時(shí)間戳中;確定所述第一事務(wù)中的多個(gè)先前的讀操作是否有效;以及響應(yīng)于所述第一事務(wù)中的所述多個(gè)先前的讀操作之一無效,而中止所述第一事務(wù);以及用于記錄所述第一版本的模塊。
10.如權(quán)利要求9所述的裝置,進(jìn)一步包括: 用于確定保持在與所述地址相關(guān)聯(lián)的版本單元中的第二版本的模塊; 用于確定所述第二版本是否不同于所述第一版本的模塊;以及 用于響應(yīng)于所述第二版本不同于所述第一版本,而中止所述第一事務(wù)的模塊。
11.如權(quán)利要求10所述的裝置,進(jìn)一步包括:用于檢測(cè)所述第一事務(wù)中涉及所述地址的存儲(chǔ)操作的模塊;用于在所述存儲(chǔ)操作之前插入對(duì)寫屏障函數(shù)的調(diào)用的模塊,所述寫屏障函數(shù)在執(zhí)行時(shí)用于獲取針對(duì)所述地址的鎖。
12.如權(quán)利要求11所述的裝置,進(jìn)一步包括: 用于檢測(cè)所述第一事務(wù)中的提交指令的模塊; 用于響應(yīng)于檢測(cè)到所述提交指令,而插入對(duì)提交函數(shù)的調(diào)用的模塊,其中,所述提交函數(shù)在執(zhí)行時(shí)用于:確定所述局部時(shí)間戳是否小于所述全局時(shí)間戳;響應(yīng)于所述局部時(shí)間戳小于所述全局時(shí)間戳,而確定所述第一事務(wù)中的所述多個(gè)先前的讀操作是否有效;以及響應(yīng)于所述第一事務(wù)中的所述多個(gè)先前的讀操作之一無效,而中止所述第一事務(wù);將所述全局時(shí)間戳遞增為遞增后的全局時(shí)間戳;將與所述地址相關(guān)聯(lián)的所述版本單元修改為所述遞增后的全局時(shí)間戳。
全文摘要
在此描述了一種用于軟件事務(wù)存儲(chǔ)器(STM)系統(tǒng)中的高效且一致的驗(yàn)證/沖突檢測(cè)的方法和裝置。在加載操作之后插入版本檢查屏障,以比較加載操作前后的加載值的版本。另外,全局時(shí)間戳(GTS)被用來跟蹤最新提交的事務(wù)。每個(gè)事務(wù)都與在事務(wù)開始時(shí)被初始化為GTS值的局部時(shí)間戳(LTS)相關(guān)聯(lián)。隨著事務(wù)提交,將GTS更新為新值并將所修改的單元的版本設(shè)置為該新值。未決事務(wù)將在讀屏障中確定的版本與它們的LTS進(jìn)行比較。如果該版本大于它們的LTS,這指示出另一事務(wù)已在未決事務(wù)開始且初始化LTS之后被提交,則該未決事務(wù)驗(yàn)證其讀集以保持高效且一致的事務(wù)執(zhí)行。
文檔編號(hào)G06F9/46GK103150206SQ20121056755
公開日2013年6月12日 申請(qǐng)日期2007年12月28日 優(yōu)先權(quán)日2006年12月28日
發(fā)明者B·薩哈, A-R·阿德-塔巴塔巴伊, C·王, Y·吳, W-Y·陳 申請(qǐng)人:英特爾公司