自適應(yīng)優(yōu)化的比較-交換操作的制作方法
【專利說明】
[0001] 本申請(qǐng)是申請(qǐng)日為2010年12月17日、申請(qǐng)?zhí)枮?01010599713. 6的同名專利申 請(qǐng)的分案申請(qǐng)。
技術(shù)領(lǐng)域
[0002] 本發(fā)明涉及在由計(jì)算處理器執(zhí)行的代碼中實(shí)現(xiàn)的比較-交換操作。
【背景技術(shù)】
[0003] CMPXCHG(比較-交換)操作通常被用作構(gòu)成在代碼區(qū)域(即,指令、操作等)周圍 的臨界區(qū)的指令序列中的一個(gè)指令。它允許代碼區(qū)域原子地執(zhí)行。當(dāng)滿足兩個(gè)條件時(shí)指令 集可以被認(rèn)為是原子的:第一,直到整個(gè)指令集完成,沒有其他進(jìn)程可以知道做出的改變, 以及第二,如果集合中的任何一個(gè)指令失敗那么整個(gè)指令集失敗。當(dāng)整個(gè)指令集失敗時(shí),執(zhí) 行指令的計(jì)算機(jī)系統(tǒng)的狀態(tài)恢復(fù)為指令中任何一個(gè)開始之前其所處的狀態(tài)。在一些實(shí)施例 中,CMPXCHG指令可以被認(rèn)為是具有臨界區(qū)的代碼區(qū)域的軟件定義的包裝(wrapper)。換言 之,可以將該包裝設(shè)計(jì)為軟件代碼,但是其不是硬件這樣實(shí)施意義上的包裝。
[0004] CMPXCHG指令通過檢查以確保在原子集開始時(shí)從存儲(chǔ)器獲取的值在指令集的執(zhí) 行期間沒有被另一進(jìn)程修改來幫助原子地執(zhí)行該指令集。例如,如果存儲(chǔ)器中特定位置的 值被加載到位于原子指令集合的開頭的寄存器中,那么在該指令集完成之后可能有將新 (即,修改的)值加載回原始存儲(chǔ)器位置的請(qǐng)求(該修改的值是該指令集的結(jié)果)。
[0005] 可以在原子指令集結(jié)束時(shí)使用CMPXCHG指令檢查從特定存儲(chǔ)器位置原始加載的 值是否仍然在存儲(chǔ)器的該位置中(即,沒有被另一進(jìn)程或線程在原子指令集執(zhí)行期間的某 個(gè)時(shí)候修改)。如果原始值仍然在那里,那么CMPXCHG指令將新的值加載到存儲(chǔ)舊的值的該 特定存儲(chǔ)器位置,并且原子指令集成功地完成。如果原始值不在那里,這意味著另一進(jìn)程或 線程在原子指令集執(zhí)行期間修改了該值,那么CMPXCHG指令不將新的值加載到所述特定存 儲(chǔ)器位置,而是向系統(tǒng)通知該情況,并且作為通知的結(jié)果,可以在代碼中實(shí)現(xiàn)有條件跳轉(zhuǎn)以 跳轉(zhuǎn)到原子指令集的開始處以進(jìn)行另一成功完成的嘗試。
【附圖說明】
[0006] 本發(fā)明以示例的方式來說明并且不受附圖限制,在附圖中,相似的標(biāo)號(hào)指示類似 的元件,并且其中:
[0007] 圖1說明了用于CLMRK命令的高速緩存行標(biāo)簽的集合的實(shí)施例。
[0008] 圖2是說明關(guān)于是執(zhí)行完整的CMPXCHG微操作序列還是只執(zhí)行CMPXCHG操作的 STORE部分的FASTCMPXCHG指令決策樹的實(shí)施例的流程圖。
[0009] 圖3說明了包括能夠執(zhí)行CLMARK和FASTCMPXCHG指令的一個(gè)或多個(gè)CPU核心的 計(jì)算機(jī)系統(tǒng)的實(shí)施例。
【具體實(shí)施方式】
[0010] 描述了實(shí)現(xiàn)自適應(yīng)優(yōu)化的比較-交換操作的機(jī)器可讀介質(zhì)、處理器以及系統(tǒng)的實(shí) 施例。
[0011] 引入了兩個(gè)指令:CLMARK(高速緩存行標(biāo)記)和FASTCMPXCHG(快速比較-交 換)。CLMRK指令在標(biāo)簽識(shí)別結(jié)構(gòu)中用微架構(gòu)暗示比特(hint bit)為特定的高速緩存 行加標(biāo)簽。當(dāng)被檢驗(yàn)時(shí),暗示比特能夠通知處理器中的執(zhí)行邏輯準(zhǔn)備執(zhí)行兩個(gè)方法中的 FASTCMPXCHG方法。具體地說,從高速緩存讀取的在原子指令序列中使用的數(shù)據(jù)會(huì)或不會(huì)被 篡改。如果數(shù)據(jù)在原子指令序列期間未被篡改(即,修改),那么FASTCMPXCHG指令退回到 標(biāo)準(zhǔn)CMPXCHG (比較-交換)指令,其包括LOAD-COMPARE-STORE (加載-比較-存儲(chǔ))的微 操作序列。另一方面,如果通過檢驗(yàn)標(biāo)簽識(shí)別結(jié)構(gòu)中的暗示比特,執(zhí)行邏輯可以確定在特定 高速緩存行中的數(shù)據(jù)明確地沒有被修改,那么可以執(zhí)行CMPXCHG的"快速"版本,其中唯一 使用的微操作是最后的STORE。因此,在許多實(shí)施例中,LOAD和COMPARE微操作可以被丟棄 而無需執(zhí)行,并且這可以加快處理器中的執(zhí)行效率。
[0012] 在以下說明書和權(quán)利要求中引用的本公開技術(shù)的"一個(gè)實(shí)施例"、"實(shí)施例"是指結(jié) 合該實(shí)施例而描述的具體特征、結(jié)構(gòu)或特性被包括在所公開技術(shù)的至少一個(gè)實(shí)施例中。因 此,在整個(gè)說明書不同位置中,短語"在一個(gè)實(shí)施例中"的多次出現(xiàn)不一定全部都是指同樣 的實(shí)施例。在以下說明書和權(quán)利要求中,可以使用術(shù)語"包括"和"包含"以及它們的派生 詞,并且意圖將它們用作彼此的同義詞。
[0013] 在當(dāng)今的多線程環(huán)境中,在執(zhí)行中間可以中斷正執(zhí)行原子指令集的線程。然后另 一線程可以被給予存儲(chǔ)器的控制并且潛在地改變一些或許多存儲(chǔ)的值。這僅是原子指令集 使用的在存儲(chǔ)器位置處的值在新的值有機(jī)會(huì)被重寫到同一存儲(chǔ)器位置之前可能已經(jīng)被修 改的原因的一個(gè)例子。
[0014] 實(shí)際的CMPXCHG指令的使用實(shí)質(zhì)上包括以下基本格式:
[0015] lock CMPXCHG[mem], rdx
[0016] 具體地說,CMPXCHG執(zhí)行流程導(dǎo)致發(fā)生以下操作:
[0017] 1)將存儲(chǔ)在[mem](由mem地址指向的存儲(chǔ)器位置)的值加載(LOAD指令)到第 一寄存器("第一"寄存器包括執(zhí)行邏輯針對(duì)嵌入在CMPXCHG中的LOAD微操作所使用的專 用寄存器)中。
[0018] 2)將第一寄存器中的值與eax/rax寄存器(eax還是rx取決于操作數(shù)的大?。┻M(jìn) 行比較(COMPARE微操作)。
[0019] 3)如果比較表明兩個(gè)值相等(即,存儲(chǔ)器中的值沒有改變),那么將rdx寄存器中 的值寫入(STORE微操作)到[mem]。
[0020] 4)如果比較表明兩個(gè)值不同(即,存儲(chǔ)器中的值已改變),那么將存儲(chǔ)在[mem]中 的當(dāng)前值加載到eax/rax中。
[0021] lock(鎖定)前綴使得CMPXCHG指令本身變?yōu)樵又噶?。這是推薦的,因?yàn)?CMPXCHG指令被分解成上文描述的LOAD-COMPARE-STORE微操作組合。
[0022] 整個(gè)C0MXCHG指令成功還是失敗基于上文步驟2中的COMPARE指令的結(jié)果。用于 檢查CMPXCHG成功的簡單方法是如果它成功那么零標(biāo)志(ZF)被設(shè)置,如果沒有成功那么ZF 被清零。微操作集合(LOAD-COMPARE-STORE)在CMPXCHG指令本身之前的某個(gè)時(shí)刻以額外 的LOAD指令作為開端,因?yàn)樵谠撛又噶罴_始時(shí),CMPXCHG指令需要將[mem]處的值初 始LOAD到ea