本公開涉及數(shù)據(jù)處理領(lǐng)域,并且更具體地關(guān)于數(shù)據(jù)處理裝置中對事務(wù)的使用。
背景技術(shù):
在多處理器系統(tǒng)中,確保各個(gè)處理設(shè)備之間的協(xié)調(diào)通常是必要的。例如,考慮以下情況:處理器A和處理器B二者都嘗試將共享資源(例如,一個(gè)人的銀行余額值)減少10。如果此人的銀行余額值初始為100,則進(jìn)行正確處理后,共享值應(yīng)該減少到80(100-10-10)。然而,如果處理器A和B各自同時(shí)得到當(dāng)前值,則每個(gè)處理器可以執(zhí)行計(jì)算并且將新值(90)同時(shí)寫回共享處理器中。因此,由于缺乏協(xié)調(diào),兩個(gè)事務(wù)中的一個(gè)事務(wù)已經(jīng)被另一事務(wù)掩蔽或覆寫。
可以使用鎖定(lock)以便確保每次僅單個(gè)執(zhí)行代理(處理器或線程)可以訪問共享資源??紤]上面的示例,用戶的銀行余額是共享資源并且因此可以將鎖定應(yīng)用到該數(shù)據(jù)值以確保一次僅一個(gè)處理器可以讀取和修改該值。如果進(jìn)行了正確的寫操作,則這類鎖定可用于防止事務(wù)彼此覆寫并且可用于確保對共享資源的訪問跨所有代理被協(xié)調(diào)。換句話說,這有助于防止一個(gè)代理在共享資源的舊版本上執(zhí)行操作的情況。使用鎖定的劣勢在于被保護(hù)的粒度等級。例如,考慮鏈表。在鏈表中,每個(gè)元素提供數(shù)據(jù)值以及指向列表中的下一元素的指針。當(dāng)多個(gè)代理可能尋求對這類鏈表的修改訪問時(shí),期望鎖定對列表的訪問以便防止元素之一不再指向列表中下一元素的情況-使得列表中斷。一個(gè)選項(xiàng)是為整個(gè)列表提供鎖定。然而,如果一個(gè)代理希望修改列表的頭部并且另一代理希望修改列表的尾部,則該鎖定是不必要的限制-由這兩個(gè)代理進(jìn)行的編輯不太可能互相干擾。另一選項(xiàng)是為列表的各個(gè)元素提供鎖定。然而,在大列表的情況下這可能要求大量的鎖定,每個(gè)鎖定在存儲器中都要求其自己的存儲。鎖定還有這樣的劣勢:其可以引起死鎖。例如,如果兩個(gè)代理各自要求對由鎖定保護(hù)的兩個(gè)共享數(shù)據(jù)資源的訪問,并且兩個(gè)代理中的每個(gè)代理針對這兩個(gè)共享數(shù)據(jù)資源之一持有鎖定,則系統(tǒng)進(jìn)入死鎖。換句話說,兩個(gè)代理都不能繼續(xù)進(jìn)行并且將永遠(yuǎn)等待另一代理釋放其所需的鎖定。
一個(gè)解決方案是使用事務(wù)而不是鎖定。當(dāng)事務(wù)開始時(shí),處理器進(jìn)入特殊執(zhí)行模式。在該模式中時(shí),系統(tǒng)追蹤讀和寫。如果確定(例如,在多個(gè)代理之間)存在沖突,則代理之一將被消滅和回滾,例如其改變將被撤銷。如果未發(fā)生任何沖突,則這些代理繼續(xù)直到其完成(此時(shí)做出的改變被提交)。因此事務(wù)被認(rèn)為是一系列操作,這一系列操作被視為單個(gè)原子操作,直到該事務(wù)被提交為止(單個(gè)操作),整個(gè)事務(wù)對其它代理不可見并且甚至可以通過回滾由這一個(gè)代理撤銷或倒回。
在一些系統(tǒng)中,執(zhí)行事務(wù)可能要求每個(gè)架構(gòu)寄存器被保存以便那些寄存器在回滾的情況下被恢復(fù)到其原始值。一些架構(gòu)可以包括大量寄存器,并且因此在這類系統(tǒng)中,保存所有那些寄存器的值可能是必要的。然而,這類方法是浪費(fèi)的,這是由于其涉及保存事務(wù)內(nèi)從未被修改的數(shù)據(jù)。在該情況下,數(shù)據(jù)被不必要地存儲,因此既消耗了存儲空間(為了存儲值)也消耗了時(shí)間(為了在物理上復(fù)制數(shù)據(jù)值)。此外,如果發(fā)生回滾,則所有保存的寄存器必須恢復(fù)其值,即使那些數(shù)據(jù)值尚未被修改。因此,如果發(fā)生回滾,則在恢復(fù)所有存儲的數(shù)據(jù)值中可能浪費(fèi)更多的時(shí)間。此外,與在發(fā)生回滾的情況下恢復(fù)所有那些存儲的數(shù)據(jù)值相關(guān)聯(lián)的功率消耗也最好被避免。
作為替代,對用戶和/或編譯器來說指定在事務(wù)期間將被修改的那些寄存器是可能的。在該情況下,僅所指定的寄存器被保存,并且在發(fā)生回滾的情況下僅那些寄存器將被恢復(fù)。然而,不可能一直預(yù)測到特定寄存器是否將在事務(wù)中使用。例如,事務(wù)可以包括對庫函數(shù)的一個(gè)或多個(gè)調(diào)用。用戶或程序員對這類庫函數(shù)可能幾乎不具有控制,并且甚至可能無法了解庫函數(shù)如何工作。在這類情況下,當(dāng)事務(wù)啟動時(shí),用戶不知道哪些寄存器必須被保存。因此,用戶要么必須保存所有寄存器,要么則可能繼續(xù)伴隨以下情況:回滾將由于未保存的寄存器被修改而失敗。
技術(shù)實(shí)現(xiàn)要素:
從第一示例配置來看,提供了一種數(shù)據(jù)處理裝置,包括:多個(gè)數(shù)據(jù)存儲元件,每個(gè)數(shù)據(jù)存儲元件被配置為存儲數(shù)據(jù);掩碼存儲電路,被配置為存儲掩碼;處理電路,被配置為執(zhí)行一個(gè)或多個(gè)指令;數(shù)據(jù)保存器,被配置為:響應(yīng)于事務(wù)啟動指令,選擇數(shù)據(jù)存儲元件的子集并且保存數(shù)據(jù)存儲元件的子集的備份;掩碼控制電路,被配置為更新掩碼以指示由數(shù)據(jù)保存器選擇的數(shù)據(jù)存儲元件的子集;以及監(jiān)測器,被配置為檢測對數(shù)據(jù)存儲元件中未由掩碼指示的數(shù)據(jù)存儲元件的寫入。
根據(jù)第二示例配置,提供給了一種數(shù)據(jù)處理裝置,包括:用于存儲數(shù)據(jù)的多個(gè)裝置;用于存儲掩碼的掩碼存儲裝置;用于執(zhí)行一個(gè)或多個(gè)指令的處理裝置;用于響應(yīng)于事務(wù)啟動指令,選擇用于存儲數(shù)據(jù)的多個(gè)裝置的子集并且用于保存由用于存儲數(shù)據(jù)的多個(gè)裝置的子集存儲的數(shù)據(jù)的備份的數(shù)據(jù)保存裝置;用于更新掩碼以指示由數(shù)據(jù)保存裝置選擇的用于存儲數(shù)據(jù)的多個(gè)裝置的子集的掩碼控制裝置;以及用于檢測對用于存儲數(shù)據(jù)的多個(gè)裝置中未由掩碼指示的裝置的寫入的監(jiān)測裝置。
根據(jù)第三示例配置,提供給了一種用于在數(shù)據(jù)處理裝置中進(jìn)行數(shù)據(jù)處理的方法,該數(shù)據(jù)處理裝置包括用于存儲數(shù)據(jù)的多個(gè)數(shù)據(jù)存儲元件,所述方法包括以下步驟:響應(yīng)于事務(wù)啟動指令,選擇數(shù)據(jù)存儲元件的子集;以及保存由數(shù)據(jù)存儲元件的子集存儲的數(shù)據(jù)的備份;更新掩碼以指示數(shù)據(jù)存儲元件的子集;以及檢測對數(shù)據(jù)存儲元件中未由所述掩碼指示的數(shù)據(jù)存儲元件的寫入。
附圖說明
將僅通過示例方式參照附圖中所示的本技術(shù)的實(shí)施例來進(jìn)一步描述本技術(shù),在附圖中:
圖1是在一個(gè)實(shí)施例中示出包括數(shù)據(jù)處理裝置的系統(tǒng)的概覽;
圖2在一個(gè)實(shí)施例中示出了描述構(gòu)成數(shù)據(jù)處理裝置的組件的電路圖;
圖3在一個(gè)實(shí)施例中示出了描述構(gòu)成數(shù)據(jù)處理裝置的組件的電路圖;
圖4以流程圖的形式示出了根據(jù)一個(gè)實(shí)施例使用數(shù)據(jù)處理裝置的方法;
圖5是指示可以如何使用啟發(fā)以便選擇在事務(wù)開始時(shí)保存的寄存器的集合的流程圖。
具體實(shí)施方式
從第一示例配置來看,提供了一種數(shù)據(jù)處理裝置,包括:多個(gè)數(shù)據(jù)存儲元件,每個(gè)數(shù)據(jù)存儲元件被配置為存儲數(shù)據(jù);掩碼存儲電路,被配置為存儲掩碼(mask);處理電路,被配置為執(zhí)行一個(gè)或多個(gè)指令;數(shù)據(jù)保存器,被配置為:響應(yīng)于事務(wù)啟動指令,選擇數(shù)據(jù)存儲元件的子集并且保存數(shù)據(jù)存儲元件的子集的備份;掩碼控制電路,被配置為更新掩碼以指示由數(shù)據(jù)保存器選擇的數(shù)據(jù)存儲元件的子集;以及監(jiān)測器,被配置為檢測對數(shù)據(jù)存儲元件中未由掩碼指示的數(shù)據(jù)存儲元件的寫入。
響應(yīng)于事務(wù)啟動指令(指示事務(wù)將開始),掩碼存儲電路保存(備份)數(shù)據(jù)存儲元件的子集。這些數(shù)據(jù)存儲元件可以例如是數(shù)據(jù)處理裝置中的寄存器。將理解的是,這類數(shù)據(jù)存儲元件還可以采取寄存器文件、影子寄存器文件、以及各種類型的存儲器構(gòu)造(包括例如緩存和內(nèi)部便箋本存儲器)的形式。然后掩碼被存儲,掩碼指示數(shù)據(jù)存儲元件中的哪些存儲元件已經(jīng)被保存。應(yīng)該理解的是詞“子集”在這里用于表示“少于所有”數(shù)據(jù)存儲元件的全集。在事務(wù)期間,處理器執(zhí)行一個(gè)或多個(gè)指令。監(jiān)測器檢測對未由掩碼指示的數(shù)據(jù)存儲元件的寫嘗試(即,對尚未保存或備份的數(shù)據(jù)存儲元件的寫嘗試)。例如,監(jiān)測器可以檢查引起對數(shù)據(jù)存儲元件的寫入的那些指令或可以截聽由處理電路發(fā)送到數(shù)據(jù)存儲元件的信號。注意,貫穿該說明書,術(shù)語“寫”旨在既指代對數(shù)據(jù)存儲元件的實(shí)際寫入也指代來自處理器的寫入那些數(shù)據(jù)存儲器元件的請求。如果這類寫或?qū)憞L試被允許繼續(xù)進(jìn)行,則事務(wù)機(jī)制本身將失敗,因?yàn)闊o任何回滾將是可能的(由于將做出對數(shù)據(jù)存儲元件的無法恢復(fù)的寫入)。因此,數(shù)據(jù)處理裝置(憑借監(jiān)測器)能夠檢測這類寫入并且可以在適當(dāng)?shù)那闆r下采取適當(dāng)?shù)膭幼?。因此,不論事?wù)將何時(shí)開始,保存或備份每個(gè)單個(gè)寄存器是不必要的,并且用戶不需要關(guān)心事務(wù)機(jī)制由于對尚未保存或備份的數(shù)據(jù)存儲元件做出寫嘗試而失敗的可能性。
由數(shù)據(jù)處理裝置響應(yīng)于檢測到對未由掩碼指示的數(shù)據(jù)存儲元件的寫入的嘗試而采取的動作可以采用若干不同形式,下面給出了其中的示例,并且這些示例可以單獨(dú)存在或以組合形式存在。
例如,數(shù)據(jù)處理裝置可以包括抑制器電路,被配置為抑制對數(shù)據(jù)存儲元件中未由掩碼指示的數(shù)據(jù)存儲元件的寫入。在這類實(shí)施例中,如果做出寫入尚未備份的數(shù)據(jù)存儲元件的嘗試,則執(zhí)行寫入的嘗試可以簡單地被阻塞。這可以通過監(jiān)測器防止由處理器發(fā)出的寫請求到達(dá)數(shù)據(jù)存儲元件來實(shí)現(xiàn)。在一些實(shí)施例中,監(jiān)測器還可以向處理器發(fā)送寫嘗試已失敗的信號,這可以使得處理器能夠采取其自己的校正動作-例如,通過執(zhí)行異常處理例程。
作為另一示例,數(shù)據(jù)處理裝置可以包括恢復(fù)器,被配置為從備份中恢復(fù)由掩碼指示的數(shù)據(jù)存儲元件。因此,如果做出寫入尚未備份的數(shù)據(jù)存儲元件的嘗試,則所有數(shù)據(jù)存儲元件可以被恢復(fù)到其之前的值。在一些情況下,更新器(例如被實(shí)現(xiàn)為更新電路)還可以更新程序計(jì)數(shù)器以指示事務(wù)啟動指令或錯(cuò)誤處置器(handler)。由于返回程序計(jì)數(shù)器并且恢復(fù)數(shù)據(jù)存儲元件的結(jié)果,引起對事務(wù)的完全回滾(rollback)。因此,事務(wù)可以被迫再次開始。通過改變程序計(jì)數(shù)器以指示錯(cuò)誤處置器,執(zhí)行特殊錯(cuò)誤處理代碼是可能的。這可用于輸出診斷信息。
作為另一示例,監(jiān)測器可以被配置為響應(yīng)于檢測到對數(shù)據(jù)存儲元件中未由掩碼指示的數(shù)據(jù)存儲元件的寫入而發(fā)送錯(cuò)誤信號。例如,信號可以被發(fā)送到處理器。處理器可以具有用于處理這類情況的專用子例程。替代地,處理器可以發(fā)送異常信號并且軟件本身可以包括用于處理該情況的異常處理例程。這可以允許關(guān)于如何繼續(xù)事務(wù)的完整靈活性。例如,如果事務(wù)已經(jīng)失敗若干次,則事務(wù)可以簡單地被回滾并且被拋棄。如果事務(wù)的故障是不重要的(例如,數(shù)據(jù)值它們本身不是關(guān)鍵的),則軟件可以被允許繼續(xù)甚至無回滾。在其它情況下,事務(wù)可以被回滾并且被迫再次開始,這次使得額外的寄存器被保存。
數(shù)據(jù)存儲元件可以由數(shù)據(jù)保存器基于由數(shù)據(jù)處理裝置執(zhí)行的啟發(fā)式(例如,基于經(jīng)驗(yàn)的)分析來選擇。具體地,通過使用啟發(fā)(heuristic)或統(tǒng)計(jì),數(shù)據(jù)保存器可以選擇要被保存(備份)的那些數(shù)據(jù)存儲元件。在這類情況下,對程序員來說明確示出必須被備份的那些數(shù)據(jù)存儲元件可能是不必要的,這降低了程序員的負(fù)擔(dān)并且可適用于在庫被程序員調(diào)用時(shí)以及程序員不清楚哪些數(shù)據(jù)存儲元件必須被備份的地方使用。
啟發(fā)式分析可以依賴由編譯器注釋的數(shù)據(jù)。例如,在編譯期間,編譯器可以提供提示(即指示),提示可以由數(shù)據(jù)保存器用于確定哪些數(shù)據(jù)存儲元件應(yīng)該被保存。
啟發(fā)式分析可以依賴于與一個(gè)或多個(gè)指令相關(guān)聯(lián)的調(diào)用約定。調(diào)用約定可以由特定架構(gòu)指示,并且可以指定在函數(shù)調(diào)用中數(shù)據(jù)應(yīng)該如何在調(diào)用方和被調(diào)用方之間交換。具體地,調(diào)用約定可以指示參數(shù)將如何被傳遞(例如,使用特定數(shù)據(jù)存儲元件或堆棧)并且結(jié)果將如何被返回。該信息可用于預(yù)測在啟動事務(wù)之前必須被保存或很可能必須被保存的那些數(shù)據(jù)存儲元件。
啟發(fā)式分析可以依賴于監(jiān)測器已檢測到對數(shù)據(jù)存儲元件中未由掩碼指示的數(shù)據(jù)存儲元件的寫入的次數(shù)。例如,如果事務(wù)由于對尚未保存的寄存器的寫入而被重復(fù)回滾,則由數(shù)據(jù)保存器選擇的用于保存的數(shù)據(jù)存儲元件可以變化,以便需求降低未來事務(wù)將回滾的可能性。例如,所選擇的數(shù)據(jù)存儲元件的子集可以響應(yīng)于監(jiān)測器檢測到對數(shù)據(jù)存儲元件中未由掩碼指示的數(shù)據(jù)存儲元件的寫入而增加。例如,每當(dāng)監(jiān)測器檢測到對寫入尚未保存的數(shù)據(jù)存儲元件的嘗試時(shí),回滾可以發(fā)生,并且與之前的迭代相比額外的寄存器可以被保存。在其它實(shí)施例中,被保存的寄存器的數(shù)目可以更快增加以便限制發(fā)生的回滾的數(shù)目。然而,這必須與增加的不必要地保存寄存器的風(fēng)險(xiǎn)相平衡。
要保存的數(shù)據(jù)存儲元件的子集可以由數(shù)據(jù)保存器響應(yīng)于子集定義指令來選擇。例如,用戶可以提供關(guān)于哪些數(shù)據(jù)存儲元件應(yīng)該被保存的“最佳猜測”。這類方法作為確定要備份哪些數(shù)據(jù)存儲元件的初始啟動點(diǎn)可能是有用的。如果用戶已獲取關(guān)于被調(diào)用的庫的工作的知識,這類方法可能是特別有用的。
數(shù)據(jù)存儲元件可以是多個(gè)寄存器。
監(jiān)測器可以包括監(jiān)測電路。監(jiān)測電路可以攔截由處理器向數(shù)據(jù)存儲元件發(fā)出的信號。在其它實(shí)施例中,監(jiān)測器可以通過監(jiān)測軟件來實(shí)現(xiàn),并且可以監(jiān)測被執(zhí)行的指令以便在處理器執(zhí)行該指令之前確定指令是否將引起對尚未保存(即不是掩碼的一部分)的數(shù)據(jù)存儲元件的寫入。
數(shù)據(jù)保存器可以包括數(shù)據(jù)保存電路,即被配置為執(zhí)行所述數(shù)據(jù)保存功能的特定電路。然而,數(shù)據(jù)保存器可以通過數(shù)據(jù)保存軟件來實(shí)現(xiàn),數(shù)據(jù)保存軟件明確使得數(shù)據(jù)存儲元件被備份或保存到特定位置。
數(shù)據(jù)保存器可以被配置為將數(shù)據(jù)存儲元件的子集的備份保存到本地緩存。通過使用本地緩存,隔離由其它代理做出的改變直到改變被提交的時(shí)間這是可能的。這是重要的,因?yàn)橹钡礁淖儽惶峤?,改變不可以被其它代理看到。該隔離可以通過使用本地緩存并且通過在相關(guān)聯(lián)的緩存行條目上提供適當(dāng)?shù)臉?biāo)簽(以指示該緩存行條目不應(yīng)該被允許由其它處理器取回)來實(shí)現(xiàn)。
在一些實(shí)施例中,掩碼既指示將要保存的寄存器的集合,也指示將不保存的寄存器的集合;并且其中數(shù)據(jù)保存器通過包括將要保存的寄存器的集合中標(biāo)識的存儲元件并且排除將不保存的寄存器的集合中標(biāo)識的存儲元件來選擇數(shù)據(jù)存儲元件。因此,指示將不保存其值的寄存器的集合是可能的。然而,由于那些寄存器仍由掩碼指示,因此寫入那些寄存器將不引起任何特殊行為發(fā)生。這類寄存器因此可用于通信目的,例如到外界的通信。
圖1示出了包括兩個(gè)數(shù)據(jù)處理裝置102、104的系統(tǒng),每個(gè)數(shù)據(jù)處理裝置包括相應(yīng)的處理器核100、130,并且每個(gè)數(shù)據(jù)處理裝置具有相關(guān)聯(lián)的寄存器集合(對處理器核來說是本地的)。處理器核100、130中的每個(gè)處理器核還具有相關(guān)聯(lián)的本地緩存110、140。換句話說,一個(gè)處理器核可能無法訪問與另一處理器核相關(guān)聯(lián)的緩存。緩存110、140中的每個(gè)緩存可以互相通信(為了一致的目的)并且可以經(jīng)由存儲器總線150與共享存儲器120通信。共享或主存儲器120包括可以由處理器核100、130訪問的一個(gè)或多個(gè)共享數(shù)據(jù)結(jié)構(gòu)(共享資源)。由于處理器核100、130中的每個(gè)處理器核可以訪問主存儲器120中擁有的同一共享數(shù)據(jù)結(jié)構(gòu),因此系統(tǒng)使用事務(wù)以便在處理器核之間提供協(xié)調(diào)并且?guī)椭乐挂粋€(gè)處理器核做出的修改被另一處理器核做出的修改“覆寫”。
圖2示出了處理器核100的實(shí)施例。處理電路160執(zhí)行數(shù)據(jù)處理指令。那些指令之一可用于指示事務(wù)將開始。響應(yīng)于接收到這類指令,處理電路160向數(shù)據(jù)保存電路170發(fā)送信號以保存寄存器文件180中的寄存器的子集190。掩碼200還可以由掩碼控制電路210更新以表示寄存器的子集190。在該示例中,子集190包括寄存器r0、r1和r2。因此,掩碼可以包含值11100000,從而指示子集包括寄存器文件180中的八個(gè)寄存器的前三個(gè)寄存器。當(dāng)然,將理解的是在包括更大或不同數(shù)目寄存器的寄存器文件中,掩碼的尺寸將是適當(dāng)?shù)囊员惴从臣拇嫫髦心男┘拇嫫鳂?gòu)成已經(jīng)由數(shù)據(jù)保存電路170保存的寄存器的子集。處理器核100還包括監(jiān)測電路220,監(jiān)測電路220(在功能上)位于處理電路160和寄存器文件180之間。監(jiān)測電路220攔截由處理電路160向寄存器文件180發(fā)出的寫請求。換句話說,如果處理電路160發(fā)送對寄存器文件180中的寄存器進(jìn)行寫入的信號,則該信號將首先由監(jiān)測電路220接收。監(jiān)測電路220然后將通過經(jīng)由轉(zhuǎn)換器230轉(zhuǎn)換掩碼200來與尚未由數(shù)據(jù)保存電路保存的寄存器的集合進(jìn)行比較。如果由處理電路160發(fā)出并在監(jiān)測電路220處接收的寫請求不是去往已由數(shù)據(jù)保存電路170保存的寄存器之一,則監(jiān)測電路作出反應(yīng)。例如,在該實(shí)施例中,監(jiān)測電路向處理電路160發(fā)出警告信號。然而,如果由處理電路160發(fā)出的寫請求(信號)是去往已經(jīng)由數(shù)據(jù)保存電路170保存的寄存器之一,則請求可以被允許通過監(jiān)測電路220繼續(xù)到寄存器文件180以便完成寫入。
在一些其它實(shí)施例中,掩碼可以額外地標(biāo)識將未保存(即不保存)的寄存器的集合。這類寄存器不被數(shù)據(jù)保存電路170保存,然而由于這些寄存器仍然由掩碼標(biāo)識,因此如果這些寄存器被寫入,則監(jiān)測電路220將不作出反應(yīng)。這些寄存器未被備份,但是可以被寫入而無需監(jiān)測電路170執(zhí)行一些特殊行為(例如,引發(fā)錯(cuò)誤、中斷或重啟)。這類寄存器因此可用于例如到外界的通信。例如,中斷事務(wù)可以使用這類寄存器來傳送事務(wù)被中斷的原因。
在這些實(shí)施例中,寄存器因此可以落入三種不同情況之一。在第一種情況中,寄存器可以由掩碼指示為要被保存的寄存器。這類寄存器被備份并且必要的話可以被回滾。在第二種情況下,寄存器可以完全未由掩碼指示。如果這類寄存器在事務(wù)期間被寫入,則一些種類的特殊行為可以由監(jiān)測電路170發(fā)起。例如,事務(wù)可以中斷、系統(tǒng)可以重啟、或可以引發(fā)錯(cuò)誤等。在第三種情況下,寄存器可以由掩碼指示為未保存的寄存器。這類寄存器不被備份并且不能被回滾。然而,如果這類寄存器被寫入,則監(jiān)測電路170將不采取特殊動作。
圖3示出了包括處理器核100和本地緩存110的數(shù)據(jù)處理裝置102的實(shí)施例。相同標(biāo)號已用于指示已描述的特征。
在所示出的實(shí)施例中,數(shù)據(jù)保存電路170包括啟發(fā)式分析器240。啟發(fā)式分析器監(jiān)測數(shù)據(jù)保存電路在對將被保存或備份到本地緩存110的寄存器的子集190的選擇中的正在進(jìn)行的成功或失敗。存在可以在確定子集190時(shí)由啟發(fā)式分析器240考慮的若干不同啟發(fā)或統(tǒng)計(jì)。例如,該實(shí)施例基于監(jiān)測電路截聽處理電路160對寫入寄存器文件180中不是子集190的一部分的寄存器的嘗試的次數(shù)來考慮啟發(fā)。具體地,每當(dāng)處理電路160嘗試寫入寄存器文件180中尚未保存到緩存的寄存器(即,不是子集190的一部分的寄存器)時(shí),計(jì)數(shù)器250被增加。當(dāng)數(shù)據(jù)保存電路170確定應(yīng)該被保存的寄存器時(shí),計(jì)數(shù)器250的值被考慮。按這種方式,隨著處理電路160做出更多寫入寄存器文件180中尚未保存的寄存器的請求,數(shù)據(jù)保存電路170將通過保存寄存器的更大子集來進(jìn)行響應(yīng)。
啟發(fā)式分析器240還可以考慮諸如與由處理電路160執(zhí)行的指令相關(guān)聯(lián)的調(diào)用約定之類的啟發(fā)。調(diào)用約定指定在函數(shù)調(diào)用期間數(shù)據(jù)在調(diào)用方和被調(diào)用方之間傳遞數(shù)據(jù)的方法和方式。例如,調(diào)用約定可以指定使用寄存器的特定組合或使用堆棧來傳遞的參數(shù)。類似地,調(diào)用約定可以指示函數(shù)調(diào)用的結(jié)果將如何被返回。該信息可以被使用以便更好地預(yù)測更可能由處理電路160寫入的寄存器。例如,如果調(diào)用約定指示第一參數(shù)通常使用寄存器r0來傳遞,則更可能的是:寄存器r0有可能在某一時(shí)刻由處理電路160被寫入。因此,啟發(fā)式分析器240可以確定寄存器r0通常應(yīng)該構(gòu)成所選擇的子集的一部分。
由啟發(fā)式分析器考慮的啟發(fā)的另一示例可以是由編譯器在將源代碼編譯到處理電路160的指令期間提供的提示。由于編譯器對源代碼具有可視性,因此編譯器能夠提供對必須由數(shù)據(jù)保存電路170保存的那些寄存器的良好指示。注意,然而這并不總是可能的,這是由于源代碼可以參考編譯器不可視的庫或外部代碼源。因此,由編譯器提供的提示可能不總是完全的。
類似地,經(jīng)編譯的應(yīng)用可以給出對不應(yīng)該由數(shù)據(jù)保存電路170保存的寄存器的指示。這可用于推翻由啟發(fā)式分析器240聚集的啟發(fā)或統(tǒng)計(jì)、或者數(shù)據(jù)保存電路170可以被配置為保存除由經(jīng)編譯的應(yīng)用指示的那些寄存器外的所有寄存器。
應(yīng)該理解的是,各種不同啟發(fā)(包括這里未明確提到但對技術(shù)人員已知的另外的示例)可以按任意組合由啟發(fā)式分析器240來考慮。啟發(fā)式分析器240還可以以各種方式結(jié)合不同的啟發(fā)以便產(chǎn)生關(guān)于將被保存的寄存器的子集190的最終結(jié)論。
監(jiān)測和抑制電路320被提供來監(jiān)測處理電路160對寄存器文件180的寫入的嘗試。監(jiān)測和抑制電路320被配置為使得:監(jiān)測從處理電路160到寄存器文件180的寫請求,同時(shí)由處理電路160發(fā)送到寄存器文件180的與尚未由數(shù)據(jù)保存電路170保存(備份)的寄存器有關(guān)的信號被抑制。換句話說,該信號被忽略并且未被轉(zhuǎn)發(fā)到寄存器文件180。
此外,響應(yīng)于檢測到去往寄存器文件180中尚未由數(shù)據(jù)保存電路170保存的寄存器的寫請求,寄存器文件180內(nèi)擁有的程序計(jì)數(shù)器270由更新器260更新。程序計(jì)數(shù)器270被用于指示下一個(gè)要由處理電路160執(zhí)行的指令。因此,通過使用更新器260更新程序計(jì)數(shù)器270,在監(jiān)測和抑制電路320檢測到處理電路160嘗試寫入不是子集190的一部分的寄存器的情況下重啟事務(wù)或整個(gè)跳過事務(wù)是可能的。在該實(shí)施例中,還提供了數(shù)據(jù)恢復(fù)電路280,以使得如果做出寫入不是子集190的一部分的寄存器的嘗試,則從緩存中恢復(fù)已經(jīng)被保存的那些寄存器。換句話說,被備份的寄存器被重置到其初始值。因此通過數(shù)據(jù)恢復(fù)電路280和更新器260,進(jìn)行有效的回滾是可能的。也就是說,響應(yīng)于監(jiān)測和抑制電路320檢測到處理電路160正嘗試寫入不是子集190的一部分的寄存器(即,尚未保存的寄存器),寫請求被監(jiān)測和抑制電路320抑制,程序計(jì)數(shù)器270由更新器260重置到事務(wù)開始時(shí)的指令的值,并且數(shù)據(jù)恢復(fù)電路280將寄存器的子集190的值恢復(fù)到在事務(wù)開始時(shí)那些寄存器具有的值。換句話說,數(shù)據(jù)處理裝置的狀態(tài)被重置到事務(wù)開始時(shí)的點(diǎn)。在其它實(shí)施例中,響應(yīng)于監(jiān)測和抑制電路320檢測到處理電路160正嘗試寫入不是子集190的一部分的寄存器,程序計(jì)數(shù)器可以被更新以指代錯(cuò)誤處理例程。這類錯(cuò)誤處理例程可以定義當(dāng)做出寫入不是子集190的一部分的寄存器的嘗試時(shí)要執(zhí)行的特殊行為。
圖4根據(jù)一個(gè)實(shí)施例以流程圖的形式示出了執(zhí)行事務(wù)的方法。在步驟S200處,事務(wù)開始。這可以由于處理電路160接收到事務(wù)啟動指令而發(fā)生。然而,如果滿足特定條件,事務(wù)還可以由硬件發(fā)起。在步驟S210處,選擇數(shù)據(jù)存儲元件的子集。數(shù)據(jù)存儲元件可以是例如寄存器文件180中的寄存器。存在很多可以選擇數(shù)據(jù)存儲元件的集合的方式。選擇這些數(shù)據(jù)存儲元件的集合的一個(gè)方式是通過使用啟發(fā),啟發(fā)將稍后參照圖5被示出。然而,數(shù)據(jù)存儲元件被選擇,在步驟S220處進(jìn)行備份。在一些實(shí)施例中,備份可以通過將那些數(shù)據(jù)存儲元件的值寫入緩存110中來實(shí)現(xiàn)。然而,將理解的是,其它形式的數(shù)據(jù)存儲同樣是可以接受的。掩碼200然后被更新以便反映在步驟S230處已經(jīng)被保存的數(shù)據(jù)存儲元件的子集。事務(wù)然后通過處理電路繼續(xù)執(zhí)行一個(gè)或多個(gè)指令。如果在該指令序列期間的任意階段,做出對未由掩碼指示的數(shù)據(jù)存儲元件的寫或?qū)憞L試,則這在步驟S240處被檢測到并且流程繼續(xù)到步驟S250,在S250中執(zhí)行一些動作。在該實(shí)施例中,用信號發(fā)送錯(cuò)誤。然而,將理解的是,在其它實(shí)施例中,其它響應(yīng)可以是適當(dāng)?shù)幕蚩梢员焕?。例如,回滾可以被執(zhí)行,包括更改程序計(jì)數(shù)器270和/或如之前所討論的恢復(fù)數(shù)據(jù)存儲元件的子集的值。可以采取各種其它更改或補(bǔ)救動作,這對于技術(shù)人員將是顯而易見的。替代地,如果數(shù)據(jù)處理裝置在事務(wù)期間未檢測到對未由掩碼指示的寄存器(即,尚未保存或備份的寄存器)的寫入,則事務(wù)在步驟S260處成功結(jié)束。
圖5以流程圖的形式示出了在選擇數(shù)據(jù)存儲元件的子集時(shí)對啟發(fā)的使用。在該示例中,數(shù)據(jù)存儲元件被考慮為構(gòu)成寄存器文件180的一部分的寄存器。當(dāng)事務(wù)啟動指令由處理器執(zhí)行時(shí),處理在步驟S100處開始。這使得x的初始值被初始化或被設(shè)置。在該示例中,x的初始值是基于啟發(fā)的。具體地,x與計(jì)數(shù)器有關(guān),其中,每當(dāng)由于處理電路160向寄存器文件180中的尚未保存或備份的寄存器發(fā)出寫請求而拋出錯(cuò)誤時(shí),計(jì)數(shù)器被增加。已經(jīng)確定x的值后,在步驟S110處保存x個(gè)寄存器的集合。例如,x個(gè)寄存器的集合190可以被保存到本地緩存110。x個(gè)寄存器的集合190部分通過使用關(guān)于由處理電路160執(zhí)行的指令的調(diào)用約定的知識來確定。具體地,如果調(diào)用約定指示參數(shù)和返回結(jié)果通常使用按升序從r0到r8的寄存器來傳遞,則啟發(fā)可以確定x個(gè)寄存器的集合從寄存器r0開始,并且額外的寄存器被順序添加直到x個(gè)寄存器已經(jīng)被添加。在其它實(shí)施例中,其它啟發(fā)可用于確定寄存器的集合如何被擴(kuò)展。在寄存器被保存之前或之后,掩碼200被更新以便反映已經(jīng)被備份的寄存器的集合。在步驟S120處事務(wù)開始。在該步驟期間,一系列指令可以由處理電路160執(zhí)行。然而,在事務(wù)被提交(即完成)之前的任意時(shí)間,在步驟S110處保存的寄存器的值可以通過回滾來恢復(fù)。在步驟S130處,確定是否已經(jīng)發(fā)生錯(cuò)誤。具體地,步驟S130在事務(wù)期間的任意階段持續(xù)測試處理電路160是否做出以下嘗試:寫入寄存器文件180中的寄存器中不是在步驟S110處被保存的寄存器的子集190的一部分的寄存器。這類錯(cuò)誤可以由監(jiān)測電路220或監(jiān)測和抑制電路230引發(fā)。如果在事務(wù)期間未做出任何這類嘗試,則事務(wù)在步驟S160處結(jié)束。事務(wù)的結(jié)束可以由于到達(dá)代碼塊的末端而隱含地發(fā)生,或可以隨著結(jié)束事務(wù)指令而明確地發(fā)生。當(dāng)事務(wù)結(jié)束時(shí),寄存器的值被保存回主存儲器,以使得其它處理器核可以訪問新更新的值。替代地,如果在步驟S130處拋出錯(cuò)誤,則處理繼續(xù)進(jìn)行到步驟S140。在步驟S140處,x的值加1,從而使得未保存的下一最高寄存器被保存。
將理解的是,在其它實(shí)施例中,x可以增加不止1。這可以使得發(fā)生更少的循環(huán)迭代。然而,這可能以保存更多實(shí)際有必要的寄存器為代價(jià)。
在一些其它實(shí)施例中,(一個(gè)或多個(gè))錯(cuò)誤訪問的寄存器的標(biāo)識可以被記錄以使得那些寄存器在下次事務(wù)被啟動時(shí)被具體保存。這可以例如在步驟S140處通過直接修改掩碼來實(shí)現(xiàn)。
不管怎樣,在步驟S150處,事務(wù)被中斷。在該實(shí)施例中,這使得程序計(jì)數(shù)器270由更新器260更新到事務(wù)啟動指令由處理電路160執(zhí)行時(shí)的程序計(jì)數(shù)器的值。此外,寄存器的集合190的值被恢復(fù)到在之前執(zhí)行步驟S110中保存的值。換句話說,事務(wù)被回滾,在于事務(wù)從其起點(diǎn)重啟并且寄存器的集合190的值將被恢復(fù)到接收事務(wù)啟動指令時(shí)那些寄存器所擁有的值。流程然后繼續(xù)到步驟S110,在步驟S110中事務(wù)再次開始,并且x個(gè)寄存器的集合被再一次保存。
因此,總之可以看出,對x個(gè)寄存器的集合的初始估計(jì)被完成。事務(wù)然后繼續(xù)進(jìn)行。然而,如果事務(wù)由于處理電路160做出寫入寄存器文件180中不是寄存器的集合190的一部分的寄存器的嘗試(即,如果對在事務(wù)啟動時(shí)未保存的寄存器做出寫嘗試)而失敗,則拋出錯(cuò)誤,事務(wù)被回滾并且x個(gè)寄存器的集合被擴(kuò)展。事務(wù)然后利用寄存器的該新集合重啟。該過程可以繼續(xù)進(jìn)行直到事務(wù)在步驟S160處成功結(jié)束。因此,既不需要明確示出必須被保存的寄存器(可以是未知的)的集合,也不需要保存架構(gòu)寄存器的整個(gè)集合。
盡管本文已經(jīng)參照附圖詳細(xì)描述了本發(fā)明的說明性實(shí)施例,但是要理解的是,本發(fā)明不限于那些精確的實(shí)施例,并且在不脫離由所附權(quán)利要求定義的本發(fā)明的范圍和精神的情況下,本領(lǐng)域技術(shù)人員可以在其中產(chǎn)生各種變化、添加和修改。例如,在不脫離本發(fā)明的范圍的情況下,可以做出從屬權(quán)利要求的特征和獨(dú)立權(quán)利要求的特征的各種組合。