欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

用于將程序自動(dòng)分解成多個(gè)并行線程的硬件和軟件系統(tǒng)的系統(tǒng)、設(shè)備和方法與流程

文檔序號(hào):11990764閱讀:610來(lái)源:國(guó)知局
用于將程序自動(dòng)分解成多個(gè)并行線程的硬件和軟件系統(tǒng)的系統(tǒng)、設(shè)備和方法與流程
用于將程序自動(dòng)分解成多個(gè)并行線程的硬件和軟件系統(tǒng)的系統(tǒng)、設(shè)備和方法優(yōu)先權(quán)請(qǐng)求該部分繼續(xù)申請(qǐng)要求題為“Systems,Methods,andApparatusesforParallelComputing(用于并行計(jì)算的系統(tǒng)、方法和設(shè)備)”的非臨時(shí)專利申請(qǐng)S/N12/646,815的優(yōu)先權(quán),該申請(qǐng)S/N12/646,815本身是部分繼續(xù)申請(qǐng)并要求2009年11月24日提交的題為“System,Methods,andApparatusesToDecomposeASequentialProgramIntoMultipleThreads,ExecuteSaidThreads,andReconstructTheSequentialExecution(將順序程序分解成多個(gè)線程,執(zhí)行所述線程并重構(gòu)順序執(zhí)行的系統(tǒng)、方法和裝置)”的非臨時(shí)專利申請(qǐng)S/N12/624,804的優(yōu)先權(quán),申請(qǐng)S/N12/624,804要求2008年11月24日提交的題為“MethodandApparatusToReconstructSequentialExecutionFromADecomposedInstructionStream(從分解的指令流重構(gòu)順序執(zhí)行的方法和設(shè)備)”的臨時(shí)專利申請(qǐng)S/N61/200,103的優(yōu)先權(quán)。發(fā)明領(lǐng)域本發(fā)明的實(shí)施例一般涉及信息處理領(lǐng)域,更具體地涉及在計(jì)算系統(tǒng)和微處理器中多線程執(zhí)行的領(lǐng)域。背景在最近的幾十年間,單線程處理器已經(jīng)通過(guò)采用指令級(jí)并行性(ILP)顯示出顯著的性能改進(jìn)。然而,這種類型的并行性有時(shí)難以利用并且需要復(fù)雜的硬件結(jié)構(gòu),這可導(dǎo)致過(guò)高的功耗和設(shè)計(jì)復(fù)雜性。此外,在復(fù)雜性和功率方面的這種增加提供逐漸減少的回報(bào)。芯片多處理器(CMP)已經(jīng)呈現(xiàn)為有希望的可選方案,以便在合理的功率預(yù)算下提供進(jìn)一步的處理器性能改進(jìn)。附圖說(shuō)明在附圖各圖中通過(guò)示例而不是限制說(shuō)明了本發(fā)明,其中類似標(biāo)記指示相似元件,且其中:圖1圖示動(dòng)態(tài)線程切換執(zhí)行架構(gòu)操作的示例性實(shí)施例。圖2示出根據(jù)一些實(shí)施例的DTSE操作的示例性方法。圖3示出DTSE架構(gòu)的實(shí)施例。圖4示出根據(jù)一些實(shí)施例用于包裝器(wrapper)的主要硬件塊。圖6示出DTSE硬件的實(shí)施例的更詳細(xì)圖示。圖7示出根據(jù)一些實(shí)施例的XGC的使用。圖8-11示出一些軟件操作的示例。圖12是示出根據(jù)本發(fā)明的實(shí)施例的核的示例性無(wú)序架構(gòu)的框圖。圖13示出根據(jù)本發(fā)明一個(gè)實(shí)施例的系統(tǒng)的框圖。圖14示出根據(jù)本發(fā)明的實(shí)施例的第二系統(tǒng)的框圖。圖15示出根據(jù)本發(fā)明的實(shí)施例的第三系統(tǒng)的框圖。詳細(xì)描述在以下描述中,陳述了多個(gè)具體細(xì)節(jié)。然而,應(yīng)當(dāng)理解,本發(fā)明的實(shí)施例可在沒(méi)有這些具體細(xì)節(jié)的情況下實(shí)踐。在其他實(shí)例中,公知的電路、結(jié)構(gòu)和技術(shù)未被詳細(xì)示出,以免混淆對(duì)本描述的理解。在說(shuō)明書(shū)中對(duì)“一個(gè)實(shí)施例”、“一實(shí)施例”、“示例實(shí)施例”等的參考指示所描述的實(shí)施例可包括特定特征、結(jié)構(gòu)或特性,但并不一定每個(gè)實(shí)施例都包括該特定特征、結(jié)構(gòu)或特性。此外,這樣的短語(yǔ)不一定是指同一個(gè)實(shí)施例。此外,當(dāng)參考實(shí)施例描述特定特征、結(jié)構(gòu)或特性時(shí),認(rèn)為在本領(lǐng)域技術(shù)人員學(xué)識(shí)范圍內(nèi),可以與其他實(shí)施例一起實(shí)施這樣的特征、結(jié)構(gòu)或特性,不論是否有明確描述。以下詳細(xì)描述用于提供動(dòng)態(tài)線程切換執(zhí)行的系統(tǒng)、裝置和方法的實(shí)施例。支持它的系統(tǒng)的實(shí)施例包括被硬件包裝器和軟件(動(dòng)態(tài)線程切換軟件)圍繞的處理器核。在正常執(zhí)行模式下,處理器如同硬件包裝器和動(dòng)態(tài)線程切換軟件不存在那樣地操作。例如,發(fā)生正常x86執(zhí)行。在動(dòng)態(tài)線程切換執(zhí)行(DTSE)模式下,硬件包裝器和軟件一起工作以進(jìn)行動(dòng)態(tài)線程切換執(zhí)行,包括流程的生成和修改等,如下詳述。然而,首先提供高級(jí)概述。以下是諸如“流程”和“熱”代碼之類的一些主題的更詳細(xì)解釋。以下的細(xì)節(jié)對(duì)硬件包裝器與軟件的組合進(jìn)行描述,該硬件包裝器檢查在全局提交前每個(gè)負(fù)載從正確的存儲(chǔ)獲得數(shù)據(jù)以及某些其它事項(xiàng),該軟件使用最近觀察到的代碼行為解析難以單獨(dú)從代碼確定的代碼依賴性,因?yàn)橛布z查并保證正確的執(zhí)行。以下的細(xì)節(jié)描述在原始代碼中對(duì)很多靜態(tài)實(shí)例的標(biāo)識(shí),使得可以理解在原始指令的特定實(shí)例之間而非原始指令本身之間的依賴性。所描述的軟件使用對(duì)限定的靜態(tài)代碼子集(稱為“流程”)內(nèi)依賴性的完整但可能不完全正確的理解,以在流程內(nèi)將靜態(tài)代碼分成在跟蹤之間沒(méi)有依賴性(或僅有特別允許的依賴性)的分離的“跟蹤”。另外,描述了包括以下中的一個(gè)或多個(gè)的維護(hù)操作:獲取流程的附加概況,該流程由于意外的控制流程或不正確的負(fù)載結(jié)果或其它檢查的失敗,在退出前比期望的動(dòng)態(tài)執(zhí)行更短;刪除在此方面突然變壞的流程;連續(xù)搜索對(duì)性能有意義的新或替換流程;以及當(dāng)有新的概況信息以及對(duì)觀察到不比原始代碼表現(xiàn)更好的流程的刪除時(shí),將代碼再分成跟蹤。DTSE硬件將形成順序列表并將這些寫入中級(jí)高速緩存。DTSE硬件具有寄存器,該寄存器具有與該跟蹤元數(shù)據(jù)列表相關(guān)聯(lián)的物理地址。我們可能需要考慮壓縮負(fù)載和存儲(chǔ)地址以使帶寬保持下降。我們將需要能夠跟蹤執(zhí)行負(fù)載或存儲(chǔ)的邏輯處理器至負(fù)載執(zhí)行以及至高級(jí)存儲(chǔ)處理。DTSE邏輯還獲取退役時(shí)的分支方向位和所采用的間接分支的目標(biāo),包括返回。這用于閃速概況分析和支持寄存器狀態(tài)恢復(fù)的數(shù)據(jù)。I.高級(jí)概述如上所述,本文中詳細(xì)描述的處理器可操作在傳統(tǒng)模式中,其中每個(gè)核自己操作。當(dāng)核之一“關(guān)閉”或“停止”時(shí),處理器核還可用于在DTSE模式下概況分析、線程化和運(yùn)行線程化的代碼。雖然操作系統(tǒng)假設(shè)該核處于睡眠模式,但停止流程將核的所有權(quán)從OS切換到DTSE模式。圖1圖示DTSE操作的示例性實(shí)施例。在圖中,這控制成為副核的空閑核。在一些實(shí)施例中,當(dāng)核接收到HALT/WMAIT指令時(shí),發(fā)生對(duì)空閑核的控制。DTSE軟件監(jiān)視將被置于睡眠的核的所有線程,然后承擔(dān)對(duì)該核的控制。副代碼通過(guò)檢測(cè)“熱代碼”開(kāi)始,該“熱代碼”是與大部分動(dòng)態(tài)執(zhí)行相對(duì)應(yīng)的主核(例如,運(yùn)行100K連續(xù)指令的內(nèi)核)上運(yùn)行的軟件的入口點(diǎn)。熱代碼檢測(cè)通常在簡(jiǎn)單的硬件結(jié)構(gòu)中完成。一旦已經(jīng)檢測(cè)到熱入口點(diǎn),將其裝備用于概況分析。一旦(被主核)命中,熱代碼進(jìn)入概況分析模式,這表示針對(duì)某些設(shè)定的指令量(諸如50000個(gè)指令)概況分析所有的負(fù)載、存儲(chǔ)和分支。一旦完成概況分析,執(zhí)行線程生成。線程生成分析該熱代碼,并且基于概況分析的信息生成兩個(gè)線程用于線程化執(zhí)行模式。一旦完成,則將入口點(diǎn)(熱IP)裝備作為DTSE模式入口點(diǎn)。下次原始代碼(運(yùn)行在主核上)命中入口點(diǎn)時(shí),它切換點(diǎn)到其中兩個(gè)核合作執(zhí)行該代碼的DTSE模式。如果流程退出熱代碼或如果檢測(cè)到違背或外部事件(例如,中斷),則DTSE模式結(jié)束。違背包括例如,當(dāng)兩個(gè)核在同一時(shí)期將不同數(shù)據(jù)存儲(chǔ)到相同的存儲(chǔ)器地址時(shí)。一旦出現(xiàn)違背,線程化模式退回到最后的提交點(diǎn)并且回到原始代碼。圖2示出根據(jù)一些實(shí)施例的DTSE操作的示例性方法。在該實(shí)例中,利用兩個(gè)核處理線程化代碼。在201,主核(核0)執(zhí)行原始單個(gè)線程化代碼。在203,另一個(gè)核(核1)變成并用作副核。核能夠以多種方式變成副核(工作線程)。例如,通過(guò)使用硬件動(dòng)態(tài)方案,諸如抓取由OS置于睡眠(例如置于C狀態(tài))、由軟件分配或由線程(由OS/驅(qū)動(dòng)器或應(yīng)用本身)置于睡眠的核,作為核的靜態(tài)劃分的結(jié)果,可將副核用作副核。當(dāng)主核執(zhí)行原始代碼時(shí),在205,副核將被置于檢測(cè)階段,其中它等待熱區(qū)的熱代碼檢測(cè)(通過(guò)硬件或軟件)。在一些實(shí)施例中,熱代碼檢測(cè)是檢測(cè)頻繁訪問(wèn)的熱區(qū)并提供其入口IP(指令指針)的硬件表。一旦檢測(cè)到這種熱區(qū)入口IP,在207,主核被裝備,使得它將觸發(fā)對(duì)該IP的下一次調(diào)用的概況分析并將執(zhí)行切換到原始代碼的線程化版本。概況分析收集信息,諸如負(fù)載地址、存儲(chǔ)地址和預(yù)定長(zhǎng)度執(zhí)行(例如,50000動(dòng)態(tài)指令)的分支。一旦已經(jīng)完成概況分析,則副核開(kāi)始線程生成階段(thread-gen)209。在該階段,副核生成經(jīng)概況分析的區(qū)的線程化版本,同時(shí)使用經(jīng)概況分析的信息作為指導(dǎo)。線程生成提供原始代碼的線程化版本以及可能的入口點(diǎn)。當(dāng)在211,命中入口點(diǎn)之一(標(biāo)記為“熱IP”)時(shí),主核和副核被重定向成執(zhí)行代碼的線程化版本,并且執(zhí)行切換到不同的執(zhí)行模式(有時(shí)稱為“線程化執(zhí)行模式”)。在該模式下,兩個(gè)線程完全分開(kāi)地操作,同時(shí)包裝器硬件用于緩存存儲(chǔ)器負(fù)載并且存儲(chǔ)、檢查可能的違背,并自動(dòng)提交狀態(tài)以提供向前發(fā)展同時(shí)維持存儲(chǔ)器排序。該執(zhí)行模式可按兩種方式之一結(jié)束。它可在代碼退出熱區(qū)作為干凈退出(執(zhí)行沒(méi)有問(wèn)題)時(shí)或在發(fā)生違背作為臟退出時(shí)結(jié)束。在213,確定是哪種類型的退出。示例性的臟退出是存儲(chǔ)/存儲(chǔ)和負(fù)載/存儲(chǔ)違背或在第二執(zhí)行模式中未處理的例外情況(例如被零除的浮點(diǎn)例外、不可高速緩存的存儲(chǔ)器類型存儲(chǔ)等)。在第二執(zhí)行模式退出時(shí),主核返回到原始代碼,而副核返回到檢測(cè)模式,等待檢測(cè)另一個(gè)熱IP或命中已經(jīng)生成的區(qū)的熱IP。在干凈退出(熱區(qū)的退出)時(shí),原始代碼從退出點(diǎn)繼續(xù)。在臟退出(例如,違背或例外)時(shí),在215,主核返回到最后的檢查點(diǎn),并且繼續(xù)那里的執(zhí)行。在干凈和臟退出時(shí),寄存器狀態(tài)從兩個(gè)核合并并移動(dòng)到原始代碼。示例性DTSE架構(gòu)圖3示出動(dòng)態(tài)線程切換執(zhí)行架構(gòu)的實(shí)施例。以下詳細(xì)討論該系統(tǒng)的軟件和硬件方面。如上所述,每個(gè)核301可先天地支持同時(shí)多線程(SMT)。這表示兩個(gè)或更多個(gè)邏輯處理器可共享核的硬件。每個(gè)邏輯處理器獨(dú)立地處理代碼流,然而來(lái)自這些代碼流的指令被隨機(jī)混合以在同一硬件上執(zhí)行。經(jīng)常,來(lái)自不同邏輯處理器的指令在核的超標(biāo)量硬件上同時(shí)執(zhí)行。SMT核的性能和同一核上的邏輯處理器的數(shù)量增加。因此,由于邏輯處理器的數(shù)量增加,一些重要的工作負(fù)載將被更快速地處理。由于僅邏輯處理器的數(shù)量增加,其它工作負(fù)載可能不被更快速地處理。有的時(shí)候,系統(tǒng)中沒(méi)有足夠的軟件線程利用所有的邏輯處理器。該系統(tǒng)自動(dòng)分解可用軟件線程中的一些或全部,將每個(gè)分解成將同時(shí)執(zhí)行的多個(gè)線程(從單個(gè)線程至多個(gè)線程的動(dòng)態(tài)線程切換),從而利用多個(gè)(可能很多)邏輯處理器。由于僅邏輯處理器的數(shù)量增加,而未被更快速地處理的工作負(fù)載在其線程已經(jīng)被分解成大量線程以便利用更多邏輯處理器時(shí)很可能會(huì)被更快速地處理。除“傳統(tǒng)”核外,硬件包括動(dòng)態(tài)線程切換邏輯,其包括用于維持全局存儲(chǔ)器一致性303、全局退役307、全局寄存器狀態(tài)309和軟件的信息收集305的邏輯。該邏輯可被包括在核本身中或被單獨(dú)提供。該邏輯可執(zhí)行五種功能。第一種是收集關(guān)于運(yùn)行代碼的專用信息,稱為概況分析。第二種是在原始代碼運(yùn)行時(shí),硬件必須查看軟件已經(jīng)定義的執(zhí)行命中熱IP流地址。當(dāng)這發(fā)生時(shí),硬件強(qiáng)制核跳至軟件已經(jīng)定義的不同地址。這就是代碼的線程化版本如何得到執(zhí)行的。第三種是硬件必須與軟件一起工作以時(shí)常有效地保存原始代碼流的正確寄存器狀態(tài)作為核的數(shù)據(jù)高速緩存內(nèi)的全局提交點(diǎn)(GlobalCommitPoints)。如果原始代碼流被軟件分解成多個(gè)線程,則可能沒(méi)有邏輯處理器曾經(jīng)具有原始程序的整個(gè)正確寄存器狀態(tài)。伴隨每個(gè)全局提交點(diǎn)的正確存儲(chǔ)器狀態(tài)也應(yīng)是已知的。當(dāng)必要時(shí),與軟件一起工作的硬件必須能夠?qū)⒓拇嫫骱痛鎯?chǔ)器的架構(gòu)程序狀態(tài)恢復(fù)到最后的全局提交點(diǎn),如下所討論的。第四,盡管軟件在產(chǎn)生正確執(zhí)行的代碼方面表現(xiàn)良好,但有些事情軟件不能總是100%正確。一個(gè)好的例子是:軟件在生成代碼的線程化版本時(shí)不能完美預(yù)測(cè)存儲(chǔ)器地址。所以線程化代碼有時(shí)獲取負(fù)載的錯(cuò)誤結(jié)果。硬件必須檢查可能不正確的所有東西。如果一些東西不正確,則硬件必須與軟件一起工作以修復(fù)程序狀態(tài)。這通常通過(guò)將核狀態(tài)恢復(fù)到最后的全局提交狀態(tài)來(lái)完成。最后,如果原始代碼流被分解成多個(gè)線程,則在原始代碼中指定的對(duì)存儲(chǔ)器的存儲(chǔ)將被分布在多個(gè)邏輯處理器中并在這些邏輯處理器之間按隨機(jī)順序執(zhí)行。動(dòng)態(tài)線程切換邏輯必須確保任何其它代碼流不能“查看”存儲(chǔ)器中在正確執(zhí)行的情況下按原始代碼定義是不正確的狀態(tài)。在這些示例性架構(gòu)中,處理器核(“核”)通常具有兩個(gè)SMT線程。一般而言,在DTSE模式中,每個(gè)核有比2個(gè)多得多的“邏輯處理器”。這些邏輯處理器被定義為兩種類型之一:“主的”和“勞工的”。主邏輯處理器對(duì)軟件(即操作系統(tǒng)和虛擬機(jī)監(jiān)視器)是已知的。軟件將核上的主邏輯處理器集看作它們實(shí)際所在的核上的SMT線程。主邏輯處理器完成SMT線程完成的大部分事情(如果不是全部事情的話),尤其是獲取中斷。勞工邏輯處理器一般是外部軟件不可見(jiàn)的。它們由“保留的存儲(chǔ)器中”的DTSE軟件使用并管理。該存儲(chǔ)器是可物理尋址的、保留存儲(chǔ)器系統(tǒng)。該保留存儲(chǔ)器是現(xiàn)有系統(tǒng)存儲(chǔ)器的專用部分或單獨(dú)的物理存儲(chǔ)器。該保留存儲(chǔ)器用于存儲(chǔ)DTSE代碼并且用作其工作存儲(chǔ)器。在DTSE模式中生成的數(shù)據(jù)結(jié)構(gòu)被存儲(chǔ)在保留存儲(chǔ)器中?!盁帷贝a也被存儲(chǔ)在該保留存儲(chǔ)器中。跟蹤數(shù)據(jù)、跟蹤數(shù)據(jù)目錄和跟蹤元數(shù)據(jù)在保留存儲(chǔ)器中。所有的這些都被物理尋址。勞工邏輯處理器不具有主邏輯處理器所具有的全部語(yǔ)境,結(jié)果它們被限于全部處理器功能的子集。勞工邏輯處理器僅執(zhí)行保留存儲(chǔ)器中流程的代碼,并且將不執(zhí)行可見(jiàn)存儲(chǔ)器中的原始代碼。主邏輯處理器可執(zhí)行可見(jiàn)存儲(chǔ)器中的原始代碼或隱藏存儲(chǔ)器中流程的代碼。從DTSE角度看,主邏輯處理器可執(zhí)行的隱藏存儲(chǔ)器中流程的代碼是單個(gè)跟蹤代碼。在操作中,操作系統(tǒng)在主邏輯處理器上運(yùn)行線程,如同它現(xiàn)在所做的。主邏輯處理器全相同且被編組成“核”。有多個(gè)主邏輯處理器且每個(gè)的性能都非常高。主邏輯處理器的性能乘以操作系統(tǒng)可用的主邏輯處理器的數(shù)量遠(yuǎn)遠(yuǎn)超過(guò)芯片的吞吐能力??赡芾靡徊糠炙峁┑闹鬟壿嬏幚砥鱽?lái)利用芯片的全部能力。另一方面,通過(guò)利用大量(優(yōu)選地全部)所提供的主邏輯處理器,良好編碼的大量并行程序可更高效地利用芯片的能力,因此實(shí)現(xiàn)更高性能。如果所運(yùn)行的主邏輯處理器不利用芯片必須提供的所有資源,則DTSE軟件將進(jìn)行自動(dòng)線程分解。它將在勞工邏輯處理器上運(yùn)行并行化計(jì)算流程。這尤其包括重要SSE和AVX代碼的分解以并行運(yùn)行在吞吐引擎上。這包括在特殊的功能單元上運(yùn)行能在這些特殊的功能單元上運(yùn)行的代碼?;旧希?dāng)主邏輯處理器上的線程實(shí)際在勞工邏輯處理器上運(yùn)行計(jì)算流程時(shí),主邏輯處理器不做任何事情。它實(shí)際上停止,但操作系統(tǒng)認(rèn)為它做了所有的工作。如上詳述,操作系統(tǒng)不知道勞工邏輯處理器。當(dāng)計(jì)算流程運(yùn)行在勞工上時(shí),擁有它的主邏輯處理器等待兩種事情之一發(fā)生:中斷或計(jì)算流程中的流程退出。如果這些事情中的任一個(gè)發(fā)生,則主邏輯處理器接管。如果有中斷進(jìn)入中斷流程,則它立即與勞工上的計(jì)算流程并行地執(zhí)行該中斷流程。在大多數(shù)情況下,中斷流程完成整個(gè)中斷處理,且主邏輯處理器返回等待,而對(duì)計(jì)算流程沒(méi)有任何影響。當(dāng)在其計(jì)算流程中有流程退出時(shí),等待的主邏輯處理器在該點(diǎn)上構(gòu)造寄存器狀態(tài),并且在原始代碼中恢復(fù)。理想地,它將很快命中熱代碼入口點(diǎn)。這將開(kāi)始新計(jì)算流程的執(zhí)行,或者可能是主邏輯處理器上的系統(tǒng)流程。除以下詳述的其它任務(wù)外,DTSE軟件311可包括用于生成、維持和去除流程的例程。硬件“包裝器”在一些實(shí)施例中,硬件包裝器用于動(dòng)態(tài)線程切換執(zhí)行邏輯。包裝器硬件支持以下功能中的一個(gè)或多個(gè):1)檢測(cè)熱區(qū)(熱代碼根檢測(cè));2)生成表征熱區(qū)的信息(概況);3)當(dāng)執(zhí)行事務(wù)時(shí)緩沖狀態(tài);4)在成功的情況下提交所緩沖的狀態(tài);5)在中止的情況下丟棄所緩沖的狀態(tài);6)檢測(cè)一致性事件,諸如寫-寫和讀-寫沖突;7)預(yù)防交叉修改代碼;和/或7)預(yù)防分頁(yè)相關(guān)改變。以下將詳細(xì)討論這些功能中的每一個(gè)或者已經(jīng)討論過(guò)了。盡管在DTSE執(zhí)行模式中,所生成的線程一起操作,但沒(méi)有通信的途經(jīng)。每個(gè)核執(zhí)行其自身的線程,同時(shí)提交/跨度標(biāo)記指示線程化代碼中的與原始代碼中的一些IP相對(duì)應(yīng)的IP。DTSE硬件緩沖負(fù)載和存儲(chǔ)信息,防止任何存儲(chǔ)對(duì)外部可見(jiàn)(全局提交)。當(dāng)兩個(gè)核達(dá)到跨度標(biāo)記時(shí),檢查負(fù)載和存儲(chǔ)是否有違背。如果沒(méi)有檢測(cè)到違背,則存儲(chǔ)變?yōu)槿痔峤弧4鎯?chǔ)的提交指示在違背/臟退出的情況下執(zhí)行應(yīng)跳至的檢查點(diǎn)。圖4示出根據(jù)一些實(shí)施例用于包裝器(wrapper)的主要硬件塊。如上所述,這由兩個(gè)或更多個(gè)核401(示為屬于一對(duì),但可以更多)構(gòu)成。違背檢測(cè)、原子提交、熱IP檢測(cè)和概況分析邏輯403耦合到核401。在一些實(shí)施例中,該組被稱為動(dòng)態(tài)線程切換執(zhí)行硬件邏輯。還耦合到核的是中級(jí)高速緩存405,其中合并第二執(zhí)行模式的執(zhí)行狀態(tài)。另外,有末級(jí)高速緩存407。最后,有xMC保護(hù)數(shù)據(jù)高速緩存(guardatacache,XGC409),將參考圖7對(duì)其進(jìn)行詳細(xì)討論。應(yīng)用的若干流程將由根檢測(cè)硬件(未明確示出)中的硬件標(biāo)識(shí)。每個(gè)流是具有一個(gè)或多個(gè)入口點(diǎn)的良好定義的二進(jìn)制代碼集。應(yīng)用的流程集應(yīng)覆蓋該應(yīng)用的大量動(dòng)態(tài)執(zhí)行,但由于流的并行化,靜態(tài)流程的組合尺寸應(yīng)該小。當(dāng)原始代碼被執(zhí)行時(shí),根檢測(cè)硬件搜索單個(gè)IP值,稱為標(biāo)識(shí)新流程的“根”。通常,在執(zhí)行處于流程中時(shí)該硬件將不進(jìn)行搜索。在一些實(shí)施例中,硬件將保持64指令指針(IP)的列表。該列表從位置0排序到位置63,且每個(gè)位置可具有IP或?yàn)榭铡T摿斜黹_(kāi)始為全空。如果有合格的分支到在位置N匹配列表中條目的IP,則位置N-1和N交換位置,除非N=0。如果N=0,則什么都不發(fā)生。更簡(jiǎn)單地,該IP在該列表中向上移動(dòng)一個(gè)位置。如果有合格的分支到不匹配列表中條目的IP,則條目40至62下移1,至位置41至63。位置63的先前內(nèi)容丟失。在位置40輸入新IP。在一些實(shí)施例中,對(duì)哪些IP“合格”增加到列表、或“合格”匹配已經(jīng)在列表上的IP因此導(dǎo)致提升存在限制。第一限制是僅所采用的向后分支的目標(biāo)是合格的。調(diào)用和返回是不合格的。如果所采用的向后分支執(zhí)行“熱”作為流程的一部分并且它不離開(kāi)該流程,則它的目標(biāo)是不合格的。如果所采用的向后分支的目標(biāo)命中熱代碼入口點(diǎn)高速緩存,則它是不合格的?;旧?,已經(jīng)在流程中的IP不應(yīng)被置于列表中。在一些實(shí)施例中,存在軟件可設(shè)置的兩個(gè)“排除”區(qū)域。每個(gè)區(qū)域由該排除區(qū)域的IP上的下界和上界描述。注意該機(jī)構(gòu)可被設(shè)置成僅接受特定區(qū)域中的IP。第二限制是排除區(qū)中的IP不合格進(jìn)入列表。在一些實(shí)施例中,在命中列表中的指令之后沒(méi)有小于16384動(dòng)態(tài)指令的指令合格來(lái)添加,然而,可允許用16384動(dòng)態(tài)指令窗內(nèi)的新IP替換列表中的最后IP命中?;旧?,流程的目標(biāo)是動(dòng)態(tài)地對(duì)最少50000個(gè)指令取平均。列表中的IP是這一流程的可能根。因此,接下來(lái)的16000動(dòng)態(tài)指令被視為列表中已經(jīng)存在的流程的一部分。在一些實(shí)施例中,硬件將棧16保持較深。調(diào)用可以循環(huán)地遞增棧指針,返回可以遞減棧指針,但它不包裝。即,在調(diào)用時(shí),棧指針總是遞增。但有推入深度計(jì)數(shù)器。它不能超過(guò)16。如果返回將使推入深度變負(fù),則返回不會(huì)遞減棧指針和推入深度計(jì)數(shù)器。每個(gè)指令遞增棧中的所有位置。在推入時(shí),新的棧頂被清除。棧位置在最大計(jì)數(shù)64K處飽和。因此,另一個(gè)限制是沒(méi)有IP合格來(lái)添加到列表,除非棧頂飽和。其原因是避免錯(cuò)誤環(huán)。假設(shè)存在一個(gè)過(guò)程,其包含總是迭代兩次的環(huán)。從全部代碼調(diào)用該過(guò)程。然后該過(guò)程中的向后分支經(jīng)常被命中。盡管這看上去很熱,但它是來(lái)自所有位置的邏輯不相關(guān)工作,且不會(huì)導(dǎo)致良好的流程。該過(guò)程中調(diào)用這個(gè)過(guò)程的IP是期望的。外部過(guò)程是優(yōu)選的,但內(nèi)部過(guò)程不是,除非內(nèi)部過(guò)程大到足以包含流程。在一些實(shí)施例中,如果IP,I被添加到列表或被提升(由于命中匹配),則在接下來(lái)的1024動(dòng)態(tài)指令內(nèi)沒(méi)有指令合格來(lái)匹配I。該規(guī)則的目的是防止過(guò)高評(píng)價(jià)緊密環(huán)。這種環(huán)中的向后分支命中很多,但每次命中不表示很多工作。列表中的頂部IP被視為表示非?;钴S的代碼。典型的過(guò)載負(fù)載將具有若干流程來(lái)獲得高動(dòng)態(tài)覆蓋。完全按重要性的順序找到這些不是關(guān)鍵的,但較佳的是通常大致按重要性的順序產(chǎn)生這些流程以便較早獲得最大性能增益。應(yīng)找到用于構(gòu)建流程的合理位置。這將成為熱代碼,然后它出界以找到下一流程用于工作。很可能,將找到若干流程。一般而言,流程并不脫節(jié)且可重疊。但是,至少每個(gè)流程的根不在先前找到的流程中。它實(shí)際仍可在稍后找到的流程中。這足以保證沒(méi)有兩個(gè)流程是相同的。盡管上面已經(jīng)使用的特定數(shù)字,但那些僅僅是說(shuō)明性的。這種架構(gòu)至少有兩類流程:系統(tǒng)流程和計(jì)算流程。計(jì)算流程在勞工邏輯處理器的集群上執(zhí)行。系統(tǒng)流程在主邏輯處理器上執(zhí)行。計(jì)算流程可以是但不必需是通過(guò)線程分解從單個(gè)代碼流形成的多個(gè)跟蹤。計(jì)算流程完全由單個(gè)集群中的勞工邏輯處理器執(zhí)行,因?yàn)檎麄€(gè)流程必須在被檢查后按程序順序全局地提交(但通常被全局提交為提交跨度的序列而不是單片。)執(zhí)行流程的所有勞工可自由加載并存儲(chǔ)到相同的地址。在不能做什么方面,計(jì)算流程是限制最多的。系統(tǒng)流程也是DTSE軟件產(chǎn)生的代碼,并且也駐留在隱藏的存儲(chǔ)器中。在系統(tǒng)流程中有很多不能做的事情。它被限制,但比計(jì)算流程限制得要少很多。系統(tǒng)流程是計(jì)算流程之間的串行代碼或者是對(duì)計(jì)算流程獨(dú)立的并行線程。系統(tǒng)流程的最重要用途之一是中斷處理。有時(shí),DTSE軟件創(chuàng)建流程,其入口點(diǎn)是最受歡迎的中斷向量目標(biāo)。該代碼將覆蓋來(lái)自這些向量目標(biāo)的最受歡迎的路徑。如果中斷在系統(tǒng)流程中被完全處理,從向量目標(biāo)至中斷返回(IRET)回到中斷代碼而無(wú)需系統(tǒng)流程退出,則不需要打擾執(zhí)行“被中斷”的流程的勞工。如果整個(gè)中斷處理序列不能如此被處理,則必須在執(zhí)行“被中斷”的流程的勞工中強(qiáng)制流程退出。上下文切換將總是導(dǎo)致中斷流程退出,因此導(dǎo)致“被中斷”的計(jì)算流程中的流程退出。如果中斷可被保持在該中斷流程中,則寄存器永遠(yuǎn)不保存。中斷系統(tǒng)流程是單個(gè)全局提交跨度。或者它將完成至IRET并且所有的提交作為一單元,或者狀態(tài)將被恢復(fù)到中斷向量的目標(biāo)且執(zhí)行在原始代碼中從這里重新開(kāi)始。狀態(tài)恢復(fù)包括停止計(jì)算流程中的全局提交(和進(jìn)一步的執(zhí)行),并且從計(jì)算流程中的最后全局提交點(diǎn)恢復(fù)寄存器狀態(tài)。隱藏存儲(chǔ)器中的流程中的代碼可以被超快速且高效地線程切換,因?yàn)榫€程切換被正確地編程為代碼。原始代碼不能具有被編程的線程切換。涉及原始代碼的線程切換緩慢且低效。針對(duì)能做什么,限制計(jì)算流程。一些原始代碼不合格來(lái)進(jìn)入計(jì)算流程。對(duì)計(jì)算流程合格的一些代碼可進(jìn)入限制較少的系統(tǒng)流程。然而,仍有一些代碼甚至不合格來(lái)進(jìn)入系統(tǒng)流程。這必須保留原始代碼。在一些實(shí)施例中包括無(wú)限量的原始代碼(如果需要)與兩類流程復(fù)用。一旦檢測(cè)到熱代碼根IP(入口IP),裝備主核,使得在該IP的下一命中時(shí),該核將開(kāi)始概況分析原始代碼。在概況分析時(shí),以上信息(分支、負(fù)載和存儲(chǔ))按程序動(dòng)態(tài)順序存儲(chǔ)到存儲(chǔ)器中的緩沖器。緩沖器稍后由線程生成軟件使用以指導(dǎo)線程生成—消除不使用的代碼(基于分支)、指導(dǎo)優(yōu)化并檢測(cè)負(fù)載/存儲(chǔ)關(guān)系。在一些實(shí)施例中,將用于沖突檢查的同一硬件(以下描述)用于緩沖負(fù)載、存儲(chǔ)來(lái)自退役的分支信息并使其溢出到存儲(chǔ)器。在其它實(shí)施例中,將微操作插入執(zhí)行的程序,這將所需信息直接存儲(chǔ)在存儲(chǔ)器中。為了表征熱區(qū)(概況分析),線程化執(zhí)行模式軟件需要以下信息中的一個(gè)或多個(gè):1)對(duì)于分支,它需要a)對(duì)于條件分支,采用/未采用信息,以及b)對(duì)于間接分支,分支目標(biāo);2)對(duì)于負(fù)載,a)負(fù)載地址和b)存取尺寸;3)對(duì)于存儲(chǔ),a)存儲(chǔ)地址和b)存儲(chǔ)尺寸。在一些實(shí)施例中,排序緩沖器(OB)將被維持用于概況分析。這是因?yàn)樨?fù)載、存儲(chǔ)和分支無(wú)序地執(zhí)行,但概況分析數(shù)據(jù)需要按順序。OB在尺寸上類似于重排序緩沖器(ROB)。負(fù)載在分配時(shí)將其地址和尺寸寫入OB。存儲(chǔ)在STA(存儲(chǔ)地址)分配期間將進(jìn)行相同的動(dòng)作(STA分配早于存儲(chǔ)退役,該分配的目的是將虛擬存儲(chǔ)地址轉(zhuǎn)換成物理地址)。分支將寫“至”字段,它可用于直接和間接分支。當(dāng)這些負(fù)載、存儲(chǔ)和分支從ROB退役時(shí),將從OB復(fù)制其對(duì)應(yīng)信息。熱代碼概況分析使用包裝器硬件可緩沖事務(wù)狀態(tài)并且稍后提交它的事實(shí)。它將使用提交所緩沖的狀態(tài)的相同數(shù)據(jù)路徑,以從OB向?qū)懡M合高速緩存(稍后描述)復(fù)制數(shù)據(jù),然后提交它。概況分析信息將被寫入特殊存儲(chǔ)器位置中的專用緩沖器,以便稍后由線程化執(zhí)行軟件使用。在一些實(shí)施例中,DTSE軟件將IP寫在寄存器中并裝備它。一旦命中該IP,硬件將獲取概況數(shù)據(jù)并將其寫入存儲(chǔ)器中的緩沖器。在流程根IP在執(zhí)行期間由硬件報(bào)告后,遇到某一數(shù)量(例如,10000)分支的分支方向歷史。該列表是按本地退役順序的每分支一位。動(dòng)態(tài)線程切換執(zhí)行軟件在退役時(shí)獲得所采用分支的目標(biāo)。它報(bào)告分支方向流中嵌入的間接分支的目標(biāo)。同時(shí),硬件將報(bào)告負(fù)載和存儲(chǔ)的地址和尺寸。當(dāng)應(yīng)用隨時(shí)間改變其行為時(shí),只要應(yīng)用執(zhí)行,就監(jiān)視該執(zhí)行。當(dāng)流看起來(lái)似乎變得“太”短時(shí),它們應(yīng)被生長(zhǎng)或刪除。另外,可在任何給定時(shí)間找到、再生成或合并新的流程。在一些實(shí)施例中,動(dòng)態(tài)線程切換執(zhí)行系統(tǒng)的硬件將報(bào)告每個(gè)流程的平均全局提交指令和循環(huán)。如果有任何問(wèn)題,軟件將需要考慮它并且有時(shí)也通過(guò)臨時(shí)禁用流程來(lái)獲得原始代碼的數(shù)據(jù)。在多數(shù)實(shí)例中,軟件不運(yùn)行“熱”代碼,除非顯然這是一個(gè)凈贏。如果不清楚“熱”代碼是凈贏,則軟件應(yīng)禁用它。這可逐個(gè)流程地進(jìn)行,或者軟件可針對(duì)該工作負(fù)載關(guān)閉所有的東西。軟件將繼續(xù)接收分支未命中預(yù)測(cè)數(shù)據(jù)和分支方向數(shù)據(jù)。另外,由于全局隊(duì)列的段為滿或等待流程覆蓋,軟件將獲得關(guān)于線程停止的報(bào)告。這些可指示遙遙領(lǐng)先運(yùn)行的負(fù)載下跟蹤(稍后討論)。它還將獲得高速緩存未命中的核停止時(shí)間。例如,獲得很多高速緩存未命中停止時(shí)間的核A可解釋為什么核B遙遙領(lǐng)先地運(yùn)行。所有這些可用于針對(duì)該流程更好地進(jìn)行跟蹤的負(fù)載平衡。硬件還將報(bào)告具有最高高速緩存未命中率的負(fù)載的全標(biāo)識(shí)。這可幫助軟件重新分布高速緩存未命中。在一些實(shí)施例中,軟件將在每個(gè)流程執(zhí)行中獲得循環(huán)或指令的報(bào)告。這將標(biāo)識(shí)太小的流程,因此具有過(guò)度的覆蓋開(kāi)銷。圖5示出根據(jù)實(shí)施例的跨度執(zhí)行。當(dāng)線程化執(zhí)行軟件生成用于熱代碼的線程時(shí),它試圖以盡可能小的復(fù)制來(lái)這樣做。根據(jù)原始靜態(tài)代碼,創(chuàng)建兩個(gè)或更多線程。這些線程被跨越。生成對(duì)原始代碼的跨度標(biāo)記同步,并且在跨度標(biāo)記邊界處檢查違背(諸如以上描述的那些)??稍诿總€(gè)跨度完成時(shí)提交存儲(chǔ)器狀態(tài)。如圖所示,在命中熱IP時(shí),執(zhí)行模式切換到線程化執(zhí)行。與先前的一般圖示不同的是每個(gè)線程具有跨度。在每個(gè)跨度之后,進(jìn)行檢查(chk)。在示例中,在第二跨度執(zhí)行之后,檢查(chk2)找到違背。由于該違背,代碼退回到最后的檢查點(diǎn)(它可以在線程之后或在熱IP命中之前)。如上所述,當(dāng)熱代碼區(qū)退出(干凈退出)或違背情況(臟退出)時(shí),線程化執(zhí)行模式將退出。在干凈退出時(shí),退出點(diǎn)將指示跨度和提交點(diǎn),以便提交所有的存儲(chǔ)。在干凈和臟退出時(shí),原始代碼將進(jìn)入最后檢查點(diǎn)(提交)的相應(yīng)原始IP。寄存器狀態(tài)需要從兩個(gè)核的狀態(tài)合并。為此,線程生成器將需要在每次提交時(shí)更新寄存器檢查點(diǎn)信息。例如這可通過(guò)插入特殊存儲(chǔ)來(lái)完成,該特殊存儲(chǔ)將來(lái)自每個(gè)核的相關(guān)寄存器存儲(chǔ)在硬件緩沖器或存儲(chǔ)器中。在退出時(shí),寄存器狀態(tài)將從兩個(gè)核合并入原始(主)核。應(yīng)注意,寄存器合并存在其它可選退出方案,例如寄存器狀態(tài)可從緩沖的負(fù)載和存儲(chǔ)信息(如在生成時(shí)由線程生成器確定)檢索。在圖6中示出DTSE硬件實(shí)施例的更詳細(xì)圖示。它在左側(cè)描述推測(cè)執(zhí)行在右側(cè)描述一致性。在一些實(shí)施例中,除MLC617和核601外的所有形成違背檢測(cè)、原子提交、熱IP檢測(cè)和概況分析邏輯403的一部分。該執(zhí)行是推測(cè)的,因?yàn)樵诰€程化模式中,核601中所生成的線程一起操作,它們彼此不通信。在一些實(shí)施例中,硬件包裝器包括單個(gè)物理保護(hù)高速緩存,其保護(hù)原始代碼,在保留的存儲(chǔ)器(又一次未示出)中存在該原始代碼的某種形式的副本。在一些實(shí)施例中,這是16K線、8路集合相關(guān)高速緩存,其中每個(gè)線覆蓋原始代碼的4096字節(jié)。分辨率將是64字節(jié)塊。高速緩存線包含在與線范圍對(duì)齊的4096字節(jié)內(nèi)的開(kāi)始?jí)K和結(jié)束塊。塊號(hào)是6位。該高速緩存可具有在具有相同標(biāo)簽的相同集合中的多條線。因此,當(dāng)讀取物理保護(hù)高速緩存時(shí),相同集合中的多條線可被命中高達(dá)8條線。這提供了在相同的4096字節(jié)中的表示若干分離跨度(其間具有未保護(hù)的間隙)的能力。軟件311應(yīng)確保在物理保護(hù)高速緩存中不會(huì)一次以上地表示64字節(jié)塊。當(dāng)進(jìn)行對(duì)命中64字節(jié)塊的檢查時(shí),還檢查塊是否位于4096字節(jié)粒度地址命中的高達(dá)8條線中。因?yàn)橛?6K線,所以它們以14位線號(hào)編號(hào)。64字節(jié)塊將未命中該高速緩存或命中獨(dú)特的14位線號(hào)。在任何使無(wú)效監(jiān)聽(tīng)中查找物理保護(hù)高速緩存。命中后,就檢索該命中的14位線號(hào),任選地提供被命中的64字節(jié)塊的6位號(hào)。對(duì)于每個(gè)流程,軟件將確保在其處理代碼前其原始代碼被覆蓋在物理保護(hù)高速緩存中。這可涉及擴(kuò)展已經(jīng)在高速緩存中的線的跨度或增加新線。軟件將獲得覆蓋該流程所需的線號(hào)的列表。例如,軟件將該列表減小至單個(gè)28位號(hào)。線號(hào)是14位。我們將2位用于線號(hào)中的每一位,有效位和數(shù)據(jù)位,因此28位用于14位線號(hào)。在每個(gè)位位置,如果整個(gè)列表在該位是什么上達(dá)成一致,它變?yōu)樗玫臄?shù)據(jù)位且有效位變?yōu)?。如果列表中對(duì)于位位置中的值有不同意見(jiàn),則所得的數(shù)據(jù)位變?yōu)?且有效位變?yōu)?。這28位是該流程的簽名。每個(gè)核在其熱代碼入口點(diǎn)高速緩存(未示出)中具有對(duì)所有流程的簽名。并且,具體地,它具有當(dāng)前暫時(shí)地全局提交流程的一個(gè)簽名。在保留的存儲(chǔ)器中有熱代碼入口點(diǎn)表,然而在一些實(shí)施例該表的部分被高速緩存。如果采用的分支被預(yù)測(cè),則在最寬范圍的高速緩存中查找其目標(biāo)。如果它未命中,則請(qǐng)求重新填充。如果它命中且沒(méi)有入口點(diǎn),則那是它的結(jié)束。如果有入口點(diǎn),則查找下一較小范圍的高速緩存。最后,它或者命中入口點(diǎn)、不命中入口點(diǎn),或者不確定但取得對(duì)高速緩存的重新填充。如果采用的分支目標(biāo)在保留的存儲(chǔ)器中,則沒(méi)有熱代碼入口點(diǎn)高速緩存查找。我們獲得所采用分支的標(biāo)識(shí)。如果我們命中入口點(diǎn),則當(dāng)該分支退役但仍被采用時(shí),我們強(qiáng)制跳躍至所指示的目標(biāo)且勞工也強(qiáng)制跳躍至所指示的入口點(diǎn)。檢查每個(gè)臨時(shí)全局提交流程。如果有線匹配,則將有流程退出。否則可允許它提交。這繼續(xù),直到在熱代碼入口點(diǎn)高速緩存被清洗之前進(jìn)入的所有流程完成。一旦該檢查處于適當(dāng)位置,則全局提交可重新開(kāi)始。必須檢查熱代碼入口點(diǎn)高速緩存中的所有簽名。如果有線匹配,則入口點(diǎn)被收回認(rèn)證。當(dāng)認(rèn)證代碼被調(diào)用時(shí),它將查看標(biāo)志。這表示在它能認(rèn)證任何入口點(diǎn)之前它必須處理保留的存儲(chǔ)器代理(未示出)中的工作列表。它讀取被命中的線號(hào)。它知道每個(gè)線號(hào)的準(zhǔn)確跨度。它準(zhǔn)確知道每個(gè)流程所需的高速緩存線。它刪除或者檢查已經(jīng)被命中的每個(gè)流程。它更新其整個(gè)熱代碼入口點(diǎn)表。然而它可進(jìn)行其認(rèn)證工作。每個(gè)核601執(zhí)行其自身的線程,而跨度標(biāo)記指示線程化代碼中與原始代碼中相同IP對(duì)應(yīng)的位置(IP)(在前面的圖中示出跨度標(biāo)記)。當(dāng)在該模式中執(zhí)行時(shí),硬件緩沖負(fù)載并存儲(chǔ)信息,防止任何存儲(chǔ)對(duì)外部可見(jiàn)(全局提交)。該信息可被存儲(chǔ)在多個(gè)高速緩存中。這些被示為推測(cè)負(fù)載數(shù)據(jù)高速緩存(SLC)603、負(fù)載存儲(chǔ)排序緩沖器(LSOB)605和推測(cè)存儲(chǔ)高速緩存(SSC)607。盡管這些被示為分離的,但在一些實(shí)施例中它們是單個(gè)實(shí)體的多個(gè)部分。另外,如所示,可以不按核為基礎(chǔ)配置該存儲(chǔ)。在一些實(shí)施例中,在捕捉該數(shù)據(jù)之前,它穿過(guò)排序緩沖器(OB)602,該排序緩沖器維持如前詳述的所執(zhí)行的負(fù)載和存儲(chǔ)的適當(dāng)退役順序。當(dāng)高級(jí)(較舊)存儲(chǔ)被寫入數(shù)據(jù)高速緩存且被置于SLC603中時(shí),存儲(chǔ)的物理地址和尺寸對(duì)于DTSE邏輯可用。SLC603還檢測(cè)使無(wú)效監(jiān)聽(tīng)。類似地,使負(fù)載地址和尺寸對(duì)于DTSE邏輯可用且被存儲(chǔ)在SLC中。還將負(fù)載和存儲(chǔ)寫入負(fù)載存儲(chǔ)排序緩沖器(LSOB)605,以保持每個(gè)線程中負(fù)載和存儲(chǔ)之間的排序信息。LSOB605維持?jǐn)?shù)據(jù)和掩碼(有效字節(jié))。最終DTSE邏輯獲得按適當(dāng)順序的退役負(fù)載地址連同其存儲(chǔ)地址。在一些實(shí)施例中,DTSE邏輯在執(zhí)行時(shí)獲得負(fù)載地址和尺寸。如果是這種情況,則DTSE邏輯將使它們老化(age)并過(guò)濾它們以獲得適當(dāng)排序的退役負(fù)載地址和尺寸。數(shù)據(jù)高速緩存當(dāng)兩個(gè)核達(dá)到跨度標(biāo)記時(shí),利用違背檢查組件(如下詳述的存儲(chǔ)正確性高速緩存(storecorrectnesscache,SCC)611和負(fù)載正確性高速緩存(loadcorrectnesscacheLCC)613)在負(fù)載和存儲(chǔ)中檢查違背。典型地,每個(gè)勞工有SCC611和LCC613。對(duì)于其勞工,用負(fù)載和存儲(chǔ)地址寫入SCC611。利用所有其它合作勞工的存儲(chǔ)地址讀取它。它示出在單個(gè)對(duì)齊跨度中由代碼寫入的字節(jié)。典型地這種情況是獨(dú)立的物理結(jié)構(gòu)。利用來(lái)自LSOB605的所有勞工的存儲(chǔ)地址寫入LCC613。利用其勞工的負(fù)載地址讀取它。典型地,這是保留存儲(chǔ)器中的數(shù)據(jù)結(jié)構(gòu)。如果沒(méi)有檢測(cè)到違背,則存儲(chǔ)變?yōu)槿痔峤?。存?chǔ)的提交指示在隨后跨度中的違背的情況下執(zhí)行應(yīng)跳至的檢查點(diǎn)。存在可能發(fā)生的若干違背。第一是來(lái)自外部實(shí)體(例如另一個(gè)核)的使無(wú)效監(jiān)聽(tīng),它使諸核之一使用的數(shù)據(jù)無(wú)效。因?yàn)橐恍┲凳羌僭O(shè)的(推測(cè)執(zhí)行),這可能是錯(cuò)誤的,所以執(zhí)行不得不中止并且原始代碼將返回最后的檢查點(diǎn)。當(dāng)在不同線程上的兩個(gè)存儲(chǔ)寫入同一跨度中的同一地址時(shí),存儲(chǔ)/存儲(chǔ)違背可能發(fā)生。在一些實(shí)施例中,因?yàn)樵趩蝹€(gè)跨度中的不同線程之間沒(méi)有排序,所以無(wú)法知道哪個(gè)存儲(chǔ)在原始程序順序中較晚,且線程化執(zhí)行模式中止并返回到原始執(zhí)行模式。如果在不同線程中的存儲(chǔ)和負(fù)載在同一跨度中使用存儲(chǔ)器中的同一地址,則存儲(chǔ)/負(fù)載違背可能發(fā)生。因?yàn)榫€程之間沒(méi)有通信,所以負(fù)載可能丟失通過(guò)存儲(chǔ)而存儲(chǔ)的數(shù)據(jù)。應(yīng)注意,通常不允許負(fù)載命中在任何過(guò)去的跨度中由其它核存儲(chǔ)的數(shù)據(jù)。這是因?yàn)楹霜?dú)立地執(zhí)行,且在其它核到達(dá)存儲(chǔ)之前負(fù)載可能已經(jīng)執(zhí)行(一個(gè)核可能提前其它核很多跨度)??赡馨l(fā)生自修改代碼或交叉修改代碼,其中原始代碼已經(jīng)由程序中的存儲(chǔ)或一些其它代理(例如核)修改。在這種情況下,線程化代碼可變得陳舊。由于性能優(yōu)化和架構(gòu)折衷而可能發(fā)生其它違背。這種違背的示例是L1數(shù)據(jù)高速緩存單元未命中,其命中丟棄的推測(cè)存儲(chǔ)(如果這不被硬件支持)。另一個(gè)示例是線程生成器做出假設(shè),而稍后被檢測(cè)是錯(cuò)誤的(斷言硬件塊609)。一旦保證沒(méi)有發(fā)生違背,則緩沖的存儲(chǔ)可被提交并全局可見(jiàn)。這自動(dòng)發(fā)生,否則存儲(chǔ)排序可能被損壞(存儲(chǔ)排序是處理器必須遵守的存儲(chǔ)器排序架構(gòu)的一部分)。當(dāng)執(zhí)行線程化模式時(shí),所有的存儲(chǔ)將不使用“規(guī)則”數(shù)據(jù)路徑,但將兩者寫入(執(zhí)行存儲(chǔ)的核的)第一級(jí)高速緩存,它將充當(dāng)私有、非一致暫存器(scratchpad),并且寫入專用的數(shù)據(jù)存儲(chǔ)。數(shù)據(jù)存儲(chǔ)(以上的高速緩存和緩沖器)中的信息將包括存儲(chǔ)的地址、數(shù)據(jù)和數(shù)據(jù)尺寸/掩碼。允許存儲(chǔ)組合,而存儲(chǔ)來(lái)自同一提交區(qū)。當(dāng)硬件決定提交狀態(tài)(在違背已經(jīng)被檢查到)時(shí),所有的存儲(chǔ)需要從數(shù)據(jù)存儲(chǔ)(例如,SSC607)排出并且變?yōu)橐恢碌目杀O(jiān)聽(tīng)狀態(tài)。這通過(guò)將來(lái)自數(shù)據(jù)存儲(chǔ)的存儲(chǔ)移至寫組合高速緩存(WCC)615來(lái)完成。在數(shù)據(jù)復(fù)制監(jiān)聽(tīng)其間,使無(wú)效將被發(fā)送到所有其它的一致性代理,所以存儲(chǔ)將獲取它們改變的高速緩存線的所有權(quán)。寫組合高速緩存615組合來(lái)自工作在同一優(yōu)化區(qū)中的不同代理(核和線程)的存儲(chǔ)并且使這些存儲(chǔ)變?yōu)槿挚梢?jiàn)狀態(tài)。一旦來(lái)自所有核的所有存儲(chǔ)被組合入WCC615,它變得可監(jiān)聽(tīng)。這將原子提交(維持存儲(chǔ)器排序規(guī)則)提供給中級(jí)高速緩存217。通過(guò)清除數(shù)據(jù)存儲(chǔ)中的一些“有效”位而使緩沖狀態(tài)在中止中被丟棄,從而去除所有經(jīng)緩沖的狀態(tài)。由于原始程序被分成兩個(gè)或更多個(gè)并發(fā)線程的事實(shí),可使用一致性檢查。如果軟件優(yōu)化器沒(méi)有正確地對(duì)負(fù)載和存儲(chǔ)消除歧意,則可能發(fā)生錯(cuò)誤結(jié)果。以下的硬件構(gòu)建塊用于檢查讀-寫和寫-寫沖突。負(fù)載-正確性-高速緩存(LCC)613保持在優(yōu)化區(qū)中執(zhí)行的負(fù)載的地址和數(shù)據(jù)尺寸(或掩碼)。它用于確保來(lái)自另一個(gè)邏輯核的存儲(chǔ)不會(huì)與來(lái)自經(jīng)優(yōu)化區(qū)的負(fù)載抵觸。在跨度違背檢查時(shí),每個(gè)核將其存儲(chǔ)寫入其它核的LCC613(設(shè)置該核寫入的每個(gè)字節(jié)的有效位)。LCC613然后保持其它核的存儲(chǔ)地址。然后每個(gè)核通過(guò)以下動(dòng)作檢查其自身的負(fù)載:在其LSOB(負(fù)載存儲(chǔ)排序緩沖器)605上迭代,復(fù)位其存儲(chǔ)寫入的每個(gè)字節(jié)的有效位以及檢查其未命中的每個(gè)負(fù)載,該字節(jié)具有設(shè)置為1的有效位(表示該字節(jié)由其它核寫入)。命中有效位1的負(fù)載被表示為違背。存儲(chǔ)-正確性-高速緩存(SCC)611保持在優(yōu)化區(qū)中執(zhí)行的存儲(chǔ)的地址和掩碼。來(lái)自該高速緩存的信息與合作邏輯核的LSOB605中的條目進(jìn)行比較,以確保沒(méi)有沖突不被檢測(cè)到。在跨度違背檢查時(shí),SCC611被復(fù)位。每個(gè)核將其存儲(chǔ)從其LSOB605寫入其它核的SCC611。然后相對(duì)于已經(jīng)在其SCC611中的其它核的存儲(chǔ),每個(gè)核檢查其存儲(chǔ)(來(lái)自LSOB)。如果存儲(chǔ)命中來(lái)自其它的存儲(chǔ),則檢測(cè)到違背。應(yīng)注意一些存儲(chǔ)可通過(guò)線程生成器復(fù)制。這些存儲(chǔ)必須由SCC611正確處理以防止錯(cuò)誤違背檢測(cè)。另外,推測(cè)-負(fù)載-高速緩存(SLC)603保衛(wèi)來(lái)自優(yōu)化區(qū)的負(fù)載,以防御來(lái)自邏輯核的監(jiān)聽(tīng)無(wú)效,這些邏輯核在線程化執(zhí)行方案描述下不合作,但可并發(fā)運(yùn)行同一應(yīng)用的其它線程或訪問(wèn)共享數(shù)據(jù)。在一些實(shí)施例中,本文描述的線程化執(zhí)行方案實(shí)現(xiàn)“全有或全無(wú)”策略,且優(yōu)化區(qū)中的所有存儲(chǔ)器事務(wù)應(yīng)被看作好像全部在單個(gè)時(shí)間點(diǎn)(提交時(shí)間)一起執(zhí)行。在DTSE執(zhí)行模式中,每個(gè)核的L1數(shù)據(jù)高速緩存作為暫存區(qū)工作。存儲(chǔ)不應(yīng)對(duì)監(jiān)聽(tīng)做出響應(yīng)(以防止任何存儲(chǔ)全局可見(jiàn)),且推測(cè)數(shù)據(jù)(未檢查/提交的數(shù)據(jù))不應(yīng)被寫回中級(jí)高速緩存。在退出該模式時(shí),應(yīng)從數(shù)據(jù)高速緩存中丟棄可能已經(jīng)退回的所有推測(cè)數(shù)據(jù)。注意,由于一些實(shí)現(xiàn)折衷,可能需要使所有存儲(chǔ)或加載的數(shù)據(jù)無(wú)效,該數(shù)據(jù)在線程化模式中已經(jīng)執(zhí)行。在數(shù)據(jù)高速緩存中,所有全局提交點(diǎn)的原始程序數(shù)據(jù)塊和跟蹤數(shù)據(jù)塊均存儲(chǔ)在相同的位置。它們均通過(guò)塊的原始程序地址來(lái)尋址。重要的是注意上述示例易于概括,以包括在DTSE執(zhí)行模式中合作的兩個(gè)以上的核。同樣由于停止或同步核執(zhí)行,而在硬件周圍發(fā)生一些違背(例如,一些負(fù)載/存儲(chǔ)違背)。在一些實(shí)施例中,提交不在每個(gè)跨度上完成。在這種情況下,將在每個(gè)跨度上完成違背檢查,但每隔幾個(gè)跨度完成提交一次(以減少寄存器檢查點(diǎn)開(kāi)銷)。在一些實(shí)施例中,數(shù)據(jù)高速緩存及其條目不是典型的。利用所支持的勞工量,數(shù)據(jù)高速緩存需要一些地址空間映射形式的幫助。例如,可利用x位地址空間映射來(lái)擴(kuò)展每個(gè)數(shù)據(jù)高速緩存標(biāo)簽(諸如假設(shè)每核4個(gè)勞工時(shí)的5位值、如果每核2個(gè)勞工的3位值或如果每核僅1個(gè)勞工的僅2位值)。在5位變量中,位4指示主邏輯處理器可訪問(wèn)該高速緩存線。每個(gè)勞工邏輯處理器具有在字段<3:0>中的一位。這指示相應(yīng)的勞工邏輯處理器是否可訪問(wèn)該線(例如,0001表示勞工邏輯處理器1能訪問(wèn)該線,而其它則不能)。如果它在地址空間映射中的位未被設(shè)置,則勞工邏輯處理器將獲得數(shù)據(jù)高速緩存未命中。如果在地址空間映射中的主位未被設(shè)置,則主邏輯處理器將獲得數(shù)據(jù)高速緩存未命中。假設(shè)每次存取將最多命中線中的一條線,數(shù)據(jù)高速緩存可包括在同一地址處的多個(gè)線(按多路)。這表示對(duì)于地址空間映射中的5位中的每一位,在同一地址處該位被設(shè)置的情況下,在數(shù)據(jù)高速緩存中有不多于1條線。在讀取具有相同標(biāo)簽的多路的數(shù)據(jù)高速緩存時(shí),將選擇請(qǐng)求邏輯處理器可訪問(wèn)的獨(dú)特路,如果有的話。如果沒(méi)有,則它是數(shù)據(jù)高速緩存未命中。在高級(jí)存儲(chǔ)處理(最舊存儲(chǔ)的處理)時(shí),高級(jí)存儲(chǔ)可僅進(jìn)行到執(zhí)行存儲(chǔ)的邏輯處理器可訪問(wèn)的高速緩存線。此外,如果勞工將高級(jí)存儲(chǔ)寫入數(shù)據(jù)高速緩存,則目標(biāo)線將其地址空間映射設(shè)置成僅可由進(jìn)行該存儲(chǔ)的邏輯處理器訪問(wèn)。出于此目的,所有的主邏輯處理器被視為相同。另外,在一些實(shí)施例中,存在與每個(gè)數(shù)據(jù)高速緩存線邏輯相關(guān)聯(lián)的“當(dāng)前位”。它不需要物理接近數(shù)據(jù)高速緩存或數(shù)據(jù)高速緩存標(biāo)簽。對(duì)于勞工邏輯處理器可訪問(wèn)的所有高速緩存線,在勞工邏輯處理器中的全局提交標(biāo)記變高級(jí)時(shí)清除當(dāng)前位。對(duì)線的任何成功寫入將其設(shè)置為“當(dāng)前”。對(duì)中級(jí)高速緩存的線寫回將其設(shè)置為“當(dāng)前”。在來(lái)自中級(jí)高速緩存的重新填充時(shí),如果為它臟且在中級(jí)高速緩存中非當(dāng)前,則線必須被設(shè)置為“非當(dāng)前”。否則,在數(shù)據(jù)高速緩存中將其設(shè)置為當(dāng)前。針對(duì)來(lái)自中級(jí)高速緩存的響應(yīng),以此方式設(shè)置當(dāng)前位,既使沒(méi)有數(shù)據(jù);MLC僅僅授予所有權(quán)。不常見(jiàn)的一件事是中級(jí)高速緩存形成臟和非當(dāng)前。這被返回到數(shù)據(jù)高速緩存并且設(shè)置數(shù)據(jù)高速緩存中的當(dāng)前位的狀態(tài),既使沒(méi)有數(shù)據(jù);MLC僅僅授予所有權(quán)。將高級(jí)存儲(chǔ)寫入其當(dāng)前位關(guān)閉的臟數(shù)據(jù)高速緩存線的嘗試在該存儲(chǔ)被置于數(shù)據(jù)高速緩存之前導(dǎo)致寫回,但不是使無(wú)效。進(jìn)行數(shù)據(jù)高速緩存線的寫回設(shè)置其當(dāng)前位。并且在其調(diào)用的寫回之后成功寫入高級(jí)存儲(chǔ)(如果適當(dāng))將該線設(shè)置為“當(dāng)前”。如果高級(jí)存儲(chǔ)的寫入命中干凈數(shù)據(jù)高速緩存線(E狀態(tài)),該干凈數(shù)據(jù)高速緩存線的當(dāng)前位關(guān)閉,則向中級(jí)高速緩存發(fā)信號(hào)(如果它是臟)以將該線的副本寫回到末級(jí)高速緩存,并且獲取新跟蹤數(shù)據(jù)塊的新物理地址。中級(jí)高速緩存的臟數(shù)據(jù)不進(jìn)入相同的全局提交跨度,因?yàn)樵撆K數(shù)據(jù)現(xiàn)在進(jìn)入數(shù)據(jù)高速緩存。作為將高級(jí)存儲(chǔ)寫入它的結(jié)果,數(shù)據(jù)高速緩存線獲取當(dāng)前。在一些實(shí)施例中,存在用于每個(gè)勞工邏輯處理器的元數(shù)據(jù)緩沖器(未示出)。元數(shù)據(jù)被順序地寫入緩沖器。元數(shù)據(jù)緩沖器應(yīng)能將此寫入中級(jí)高速緩存。跟蹤執(zhí)行導(dǎo)致被寫入保留存儲(chǔ)器的跟蹤數(shù)據(jù)以及被寫入保留存儲(chǔ)器的元數(shù)據(jù)。該過(guò)程的剩余部分是從保留存儲(chǔ)器讀回元數(shù)據(jù),檢查它,然后合并來(lái)自各跟蹤的從保留存儲(chǔ)器讀取的跟蹤數(shù)據(jù),以及使其作為原始程序地址空間的新?tīng)顟B(tài)而可見(jiàn)。在中級(jí)高速緩存217中,所有全局提交點(diǎn)的原始程序數(shù)據(jù)塊和跟蹤數(shù)據(jù)塊均存儲(chǔ)在相同的位置。它們均通過(guò)塊的原始程序地址來(lái)尋址。在中級(jí)高速緩存處,對(duì)保持中級(jí)高速緩存線的當(dāng)前真實(shí)物理地址的標(biāo)簽存在擴(kuò)展。需要真實(shí)的物理地址用于從中級(jí)高速緩存向末級(jí)高速緩存的寫回。它不用于中級(jí)高速緩存中的多數(shù)其它操作。在一些實(shí)施例中,真實(shí)的物理地址是跟蹤數(shù)據(jù)塊號(hào)。它不多于16位。在一些實(shí)施例中,與中級(jí)高速緩存相關(guān)聯(lián)的硬件寄存器保持每個(gè)勞工邏輯處理器的跟蹤數(shù)據(jù)空間的基本地址和限制以及每個(gè)跟蹤的最后分配的跟蹤數(shù)據(jù)塊。該硬件還保持當(dāng)前全局提交號(hào)。存在與每個(gè)中級(jí)高速緩存線邏輯相關(guān)聯(lián)的“當(dāng)前位”。它不需要物理接近中級(jí)高速緩存或中級(jí)高速緩存標(biāo)簽。對(duì)于勞工邏輯處理器可訪問(wèn)的所有高速緩存線,在勞工邏輯處理器中的全局提交標(biāo)記變高級(jí)時(shí)清除該位。在一些實(shí)施例中,用6位(假設(shè)我們支持每核4個(gè)勞工)地址空間映射擴(kuò)展每個(gè)中級(jí)高速緩存標(biāo)簽。該標(biāo)簽的尺寸依賴于每核的勞工數(shù)量。地址空間映射支持在中級(jí)高速緩存中同時(shí)以相同地址(包括相同標(biāo)簽)具有多條線。它規(guī)定哪些邏輯處理器可訪問(wèn)該線。在讀取具有相同標(biāo)簽的多路的中級(jí)高速緩存時(shí),將選擇請(qǐng)求邏輯處理器可訪問(wèn)的獨(dú)特路,如果有的話。如果沒(méi)有,則它是中級(jí)高速緩存未命中。在某些實(shí)施例中,中級(jí)高速緩存中的每條線可具有暫時(shí)提交位和暫時(shí)解除位。提交將包括對(duì)于所有暫時(shí)提交高速緩存線刷新清除真實(shí)物理地址上的有效位并且設(shè)置主訪問(wèn)、以及對(duì)于所有暫時(shí)解除高速緩存線刷新清除線有效位。在一些實(shí)施例中,存在具有各個(gè)DTSE集群的若干檢查器狀態(tài)機(jī)。每個(gè)檢查器狀態(tài)機(jī)可工作在線程上,所以所提供的狀態(tài)機(jī)的數(shù)量確定集群可同時(shí)工作的線程數(shù)量。檢查器狀態(tài)機(jī)從同一線程上工作的所有跟蹤讀取元數(shù)據(jù)列表,并且通過(guò)存儲(chǔ)正確性高速緩存和負(fù)載正確性高速緩存處理它們。它還對(duì)復(fù)制回列表進(jìn)行寫入。在一些實(shí)施例中,復(fù)制回狀態(tài)機(jī)將來(lái)自復(fù)制回列表的高速緩存線分布至合并狀態(tài)機(jī),且中級(jí)高速緩存進(jìn)行來(lái)自不同跟蹤的存儲(chǔ)數(shù)據(jù)的實(shí)際合并并將結(jié)果置于原始程序地址空間中。在一些實(shí)施例中,準(zhǔn)確地存在每中級(jí)高速緩存一個(gè)合并狀態(tài)機(jī)。當(dāng)必要時(shí),該狀態(tài)機(jī)進(jìn)行來(lái)自若干跟蹤的跟蹤數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)的實(shí)際合并。一旦負(fù)載被執(zhí)行,必須可證明除完成負(fù)載的線程外系統(tǒng)中的任何代理的存儲(chǔ)不可命中該負(fù)載直到負(fù)載被全局提交。應(yīng)有根據(jù)全局提交之前的任何負(fù)載或存儲(chǔ)的核退役,確保在該線程執(zhí)行中合作的一些中級(jí)高速緩存使目標(biāo)原始程序地址線至少處于共享狀態(tài)。該線可在合作中級(jí)高速緩存之間傳送(主-從方法),但必須維持連續(xù)占有。這表示對(duì)于獲得該線所有權(quán)的其它代理,當(dāng)沒(méi)有其它的合作中級(jí)高速緩存具有該線時(shí),合作中級(jí)高速緩存中的至少一個(gè)將獲得使無(wú)效監(jiān)聽(tīng)。典型地,每個(gè)DTSE集群具有占有高速緩存。該結(jié)構(gòu)指示高速緩存線,對(duì)于該高速緩存線我們可肯定集群中的一些中級(jí)高速緩存將從環(huán)或數(shù)據(jù)高速緩存中獲得監(jiān)聽(tīng)。典型地,占有高速緩存位于保留存儲(chǔ)器中,但一部分可利用檢查器來(lái)進(jìn)行高速緩存。每個(gè)勞工邏輯處理器具有推測(cè)訪問(wèn)高速緩存。推測(cè)訪問(wèn)高速緩存表示已經(jīng)由勞工邏輯處理器本地退役但還未全局提交的負(fù)載和存儲(chǔ)。全局提交標(biāo)記是對(duì)特殊地址的存儲(chǔ)。該數(shù)據(jù)將類號(hào)和指針給予提交指針描述符。提交等待是對(duì)特殊地址集的負(fù)載。它可出現(xiàn)在任何位置。取決于該地址集中的精確地址,它可以是在最后的全局提交點(diǎn)或某一類最后全局提交點(diǎn)處對(duì)提交的等待或其它可能的選擇。用于該負(fù)載的該地址可請(qǐng)求最后的全局提交存儲(chǔ)器狀態(tài)。DTSE將不對(duì)提交等待做出響應(yīng),因此在停止的請(qǐng)求勞工中保持執(zhí)行直到指定的全局提交已經(jīng)發(fā)生。如果最后的全局提交存儲(chǔ)器狀態(tài)被請(qǐng)求,則DTSE邏輯將進(jìn)一步使請(qǐng)求勞工中的所有跟蹤數(shù)據(jù)無(wú)效。然后,DTSE邏輯將返回用于提交等待的數(shù)據(jù)。這將使該勞工解除停止并允許它繼續(xù)。如果最后的全局提交存儲(chǔ)器狀態(tài)被請(qǐng)求,則在該等待中指定的全局提交點(diǎn)之后該勞工中的所有存儲(chǔ)將丟失。所以,一般而言,實(shí)際上僅在等待全局提交點(diǎn)之后但在該勞工進(jìn)行更多的存儲(chǔ)之前使用該選項(xiàng)。典型地,等待將緊隨其等待的全局提交點(diǎn)的全局提交標(biāo)記之后。等待有三個(gè)用途:等待可用于保護(hù)寄存器狀態(tài)免受改變,因此避免保持一些寄存器的必要性;當(dāng)負(fù)載有時(shí)命中不同跟蹤中的存儲(chǔ)時(shí),這向負(fù)載提供獲取正確結(jié)果的能力;以及它還可用于防止失控推測(cè)。II.操作數(shù)據(jù)存儲(chǔ)器狀態(tài)由數(shù)據(jù)本身和元數(shù)據(jù)表示。它們不僅被分開(kāi)存儲(chǔ)而且被不同地存儲(chǔ)。主邏輯處理器和勞工邏輯處理器二者均具有元數(shù)據(jù)。在沒(méi)有元數(shù)據(jù)的情況下,存儲(chǔ)器狀態(tài)對(duì)于勞工邏輯處理器沒(méi)有意義。元數(shù)據(jù)僅用于主邏輯處理器的概況分析。關(guān)于保留存儲(chǔ)器中的數(shù)據(jù)空間,在一些實(shí)施例中,每個(gè)跟蹤在保留存儲(chǔ)器中具有其自身的數(shù)據(jù)空間,如同每個(gè)勞工邏輯處理器一樣。主邏輯處理器不具有跟蹤數(shù)據(jù)空間。在流程的入口,所有的跟蹤數(shù)據(jù)空間是未分配的。在流程執(zhí)行時(shí),根據(jù)需要循環(huán)地、順序地分配高速緩存線尺寸塊。每次分配針對(duì)特定的全局提交跨度。當(dāng)這些塊被分配的跨度被全局提交時(shí),這些塊按順序解除分配。對(duì)于每個(gè)勞工邏輯處理器有一分配指針和一解除分配指針。這些指針包含塊號(hào),而不是地址。塊號(hào)空間將是對(duì)于該分配存在的多個(gè)物理塊數(shù)量的倍數(shù)。在分配中,塊號(hào)不能包裝。當(dāng)所有的塊號(hào)已經(jīng)分配一次,該跟蹤不能分配更多的跟蹤數(shù)據(jù)塊。如果需要更多的分配,這將導(dǎo)致流程退出。另一方面,物理塊的分配可包裝多次,直到不包裝塊號(hào)的極限。中級(jí)高速緩存中具有其真實(shí)物理地址中的解除分配塊號(hào)的線將不會(huì)寫回到末級(jí)高速緩存。類似地,如果在中級(jí)高速緩存中有未命中且用于重新填充的真實(shí)物理地址是解除分配的塊號(hào),則重新填充將替代地來(lái)自原始程序地址。這一線在其中不能具有推測(cè)存儲(chǔ)。如果有推測(cè)存儲(chǔ),它最近可能已經(jīng)被重新分配??梢?jiàn),應(yīng)有足夠的物理塊以分配用于跟蹤數(shù)據(jù),以覆蓋跟蹤在它們執(zhí)行的代碼的邏輯位置中相差的量加上一些以覆蓋檢查和全局提交的時(shí)間。塊號(hào)空間需要覆蓋流程從開(kāi)始至流程退出的整個(gè)執(zhí)行。如果在跟蹤中有狀態(tài)恢復(fù),則利用分配的原始開(kāi)始點(diǎn),將執(zhí)行跟蹤的勞工的跟蹤數(shù)據(jù)空間初始化為空。分配在跟蹤被執(zhí)行時(shí)與勞工邏輯處理器相關(guān)聯(lián)的邏輯中發(fā)生。復(fù)制回狀態(tài)機(jī)將該空間中特定位置與全局提交過(guò)程中稍后的存儲(chǔ)相關(guān)聯(lián)。對(duì)于使用中的每個(gè)合并狀態(tài)機(jī),復(fù)制回狀態(tài)機(jī)將合并工作隊(duì)列寫在存儲(chǔ)器中。這描述了合并狀態(tài)機(jī)應(yīng)訪問(wèn)的跟蹤數(shù)據(jù)塊。因此這通過(guò)存儲(chǔ)器,所以這將被盡可能地保持壓縮。用于每一個(gè)邏輯處理器的元數(shù)據(jù)被分開(kāi)存儲(chǔ)。在一些實(shí)施例中,用于邏輯處理器的元數(shù)據(jù)是程序正確地址、尺寸和負(fù)載/存儲(chǔ)指示符的線性陣列。它包含對(duì)齊標(biāo)記和全局提交標(biāo)記以及復(fù)制的存儲(chǔ)標(biāo)記。它還可包含分支方向、間接分支的目標(biāo)。它還可以是在中級(jí)高速緩存處接收的使無(wú)效記錄當(dāng)核加載到數(shù)據(jù)的原始程序地址時(shí),硬件將捕捉地址和尺寸并將其添加至元數(shù)據(jù)列表。如果勞工從主邏輯處理器可訪問(wèn)和擁有的數(shù)據(jù)高速緩存線加載,則(如果設(shè)計(jì)方便的話)在強(qiáng)制對(duì)中級(jí)高速緩存的寫回后如果中級(jí)高速緩存是臟,它使其共享。如果這不方便,則它替代地使該線不是主邏輯處理器可訪問(wèn)的且不是當(dāng)前的。這些動(dòng)作中的任一個(gè)將確保通過(guò)不與該勞工合作的邏輯處理器向該線通知任何未來(lái)的存儲(chǔ)。在執(zhí)行模式中來(lái)自勞工的高級(jí)存儲(chǔ)不需要數(shù)據(jù)高速緩存中的所有權(quán)來(lái)寫入數(shù)據(jù)高速緩存。高級(jí)存儲(chǔ)可被寫入共享狀態(tài)中的線,但該線必須可由跟蹤訪問(wèn)。在任何事件中,如果來(lái)自Catalina勞工的高級(jí)存儲(chǔ)被寫入數(shù)據(jù)高速緩存線,則該線變得僅可由該勞工訪問(wèn)。不管該線以前是什么,它已經(jīng)被轉(zhuǎn)換成跟蹤數(shù)據(jù)。注意,如果線為臟,則在一些實(shí)施例中,它可能已經(jīng)在高級(jí)存儲(chǔ)被寫入之前被強(qiáng)制寫回,除非它已經(jīng)是跟蹤數(shù)據(jù)且是當(dāng)前的。因此,當(dāng)處理至該線的高級(jí)存儲(chǔ)時(shí),不請(qǐng)求對(duì)數(shù)據(jù)高速緩存線的所有權(quán)。因?yàn)檫@真是對(duì)跟蹤數(shù)據(jù)的存儲(chǔ),中級(jí)高速緩存將不需要或請(qǐng)求原始程序地址線的所有權(quán)。它將具有跟蹤數(shù)據(jù)線的所有權(quán)。這是重要的,因?yàn)槠渌櫩纱鎯?chǔ)至該線。合并引擎將需要獲得原始程序地址線的所有權(quán)以進(jìn)行提交。其它中級(jí)高速緩存可使線共享并由跟蹤讀取(而不是通過(guò)主邏輯處理器),但不能擁有它。由于此處描述的規(guī)定,它們不需要擁有它且將不請(qǐng)求擁有它。這表示當(dāng)一個(gè)中級(jí)高速緩存被用于進(jìn)行合并且正提交,并且它要求原始程序地址線的所有權(quán)時(shí),其它跟蹤可保持該線為共享狀態(tài)并對(duì)其進(jìn)行讀取和寫入(如所述,對(duì)其寫入將其轉(zhuǎn)換成跟蹤數(shù)據(jù))。在數(shù)據(jù)高速緩存未命中時(shí),照常從中級(jí)高速緩存請(qǐng)求該線。當(dāng)核向數(shù)據(jù)的原始程序地址存儲(chǔ)時(shí),硬件將捕捉地址和尺寸并將其添加至元數(shù)據(jù)列表。在數(shù)據(jù)高速緩存中,所有全局提交點(diǎn)的原始程序數(shù)據(jù)塊和跟蹤數(shù)據(jù)塊均位于相同的位置。它們均通過(guò)塊的原始程序地址來(lái)尋址。在全局提交點(diǎn)標(biāo)記變?yōu)楦呒?jí)時(shí),對(duì)于該勞工可訪問(wèn)的所有高速緩存線清除當(dāng)前位。對(duì)線的任何成功寫入將其設(shè)置為“當(dāng)前”。對(duì)中級(jí)高速緩存的線寫回將其設(shè)置為“當(dāng)前”。在來(lái)自中級(jí)高速緩存的重新填充時(shí),如果為它臟且在中級(jí)高速緩存中非當(dāng)前,則線必須被設(shè)置為“非當(dāng)前”。否則,在數(shù)據(jù)高速緩存中將其設(shè)置為當(dāng)前。針對(duì)來(lái)自中級(jí)高速緩存的響應(yīng),以此方式設(shè)置當(dāng)前位,既使沒(méi)有數(shù)據(jù)。勞工將高級(jí)存儲(chǔ)寫入其當(dāng)前位關(guān)閉的臟數(shù)據(jù)高速緩存線的嘗試在該存儲(chǔ)被置于數(shù)據(jù)高速緩存之前導(dǎo)致寫回,但不是使無(wú)效。設(shè)置一位,且該寫回告訴中級(jí)高速緩存分配新的跟蹤數(shù)據(jù)塊。進(jìn)行數(shù)據(jù)高速緩存線的寫回設(shè)置其當(dāng)前位。并且在其調(diào)用的寫回之后成功寫入高級(jí)存儲(chǔ)(如果適當(dāng))將該線設(shè)置為“當(dāng)前”。有權(quán)訪問(wèn)該線的勞工將高級(jí)存儲(chǔ)寫入主邏輯處理器可訪問(wèn)的臟數(shù)據(jù)高速緩存線的嘗試在該存儲(chǔ)被置于數(shù)據(jù)高速緩存之前導(dǎo)致寫回,但不是使無(wú)效。設(shè)置一位,且該寫回告訴中級(jí)高速緩存分配新的跟蹤數(shù)據(jù)塊。進(jìn)行數(shù)據(jù)高速緩存線的寫回設(shè)置其當(dāng)前位。并且在其調(diào)用的寫回之后成功寫入高級(jí)存儲(chǔ)(如果適當(dāng))將該線設(shè)置為“當(dāng)前”。如果有權(quán)訪問(wèn)該線的勞工將高級(jí)存儲(chǔ)寫入主邏輯處理器可訪問(wèn)的干凈數(shù)據(jù)高速緩存線,則向中級(jí)高速緩存發(fā)信號(hào)以將該線寫回到末級(jí)高速緩存(如果該線是臟)且無(wú)條件獲取新跟蹤數(shù)據(jù)塊的新物理地址。成功寫入高級(jí)存儲(chǔ)將線設(shè)置為“當(dāng)前”。如果勞工的高級(jí)存儲(chǔ)寫入命中干凈數(shù)據(jù)高速緩存線(E狀態(tài)),該干凈數(shù)據(jù)高速緩存線的當(dāng)前位關(guān)閉,則向中級(jí)高速緩存發(fā)信號(hào)(如果它是臟)以有條件地將該線的副本寫回到末級(jí)高速緩存,并且獲取新跟蹤數(shù)據(jù)塊的新物理地址。中級(jí)高速緩存的臟數(shù)據(jù)不進(jìn)入相同的全局提交跨度,因?yàn)樵撆K數(shù)據(jù)現(xiàn)在進(jìn)入數(shù)據(jù)高速緩存。作為將高級(jí)存儲(chǔ)寫入它的結(jié)果,數(shù)據(jù)高速緩存線獲取當(dāng)前。如果有高級(jí)存儲(chǔ)且在數(shù)據(jù)高速緩存中線不是E或M狀態(tài),照常對(duì)來(lái)自中級(jí)高速緩存的線進(jìn)行針對(duì)所有權(quán)請(qǐng)求的讀取。數(shù)據(jù)高速緩存可請(qǐng)求中級(jí)高速緩存“寫回”線并且分配新跟蹤數(shù)據(jù)塊。如果在中級(jí)高速緩存中線是臟的,則它被寫回并且新跟蹤數(shù)據(jù)塊被分配。既使在中級(jí)高速緩存中線是干凈的,請(qǐng)求也可指定無(wú)條件分配新跟蹤數(shù)據(jù)塊。如果新跟蹤數(shù)據(jù)塊被分配,則取代曾經(jīng)在這里的塊。數(shù)據(jù)是相同的。在對(duì)中級(jí)高速緩存的所有寫回時(shí),數(shù)據(jù)高速緩存“當(dāng)前位”(在由于此寫回而設(shè)置它之前)被發(fā)送到中級(jí)高速緩存。數(shù)據(jù)高速緩存寫回有兩個(gè)原因:這可能是數(shù)據(jù)高速緩存的傳統(tǒng)驅(qū)逐或新的高級(jí)存儲(chǔ)已經(jīng)命中并非當(dāng)前的臟數(shù)據(jù)高速緩存線。如果新的高級(jí)存儲(chǔ)已經(jīng)命中并非當(dāng)前的臟數(shù)據(jù)高速緩存線,則數(shù)據(jù)高速緩存發(fā)送被斷言的位。中級(jí)高速緩存將分配新跟蹤數(shù)據(jù)塊。在一些實(shí)施例中,在用于每個(gè)跟蹤的保留存儲(chǔ)器中有一高速緩存,即跟蹤數(shù)據(jù)目錄。線中的數(shù)據(jù)僅僅是跟蹤數(shù)據(jù)塊號(hào)和全局提交號(hào)。不與分配新跟蹤數(shù)據(jù)塊相接合,僅在跟蹤可訪問(wèn)但主邏輯處理器不可訪問(wèn)的臟跟蹤數(shù)據(jù)塊被驅(qū)逐時(shí),該高速緩存被寫入。在一些實(shí)施例中,存在另一個(gè)結(jié)構(gòu),其鏡像跟蹤數(shù)據(jù)目錄,稱為跟蹤數(shù)據(jù)目錄概要。如果存在勞工邏輯處理器的中級(jí)高速緩存未命中,則從跟蹤數(shù)據(jù)目錄概要讀取覆蓋跟蹤數(shù)據(jù)目錄中其位置的位。通常它將是無(wú)效的,指示跟蹤數(shù)據(jù)目錄中的未命中。在這種情況下,對(duì)中級(jí)高速緩存的重新填充來(lái)自塊的原始程序地址。該數(shù)據(jù)可能已經(jīng)在中級(jí)高速緩存中作為主邏輯處理器可訪問(wèn)的版本。在這種情況下,可簡(jiǎn)單地使該版本對(duì)于勞工也可訪問(wèn)。如果概要顯示命中的可能性,則如果證明實(shí)際上是命中,跟蹤數(shù)據(jù)目錄必須被訪問(wèn)以獲得最當(dāng)前的跟蹤數(shù)據(jù)塊號(hào)。邏輯可將此轉(zhuǎn)換成塊的地址。然后經(jīng)由環(huán)請(qǐng)求該塊,像未命中那樣。分配新的跟蹤數(shù)據(jù)塊是一種特殊形式的從中級(jí)高速緩存至末級(jí)高速緩存的寫回。如果中級(jí)高速緩存想要將線寫回到末級(jí)高速緩存,且該線不是主邏輯處理器可訪問(wèn)的,但不具有有效的真實(shí)物理地址,則在寫回可進(jìn)行之前為其分配新的跟蹤數(shù)據(jù)塊。寫回進(jìn)行到通過(guò)分配新的跟蹤數(shù)據(jù)塊獲得的物理地址。在本說(shuō)明書(shū)的較早部分處理分配新的跟蹤數(shù)據(jù)塊的過(guò)程。在每個(gè)跟蹤中,執(zhí)行將分離地命中全局提交點(diǎn)。此處有對(duì)特殊地址的存儲(chǔ),該特殊地址用作全局提交點(diǎn)標(biāo)記。它給予新全局提交號(hào)遞增。其自身跟蹤中的全局提交號(hào)前進(jìn)。將這保持為與中級(jí)高速緩存相關(guān)聯(lián)的DTSE邏輯的一部分。如上所指出的,這將導(dǎo)致存儲(chǔ)進(jìn)行到新的數(shù)據(jù)塊。并且與數(shù)據(jù)高速緩存和中級(jí)高速緩存相關(guān)聯(lián)的“當(dāng)前位”被清除。存儲(chǔ)變?yōu)閮H在全局提交點(diǎn)被全局觀察。負(fù)載和存儲(chǔ)兩者被全局推測(cè),因此易受使無(wú)效監(jiān)聽(tīng)命中的影響,直到下一全局提交點(diǎn)。跟蹤設(shè)置指示它已經(jīng)完成該提交跨度的標(biāo)志。檢查器狀態(tài)機(jī)等待來(lái)自所有跟蹤的該標(biāo)志。如上所述,每個(gè)勞工邏輯處理器具有存儲(chǔ)正確性高速緩存。該高速緩存強(qiáng)調(diào)在同一對(duì)齊跨度中一個(gè)勞工中的存儲(chǔ)必須不能命中另一個(gè)勞工中的存儲(chǔ)除非它們是同一存儲(chǔ)的規(guī)則。它還強(qiáng)調(diào)在同一對(duì)齊跨度中一個(gè)勞工中的存儲(chǔ)必須不能與另一個(gè)勞工中的存儲(chǔ)沖突的規(guī)則。它強(qiáng)調(diào)在負(fù)載偶然首先處理且存儲(chǔ)稍后處理的情況。如果存儲(chǔ)被首先處理且負(fù)載稍后,這被負(fù)載正確性高速緩存捕捉。如上詳述,每個(gè)勞工邏輯處理器具有負(fù)載正確性高速緩存。負(fù)載正確性高速緩存標(biāo)識(shí)從進(jìn)入流程至當(dāng)前的暫時(shí)提交點(diǎn)已經(jīng)被存儲(chǔ)的所有字節(jié)。具體地,它告訴哪個(gè)勞工是該字節(jié)的邏輯最后寫入者。復(fù)制回狀態(tài)機(jī)工作在復(fù)制回列表上以將所有指示的存儲(chǔ)合并到原始程序地址位置并使它們?nèi)挚梢?jiàn)。復(fù)制回列表表示不是按程序順序的存儲(chǔ)聚集。因此必須使在復(fù)制回列表中表示的所有存儲(chǔ)原子地全局可見(jiàn)。外部世界必須看見(jiàn)這些存儲(chǔ)中的全部或一個(gè)都看不到。如果由于諸如僅執(zhí)行分支違背或存儲(chǔ)違背或負(fù)載違背之類的內(nèi)部問(wèn)題而有流程退出,則狀態(tài)將被恢復(fù)到流程退出前的最后全局提交點(diǎn)。這將等待復(fù)制回狀態(tài)機(jī)完成,所以它確實(shí)是違背前的邏輯最后全局提交點(diǎn)。如果由于諸如命中全局推測(cè)負(fù)載的使無(wú)效監(jiān)聽(tīng)之類的某些外部問(wèn)題而有流程退出,則所涉及的指令可能在已經(jīng)被釋放到復(fù)制回狀態(tài)機(jī)的跨度中。除非已知這不是這種情況,否則這必然導(dǎo)致立即退出而不全局提交復(fù)制回狀態(tài)機(jī)當(dāng)前工作的復(fù)制回列表。從數(shù)據(jù)高速緩存的角度看,合并狀態(tài)機(jī)類似于另一種數(shù)據(jù)高速緩存。如果合并狀態(tài)機(jī)訪問(wèn)高速緩存線,則如果在數(shù)據(jù)高速緩存中該線是臟的,這監(jiān)聽(tīng)數(shù)據(jù)高速緩存并且將強(qiáng)制寫回。經(jīng)修改的塊可跨越多個(gè)中級(jí)高速緩存,所以我們具有很少的同步:阻斷對(duì)原始程序地址塊的所有訪問(wèn)(僅對(duì)跟蹤數(shù)據(jù)的訪問(wèn)被讀取并且良好)。暫時(shí)位用于此。當(dāng)運(yùn)行優(yōu)化(線程化)代碼時(shí),由于優(yōu)化代碼或者通過(guò)同時(shí)運(yùn)行的不相關(guān)代碼(或者甚至通過(guò)相同代碼)生成的存儲(chǔ),原始代碼可改變。為了進(jìn)行提防,使用XMC保護(hù)數(shù)據(jù)高速緩存(XGC)409。該高速緩存保持所有頁(yè)的地址(按頁(yè)粒度),它們被訪問(wèn)以便生成在監(jiān)聽(tīng)使無(wú)效命中的情況下使用的優(yōu)化代碼和優(yōu)化區(qū)ID。區(qū)ID指示所有的靜態(tài)代碼線,所有的靜態(tài)代碼線的聯(lián)合觸摸到被保護(hù)的區(qū)域(高速緩存線)。圖7示出根據(jù)一些實(shí)施例的XGC409的使用。在執(zhí)行優(yōu)化代碼之前,代碼保證XGC中的所有條目存在并且未被監(jiān)聽(tīng)或取代。在這種情況下,允許執(zhí)行優(yōu)化代碼。如果在優(yōu)化代碼被執(zhí)行的時(shí)段中,另一個(gè)邏輯核改變?cè)柬?yè)之一中的數(shù)據(jù),則XGC將接收監(jiān)聽(tīng)使無(wú)效消息(類似于一致性領(lǐng)域中的任意其它高速緩存代理)并且將通知核之一它必須中止執(zhí)行與給定頁(yè)相關(guān)聯(lián)的優(yōu)化代碼并且使其保持的使用該頁(yè)的任何優(yōu)化代碼入口點(diǎn)無(wú)效。當(dāng)在線程化執(zhí)行模式中執(zhí)行時(shí),相對(duì)于XMC409檢查每個(gè)存儲(chǔ),以提防自修改代碼。如果存儲(chǔ)命中熱代碼區(qū),違背將被觸發(fā)。在一些實(shí)施例中,線程生成器進(jìn)行一些假設(shè),稍后將檢查這些假設(shè)的正確性。這主要是性能優(yōu)化。這一假設(shè)的示例是調(diào)用-返回配對(duì)。線程生成器可假設(shè)返回將回到其調(diào)用(大多數(shù)時(shí)間它是正確的)。因此,線程生成器可將整個(gè)調(diào)用函數(shù)置于一個(gè)線程且允許以下代碼(在返回后)在其它線程中執(zhí)行。因?yàn)樵诜祷貓?zhí)行前以下代碼將開(kāi)始執(zhí)行,且棧被查找,所以執(zhí)行可能是錯(cuò)誤的(例如,當(dāng)函數(shù)將返回地址寫入棧,蓋寫原始返回地址)。為了提防這些情況,每個(gè)線程可將斷言寫入斷言硬件塊。如果兩個(gè)線程就斷言達(dá)成一致,則斷言被滿足。斷言必須被滿足以便提交跨度。III.軟件動(dòng)態(tài)線程切換執(zhí)行(DTSE)軟件使用由硬件收集的概況分析信息來(lái)限定稱為“流程”的代碼的重要靜態(tài)子集。在一些實(shí)施例中,該軟件具有其自己的工作存儲(chǔ)器空間。流程中的原始代碼在該工作存儲(chǔ)器中被再造??赏ㄟ^(guò)軟件改變工作存儲(chǔ)器中的代碼復(fù)制。原始代碼被精確的保持為其原始形式、在存儲(chǔ)器中的其原始位置。DTSE軟件可將DTSE工作存儲(chǔ)器中的流程分解成能夠在多邏輯處理器上執(zhí)行的多個(gè)線程。如果在沒(méi)有該動(dòng)作的情況下邏輯處理器未被完全利用,則這將會(huì)進(jìn)行。通過(guò)硬件可以做的五件事來(lái)使這成為可能。在任一情況下,DTSE軟件將代碼插入DTSE工作存儲(chǔ)器中的流程中以控制較大量邏輯處理器的(可能的SMT)硬件處理器上的處理。在一些實(shí)施例中,硬件該繼續(xù)概況分析運(yùn)行的代碼,包括DTSE軟件已經(jīng)處理的流程。DTSE軟件對(duì)改變的行為做出響應(yīng)以修訂它對(duì)代碼的先前處理。因此軟件將系統(tǒng)地(如果緩慢)改進(jìn)其處理的代碼。限定流程當(dāng)DTSE硬件在其列表的頂部具有新IP時(shí),軟件將IP作為新流程的概況根。軟件將指導(dǎo)硬件從該概況根獲取概況。在實(shí)施例中,在一個(gè)連續(xù)的沖擊中,硬件將使概況在下次執(zhí)行命中概況根IP時(shí)開(kāi)始并且之后擴(kuò)展大致50000動(dòng)態(tài)指令。用所有負(fù)載和存儲(chǔ)的地址、直接分支的方向和間接分支的目標(biāo)填充存儲(chǔ)器中的緩沖器。包括返回。由此,軟件可在靜態(tài)代碼的概況根處開(kāi)始,并且跟蹤穿過(guò)靜態(tài)代碼的概況分析路徑??烧业椒謧€(gè)分支的實(shí)際目標(biāo),并且所有負(fù)載和存儲(chǔ)的目標(biāo)地址是已知的。由該概況路徑命中的所有靜態(tài)指令被限定為在流程中。由該概況路徑命中的每個(gè)控制流程路徑被限定為在流程中。未被該概況路徑命中的每個(gè)控制流程路徑被限定為離開(kāi)流程。在一些實(shí)施例中,DTSE軟件將指導(dǎo)硬件再次從相同的根獲取概況。已經(jīng)不再流程中的新指令或新路徑被添加到流程。軟件在其獲得概況時(shí)將停止請(qǐng)求更多概況,這不會(huì)將指令或路徑添加到流程。流程維護(hù)在已經(jīng)限定流程之后,它可被監(jiān)視和修訂。這包括在已經(jīng)為其生成新代碼之后,可能在多個(gè)線程中。如果流程被修訂,通常這表示代碼(可能是線程化代碼)應(yīng)被重新生成。老化無(wú)效流程在一些實(shí)施例中,為每個(gè)流程保持“指數(shù)老化的”平均流程長(zhǎng)度L。在實(shí)施例中,L被初始化為500000。當(dāng)流程被執(zhí)行時(shí),使流程中執(zhí)行的指令數(shù)為N。然后計(jì)算:L=0.9*(L+N)。如果對(duì)于流程L低于設(shè)定數(shù)(假設(shè)100000),則該流程被刪除。這還表示這些指令合格來(lái)再次成為熱IP,除非它們?cè)谝恍┢渌鞒讨?。合并流程。在一些?shí)施例中,當(dāng)流程被執(zhí)行時(shí),如果在動(dòng)態(tài)指令的設(shè)定數(shù)(例如,25000)之前存在流程退出,則其熱代碼入口點(diǎn)被設(shè)定成獲得概況而不是執(zhí)行熱代碼。下次熱代碼入口點(diǎn)被命中時(shí),對(duì)于從該入口點(diǎn)開(kāi)始的若干指令(例如,50000)獲取概況。這添加到該流程的概況集合。任何新指令和新路徑被添加到該流程。在一些實(shí)施例中,利用集合中的新概況再次進(jìn)行流程分析和代碼生成。拓?fù)浞治鲈谝恍?shí)施例中,DTSE軟件執(zhí)行拓?fù)浞治?。該分析可包括以下活?dòng)中的一個(gè)或多個(gè)?;緣KDTSE軟件將流程的代碼分成基本塊。在一些實(shí)施例中,僅將概況分析中已經(jīng)觀察到的連接點(diǎn)保持為連接點(diǎn)。所以既使在流程中存在具有明確目標(biāo)的分支且該目標(biāo)在流程中的情況下,如果該連接點(diǎn)未在概況分析中觀察到出現(xiàn),該連接點(diǎn)仍將被忽略。在概況分析中未觀察到發(fā)生的所有控制流程路徑(邊沿)被標(biāo)記為“離開(kāi)流程”。這包括被觀察到總是采用的分支的下降(未采用的分支)方向。在概況中單調(diào)的分支,包括無(wú)條件分支不結(jié)束基本塊除非目標(biāo)是連接點(diǎn)。調(diào)用和返回結(jié)束基本塊。在進(jìn)行以上之后,DTSE軟件現(xiàn)在具有基本塊的集合和基本塊之間的“邊緣”的集合。拓?fù)涓谝恍?shí)施例中,每個(gè)概況用于引導(dǎo)該流程的靜態(tài)代碼的遍歷。在每次調(diào)用的該遍歷中,調(diào)用目標(biāo)基本塊標(biāo)識(shí)符被推至棧,并在每次返回,棧被彈出(popped)。既使整個(gè)代碼流可能具有平衡的調(diào)用和返回,該流程是從動(dòng)態(tài)執(zhí)行的片斷開(kāi)始的,該片段具有更多或更少的隨機(jī)開(kāi)始和結(jié)束點(diǎn)。沒(méi)有理由認(rèn)為該調(diào)用和返回在流程中平衡。如果有的話,遇到的每個(gè)基本塊被標(biāo)記為在由棧頂部上的基本塊標(biāo)識(shí)符所標(biāo)識(shí)的過(guò)程中。來(lái)自概況根的代碼最初不在任何過(guò)程中。稍后在概況中,可能再次遇到該代碼,其中它將被標(biāo)識(shí)為在過(guò)程中。更加可能的是有一些代碼不再任何過(guò)程中。拓?fù)浞治龅馁|(zhì)量取決于用于拓?fù)浞治龅母?。典型地,為了得到良好的拓?fù)浞治?,根?yīng)在限定在流程中的靜態(tài)代碼的最外過(guò)程中,即在“不在任何過(guò)程中”的代碼中。被硬件找到的概況根可能不是概況根。因此DTSE軟件限定拓?fù)浞治鏊褂玫耐負(fù)涓?。在一些?shí)施例中,對(duì)于不在任何過(guò)程中的基本塊,代碼的子集R被標(biāo)識(shí),使得從R中的任何指令開(kāi)始,但僅使用該流程的邊緣,即,在至少一個(gè)概況中被觀察到被采用的邊緣,存在至流程中的每個(gè)其它指令的路徑。R可能為空。如果R是空,則限定拓?fù)涓歉艣r根。如果R不是空,則拾取R中數(shù)字最低的IP值作為拓?fù)涓?。從此處開(kāi)始,任何提及的“根”表示拓?fù)涓?。過(guò)程內(nèi)聯(lián)傳統(tǒng)的過(guò)程內(nèi)聯(lián)用于消除調(diào)用和返回開(kāi)銷的目的。DTSE軟件保持關(guān)于代碼行為的信息。取決于代碼調(diào)用什么,過(guò)程中的代碼表現(xiàn)不同。因此,在一些實(shí)施例中,DTSE軟件對(duì)于該過(guò)程的每次不同靜態(tài)調(diào)用保持單獨(dú)的關(guān)于過(guò)程中代碼的信息表。該代碼的中間階段是不可執(zhí)行的。當(dāng)完成分析時(shí),DTSE軟件將生成可執(zhí)行代碼。在該中間狀態(tài),沒(méi)有過(guò)程中的用于內(nèi)聯(lián)的代碼的復(fù)制。過(guò)程內(nèi)聯(lián)將多個(gè)名字分配給過(guò)程的代碼并且保持關(guān)于每個(gè)名字的單獨(dú)信息。在一些實(shí)施例中,這是遞歸的。如果外部過(guò)程A從3個(gè)不同的地點(diǎn)調(diào)用過(guò)程B,并且過(guò)程B從4個(gè)不同的地點(diǎn)調(diào)用過(guò)程C,則有用于過(guò)程C的12種不同行為。DTSE軟件將保持關(guān)于過(guò)程C中的代碼的12個(gè)不同信息表,對(duì)應(yīng)于對(duì)該代碼的12個(gè)不同調(diào)用路徑,和用于該代碼的12個(gè)不同名字。當(dāng)DTSE軟件生成用于該流程的可執(zhí)行代碼時(shí),可能有該代碼的遠(yuǎn)小于12個(gè)靜態(tài)副本。具有相同代碼位的多個(gè)副本不是感興趣的,且在多數(shù)情況下,調(diào)用和返回開(kāi)銷較小。然而,在一些實(shí)施例中,DTSE軟件為至該代碼的每個(gè)調(diào)用路徑保持單獨(dú)的行為信息。DTSE保持的行為信息的示例首先是指令依賴性、以及負(fù)載和存儲(chǔ)目標(biāo)及分支可能性。在一些實(shí)施例中,DTSE軟件將假設(shè)如果在原始代碼中有靜態(tài)調(diào)用指令,則從所調(diào)用的過(guò)程返回將總是進(jìn)入調(diào)用之后的指令,除非觀察到這在概況分析中未發(fā)生。然而,在一些實(shí)施例中,檢查到這在執(zhí)行時(shí)正確。DTSE軟件生成的代碼將對(duì)此進(jìn)行檢查。在一些實(shí)施例中,在DTSE生成的最終的可執(zhí)行代碼中,對(duì)于原始代碼中的調(diào)用指令,存在將架構(gòu)返回地址推入程序的架構(gòu)棧的指令。注意,這不能通過(guò)所生成的代碼中的調(diào)用指令來(lái)完成,因?yàn)樗傻拇a在完全不同的位置且將會(huì)將錯(cuò)誤的值推到棧上。推到棧上的該值對(duì)于熱代碼幾乎無(wú)用。用于程序的數(shù)據(jù)空間將始終保持正確。如果生成多個(gè)線程,則哪個(gè)線程來(lái)完成是沒(méi)有區(qū)別的。它應(yīng)在某個(gè)位置某些時(shí)間完成。在一些實(shí)施例中,如果過(guò)程非常小,則DTSE軟件可選擇將在特定線程中進(jìn)行的過(guò)程的部分的物理副本物理地放在線中。否則,此處沒(méi)有物理副本,且將有某種類型的控制傳遞指令,以進(jìn)入該代碼。這將在“代碼生成”下進(jìn)行更多的描述。在一些實(shí)施例中,在DTSE生成的最終的可執(zhí)行代碼中,對(duì)于原始代碼中的返回指令,存在將來(lái)自程序的架構(gòu)棧的架構(gòu)返回地址彈出(pop)的指令。DTSE軟件相信會(huì)是該返回的目標(biāo)的架構(gòu)(而不是熱代碼)返回目標(biāo)IP將對(duì)代碼是已知的。在一些情況下這是熱代碼中的直接常數(shù)。在其它情況下,這存儲(chǔ)在DTSE存儲(chǔ)器中,有可能在棧結(jié)構(gòu)中。這不是程序的數(shù)據(jù)空間的一部分。從棧彈出的值必須與DTSE軟件認(rèn)為會(huì)是該返回的目標(biāo)的IP進(jìn)行比較。如果這些值不同,則流程退出。如果生成多個(gè)線程,則哪個(gè)線程來(lái)完成是沒(méi)有區(qū)別的。它應(yīng)在某個(gè)位置某些時(shí)間完成。在一些實(shí)施例中,如果過(guò)程非常小,則DTSE軟件將在特定線程中進(jìn)行的過(guò)程的部分的物理副本物理地放在線中。否則,此處沒(méi)有物理副本,且將有某種類型的控制傳遞指令,以進(jìn)入該線程中的熱代碼返回目標(biāo)。這將在“代碼生成”下進(jìn)行更多的描述。后邊沿在一些實(shí)施例中,DTSE軟件將找到該流程的最小后邊沿集合。最小后邊沿集合是從一個(gè)基本塊至另一個(gè)的邊沿的集合,使得如果這些邊沿被切割,則將沒(méi)有閉合的環(huán)路徑。該集合應(yīng)在如果任何邊沿從集合中去除則將有閉合環(huán)路徑的意義上最小。在一些實(shí)施例中,存在如果集合中的所有后邊沿被切割則代碼仍完全連接的性質(zhì)。有可能從根至基本塊的整個(gè)集合中的每個(gè)指令。每個(gè)過(guò)程單獨(dú)完成。因此,對(duì)此忽略調(diào)用邊沿和返回邊沿。單獨(dú)地,可在一些實(shí)施例中執(zhí)行遞歸調(diào)用分析。這通過(guò)探索嵌套調(diào)用樹(shù)來(lái)完成。從頂部開(kāi)始,如果存在對(duì)在已經(jīng)在該路徑中的嵌套調(diào)用樹(shù)中的路徑上的任何過(guò)程的調(diào)用,則存在遞歸調(diào)用。遞歸調(diào)用是環(huán),且從該調(diào)用限定后邊沿。所以單獨(dú)地,調(diào)用邊沿可被標(biāo)記為“后邊沿”。在一些實(shí)施例中,算法在根處開(kāi)始并且跟蹤從基本塊至基本塊的所有路徑?;緣K的內(nèi)部不重要。另外,已經(jīng)被限定的后邊沿不被遍歷。如果在從根P的任何線性路徑上遇到已經(jīng)在P中的基本塊S,則在S結(jié)束的該邊沿被限定為后邊沿。限定分支再收斂點(diǎn)在一些實(shí)施例中,存在一些未被預(yù)測(cè)的分支,因?yàn)樗鼈儽灰暈閱握{(diào)的。如果該分支在執(zhí)行中進(jìn)入錯(cuò)誤路徑,則它是分支未命中預(yù)測(cè)。不僅如此,它離開(kāi)流程。在處理流程中的代碼時(shí),出于所有目的,這些分支被視為完美單調(diào)(即,完全無(wú)條件的分支)。間接分支將具有已知目標(biāo)列表。本質(zhì)上,它是多目標(biāo)條件分支。DTSE軟件可將此編碼為比較和分支的順序串,或者利用反彈表。在任一編碼中,還有一個(gè)目標(biāo):離開(kāi)該流程。這基本上是終端處的單調(diào)分支。如果這進(jìn)入錯(cuò)誤路徑,則我們離開(kāi)該流程。至已知目標(biāo)的多路分支具有與直接條件分支相同的再收斂點(diǎn),并且建立相同的路徑。并且當(dāng)然,未預(yù)測(cè)的單調(diào)的最后解決分支(lastresortbranch)按不作為分支來(lái)處理。調(diào)用和返回(如所述)是特殊的,且不是“分支”。返回是再收斂點(diǎn)。在過(guò)程P中的不具有以某些其它方式限定的再收斂點(diǎn)的任何分支具有“返回”作為其再收斂點(diǎn)。P可具有在很多位置編碼的返回。出于成為再收斂點(diǎn)的目的,返回的所有編碼實(shí)例被視為相同。對(duì)于過(guò)程的任何靜態(tài)實(shí)例,所有編碼的返回精確地進(jìn)入相同位置,該位置對(duì)于過(guò)程的該靜態(tài)實(shí)例是獨(dú)特的。給出所有這些,對(duì)于所有事件分支的再收斂點(diǎn)應(yīng)能夠被找到。在一些實(shí)施例中,僅基本塊的入口點(diǎn)可以是再收斂點(diǎn)。對(duì)于分支B,可找到在收斂點(diǎn)R,使得在從B至R的所有控制流程路徑中,后邊沿遍歷的總數(shù)最小。給出對(duì)于分支B的再收斂點(diǎn)集,該再收斂點(diǎn)集在從B至再收斂點(diǎn)的所有路徑上具有相同數(shù)量的后邊沿,在從B至再收斂點(diǎn)的完整路徑集上具有最少指令的再收斂點(diǎn)通常是優(yōu)選的。在一些實(shí)施例中,在分析其間保持兩個(gè)參數(shù):后邊沿限制和分支限制。兩者被初始化為0。在一些實(shí)施例中,過(guò)程通過(guò)還沒(méi)有限定的再收斂點(diǎn)的所有的分支并且執(zhí)行以下動(dòng)作中的一個(gè)或多個(gè)。對(duì)于每個(gè)這類分支B,在分支B開(kāi)始,向前遵循所有的控制流程路徑。如果任何路徑離開(kāi)流程,停止繼續(xù)該路徑。如果所遍歷的不同后邊沿的數(shù)量超過(guò)后邊沿極限,則該路徑不再繼續(xù),且會(huì)越過(guò)該極限的后邊沿不再被遍歷。對(duì)于每個(gè)路徑,收集該路徑上的基本塊集。找到所有這些集合的交集。如果該交集是空,則該搜索是不成功的。從該交集,拾取集合的成員R,對(duì)于該成員R在從B至R的所有路徑上的所有指令的總數(shù)最小。現(xiàn)在,確定從B至R的所有路徑中總共有多少“可見(jiàn)的”后邊沿。如果該數(shù)大于后邊沿極限,則R被拒絕。然后對(duì)于可見(jiàn)后邊沿的總數(shù)測(cè)試下一個(gè)具有較大總指令數(shù)的可能再收斂點(diǎn)。最后,找到滿足后邊沿極限的再收斂點(diǎn)或沒(méi)有更多的可能性。如果找到一個(gè),則確定在從B至R的所有路徑上還沒(méi)有再收斂點(diǎn)的分支的總數(shù)。如果它超過(guò)分支極限,則拒絕R。最終滿足后邊沿極限和分支極限的R將被找到,或者沒(méi)有可能性。良好的R是B的再收斂點(diǎn)。在一些實(shí)施例中,一旦分支B的再收斂點(diǎn)已經(jīng)被找到,對(duì)于找到再收斂點(diǎn)的其余算法,通過(guò)B的任何正向控制流程遍歷將直接跳至其再收斂點(diǎn),而不查看分支和其再收斂點(diǎn)之間的細(xì)節(jié)。通過(guò)再收斂點(diǎn)的任何向后控制流程遍歷將直接跳至其匹配分支,而不查看分支及其再收斂點(diǎn)之間的細(xì)節(jié)。本質(zhì)上,控制流程從分支收縮到其再收斂點(diǎn)向下至單個(gè)點(diǎn)。在一些實(shí)施例,如果找到再收斂點(diǎn),則后邊沿極限和分支極限均被復(fù)位,并且考慮還不具有再收斂點(diǎn)的所有分支。如果成功找到再收斂點(diǎn),則使一些東西不可見(jiàn)?,F(xiàn)在可找到之前不成功的分支的再收斂點(diǎn),甚至在后邊沿極限和分支極限的下限值處。在一些實(shí)施例中,如果沒(méi)有找到再收斂點(diǎn),則嘗試下一分支B。當(dāng)還不具有再收斂點(diǎn)的所有分支已經(jīng)被不成功地嘗試后,分支極限遞增并且再次嘗試分支。在一些實(shí)施例中,如果由于分支極限沒(méi)有可能的再收斂點(diǎn)被拒絕,則將分支極限復(fù)位為0,遞增后邊沿極限并再次嘗試。一般而言,在從分支B至其再收斂點(diǎn)R的控制流程路徑上可以有不具有再收斂點(diǎn)的其它分支C,因?yàn)榉种O限設(shè)置成大于0。對(duì)于每個(gè)這樣的分支C,C獲得分配給它的B具有的相同再收斂點(diǎn),即R。分支B和所有這樣的分支C的集合被限定為“分支組”。這是全具有相同再收斂點(diǎn)的一組分支。在一些實(shí)施例中,在使從分支至再收斂點(diǎn)的整個(gè)事件“不可見(jiàn)”之前,這被維護(hù)。如果這不作為組來(lái)維護(hù),則一旦分支之一獲得分配的再收斂點(diǎn),則為組中的其它分支找到再收斂點(diǎn)所必需的所有路徑變得不可見(jiàn),更不必說(shuō)還沒(méi)有再收斂點(diǎn)的那些其它分支變得不可見(jiàn)。在一些實(shí)施例中,所有分支具有限定的再收斂點(diǎn)。“線性路徑中后邊沿的數(shù)量”表示不同后邊沿的數(shù)量。如果在線性路徑中相同的后邊沿出現(xiàn)多次,它仍僅作為一個(gè)后邊沿計(jì)數(shù)。如果基本塊E是分支B的限定的再收斂點(diǎn),這不會(huì)使其不合格來(lái)成為分支D的限定的再收斂點(diǎn)。整體展開(kāi)在一些實(shí)施例中執(zhí)行整體展開(kāi)。在整體展開(kāi)中,創(chuàng)建代碼的有限量的靜態(tài)復(fù)制以允許暴露特定形式的并行性。在這些實(shí)施例中,整個(gè)流程被復(fù)制N次用于每個(gè)分支嵌套級(jí)。N的良好值可以是在最終代碼中期望的跟蹤數(shù)量,然而其它數(shù)量可能具有一些優(yōu)點(diǎn)。該復(fù)制提供了在工作在環(huán)的不同迭代上的多個(gè)(可能是所有)跟蹤中具有相同代碼的機(jī)會(huì)。它不會(huì)使任何環(huán)的不同迭代進(jìn)入不同跟蹤。一些環(huán)將通過(guò)迭代分離,而一些將在環(huán)內(nèi)以細(xì)粒度逐指令地分離。更普遍地,環(huán)將以逐指令為基礎(chǔ)以兩種方式分離。期望發(fā)生什么,將發(fā)生什么。它僅允許通過(guò)迭代分離。在目前的情況下,僅有環(huán)體的一個(gè)靜態(tài)副本。如果僅有一個(gè)靜態(tài)副本,則在沒(méi)有動(dòng)態(tài)復(fù)制的情況下它不能在多個(gè)跟蹤中,這可能起相反作用。為了允許該代碼在多個(gè)跟蹤中,以便在不同的控制流程路徑(不同的迭代)上使用,可以有多個(gè)靜態(tài)副本。嵌套在從組中的分支至組限定的再收斂點(diǎn)的路徑中具有至少一個(gè)可見(jiàn)后邊沿的分支組被限定為“環(huán)”。在再收斂點(diǎn)分析中限定對(duì)特定分支組什么“可見(jiàn)”或不“可見(jiàn)”。此外,不在從任何可見(jiàn)分支至其再收斂點(diǎn)的路徑上的任何后邊沿也被限定為“環(huán)”。僅被限定成后邊沿的環(huán)被限定成具有從其后邊沿開(kāi)始,經(jīng)由該后邊沿回到其后邊沿的開(kāi)始的路徑,作為它的“從其分支至它們的再收斂點(diǎn)的路徑”。給出不同的環(huán)A和B,如果B的組中的所有分支在從A中的分支至A的限定再收斂點(diǎn)的路徑中,則B嵌套在A中。限定為不在從分支至其再收斂點(diǎn)的路徑上的后邊沿的環(huán)被限定為不嵌套在任何其它環(huán)內(nèi),但其它環(huán)可被嵌套在它中,且通常是這樣的。僅被限定成后邊沿的環(huán)與該后邊沿相關(guān)聯(lián)。其它環(huán)與從環(huán)的分支至環(huán)再收斂點(diǎn)的路徑中的可見(jiàn)后邊沿相關(guān)聯(lián)。在再收斂點(diǎn)分析中限定什么對(duì)特定的分支組“可見(jiàn)”或不“可見(jiàn)”??蓪⒁韵露ɡ砗鸵碇械囊粋€(gè)或多個(gè)施加到嵌套的實(shí)施例。定理1:如果B嵌套在A中,則A不嵌套在B中。假設(shè)B嵌套在A中。則在B中有分支,且B中的所有分支在從A至其再收斂點(diǎn)的路徑上。如果A不包含分支,則通過(guò)限定,A不能嵌套在B中。如果A中的分支X在從B中的分支至其再收斂點(diǎn)的路徑上,則X是B的一部分或者它對(duì)B不可見(jiàn)。如果X是B的一部分,則A的全部是B的部分且環(huán)A和B不是不同的。所以X必須對(duì)B不可見(jiàn)。這表示A必須在B之前限定其收斂點(diǎn),使得A的分支對(duì)B不可見(jiàn)。因此B對(duì)A不可見(jiàn)。B中的全部分支在從A至其再收斂點(diǎn)的路徑上且可見(jiàn)。使使得B是A的部分,所以A和B不是不同的。X不能如所假設(shè)的。引理1:如果分支B2在從分支B1至其再收斂點(diǎn)的路徑上,則從B2至其再收斂點(diǎn)的整個(gè)路徑也在從B1至其再收斂點(diǎn)的路徑上。從B1至其再收斂點(diǎn)R1的路徑通向B2。因此它跟隨來(lái)自B2的所有路徑。如果B1已經(jīng)再收斂,則B2已經(jīng)再收斂。如果我們還未達(dá)到指定用于B2的“再收斂點(diǎn)”,則R1是較好的點(diǎn)。再收斂點(diǎn)算法將找到最佳點(diǎn),所以它必須已經(jīng)找到R1。定理2:如果環(huán)B的一個(gè)分支在從環(huán)A中的分支至其再收斂點(diǎn)的路徑上,則B嵌套在A中。令X是B中的分支,X在從A中的分支至A的再收斂點(diǎn)RA的路徑上。通過(guò)引理1,從X至其再收斂點(diǎn)RB的路徑在從A至RA的路徑上。環(huán)B是在從X至RB的路徑上所有分支的集合。它們均在從A至RA的路徑上。定理3:如果B嵌套在A中,且C嵌套在B中,則C嵌套在A中。令X是具有再收斂點(diǎn)RC的C中的分支。則X在從B中的分支Y至B的再收斂點(diǎn)RB的路徑上。通過(guò)引理1,從X至RC的路徑在從Y至RB的路徑上。B中的分支Y在從A中的分支Z至A的再收斂點(diǎn)RA的路徑上。通過(guò)引理1,從Y至RB的路徑在從Z至RA的路徑上。因此,從X至RC的路徑在從Z至RA的路徑上。所以,X一定在從Z至RA的路徑上。這對(duì)于C中的所有X都是正確的。所以C嵌套在A中。定理4:后邊沿與一個(gè)且僅一個(gè)環(huán)“相關(guān)聯(lián)”。不在從可見(jiàn)分支至其再收斂點(diǎn)的路徑上的后邊沿本身是環(huán)。如果后邊沿在從可見(jiàn)分支至其再收斂點(diǎn)的路徑上,則該分支所屬的分支組具有至少一個(gè)后邊沿,因此是環(huán)。假設(shè)有與環(huán)L相關(guān)聯(lián)的后邊沿E。令M是不同的環(huán)。如果L或M是不具有分支的環(huán),即它們僅僅是單個(gè)后邊沿,則定理是正確的。所以假設(shè)L和M具有分支。順序地限定再收斂點(diǎn)。如果M的再收斂點(diǎn)被首先限定,且E在從M至其再收斂點(diǎn)的路徑上,則E可能已經(jīng)被隱藏。稍后它不會(huì)對(duì)L可見(jiàn)。如果首先限定L的再收斂點(diǎn),則E將被隱藏且稍后不會(huì)對(duì)M可見(jiàn)。非定理5:在流程中執(zhí)行超過(guò)一次的所有代碼在一些環(huán)中不是對(duì)的。不在任何環(huán)中但被執(zhí)行多次的流程中的代碼的示例是在分支中結(jié)束的兩個(gè)基本塊。分支的一個(gè)臂的目標(biāo)是第一基本塊而分支的另一個(gè)臂的目標(biāo)是第二基本塊。分支的再收斂點(diǎn)是至第二基本塊的入口點(diǎn)。在第一基本塊中的代碼在環(huán)中,但在第二基本塊中的代碼不在環(huán)中,即它不在從環(huán)分支至其再收斂點(diǎn)的任何路徑上?!胺聪蚝筮呇亍笔桥c環(huán)分支組相關(guān)聯(lián)的后邊沿,使得從該后邊沿向前前進(jìn),在該環(huán)分支組中的任何分支之前,環(huán)分支組的再收斂點(diǎn)被命中(且可能絕對(duì)不命中該環(huán)分支組中的任何分支)。如果后邊沿對(duì)環(huán)分支組可見(jiàn)且在從該環(huán)分支組中的分支至該環(huán)分支組的再收斂點(diǎn)的路徑上,則后邊沿與環(huán)分支組“相關(guān)聯(lián)”。注意,在具有退出環(huán)的環(huán)分支的經(jīng)典環(huán)中,穿過(guò)后邊沿的路徑首先命中環(huán)分支然后其再收斂點(diǎn)。如果后邊沿是反向的后邊沿,則穿過(guò)該后邊沿的路徑首先命中再收斂點(diǎn)然后命中環(huán)分支。定理6:如果不在任何環(huán)中的流程中有被執(zhí)行超過(guò)一次的指令,則該流程包含反向后邊沿。令I(lǐng)是流程中被執(zhí)行超過(guò)一次的指令。假設(shè)I不在任何環(huán)中。假設(shè)在流程中沒(méi)有反向后邊沿。在從I返回I的路程中必然有某種路徑P。在該路徑中有至少一個(gè)后邊沿E。假設(shè)有分支B,該分支B是與E相關(guān)聯(lián)的環(huán)的一部分。這表示B是分支組的一部分。E對(duì)該分支組可見(jiàn),且E在從該組中的分支至其再收斂點(diǎn)的路徑上。從E向前前進(jìn)在P上,除非有另一個(gè)分支。如果有另一個(gè)分支C,則C在從B至B的再收斂點(diǎn)的路徑上,因此C在該相同的分支組中。C在P中。因此,在P中有該環(huán)的環(huán)分支。如果沒(méi)有C,則P被跟隨并到達(dá)I。如果在B的再收斂點(diǎn)之前到達(dá)I,則I在環(huán)中,與假設(shè)相反。所以應(yīng)在達(dá)到I之前到達(dá)B的再收斂點(diǎn)。并且這在到達(dá)任何分支之前。所有從后邊沿開(kāi)始的路徑在其命中另一個(gè)環(huán)分支之前命中再收斂點(diǎn)。另一方面,假設(shè)有在P中的環(huán)分支C。如果再收斂點(diǎn)不在P中,則所有的P在環(huán)中,尤其是I。所以再收斂點(diǎn)也在P中。所以C、E和再收斂點(diǎn)R均在路徑P上。順序必須是至E然后C然后R,因?yàn)槿魏纹渌樞驅(qū)⒔o我們反向的后邊沿。如果P上有超過(guò)一個(gè)分支,諸如可到P上的某處的分支X。但至少一個(gè)環(huán)分支必須在E和R之間。C是該環(huán)分支。C具有另一個(gè)臂。應(yīng)有從C的其它臂至R的路徑。從C開(kāi)始的所有路徑在E之前到R,則E不在從C至R的任何路徑上。因此,從C至R的整個(gè)結(jié)構(gòu)對(duì)B不可見(jiàn),并且C不會(huì)是該環(huán)的環(huán)分支。因此從C開(kāi)始的某個(gè)路徑必須在R之前通過(guò)E。但這是不可能的。該路徑必須在邊沿E之前的某些位置連接P。它不論在哪里,它都將成為再收斂點(diǎn)R。結(jié)論是從其它角度看,P上唯一可能的順序E然后C然后P事實(shí)上不可能。在一些實(shí)施例中,利用以上理論中的一個(gè)或多個(gè),可向環(huán)分配獨(dú)特的嵌套級(jí)。不具有嵌套于其中的其它環(huán)的環(huán)具有嵌套級(jí)0。包含它們的環(huán)是嵌套級(jí)1。存在具有最高嵌套級(jí)的環(huán)。這為該流程限定嵌套級(jí)。注意環(huán)嵌套僅在過(guò)程中。在每個(gè)過(guò)程中它從0開(kāi)始。由于過(guò)程內(nèi)聯(lián),這適合。流程的嵌套級(jí)是流程中所有過(guò)程上的最大嵌套級(jí)。因?yàn)槊總€(gè)后邊沿屬于一個(gè)且僅一個(gè)環(huán),所以后邊沿的嵌套級(jí)可被限定成其所屬的環(huán)的嵌套級(jí)。在一些實(shí)施例中,DTSE軟件將復(fù)制整個(gè)流程N(yùn)U次,作為單元,其中U是流程的環(huán)嵌套級(jí)。N是每個(gè)環(huán)嵌套級(jí)展開(kāi)的路數(shù)。在一些實(shí)施例中,因?yàn)檫@是每個(gè)相同代碼的NU個(gè)精確副本,軟件沒(méi)有理由實(shí)際復(fù)制該代碼。位將精確地相同。代碼在概念上被復(fù)制NU次。流程的靜態(tài)副本可由具有U位的數(shù)字來(lái)命名。在實(shí)施例中,數(shù)字是底數(shù)N。最低位數(shù)字與嵌套級(jí)0相關(guān)聯(lián)。下一位數(shù)字與嵌套級(jí)1相關(guān)聯(lián)。每個(gè)數(shù)字對(duì)應(yīng)于嵌套級(jí)。在一些實(shí)施例中,對(duì)于展開(kāi)的復(fù)制名中的每位數(shù)字D,DTSE軟件使在D的值為0的所有副本中,具有與D相關(guān)聯(lián)的嵌套級(jí)的每個(gè)后邊沿到D的值為1的副本中相同IP,但所有其它位數(shù)字是相同的。這使在D的值為1的所有副本中,具有與D相關(guān)聯(lián)的嵌套級(jí)每個(gè)后邊沿到D的值為2的副本中相同IP,但所有其它位數(shù)字是相同的。依此類推,直到副本N-1。軟件使在D的值為N-1的所有副本中,具有與D相關(guān)聯(lián)的嵌套級(jí)的每個(gè)后邊沿到D的值為0的副本中相同IP,但所有其它位數(shù)字是相同的。其實(shí)施例是當(dāng)前展開(kāi)靜態(tài)副本數(shù)和用于在遍歷流程時(shí)它如何改變的算法。該算法是如果級(jí)L的后邊沿沿正向方向遍歷,則第L數(shù)字模N遞增。如果沿向后方向遍歷級(jí)L的后邊沿,則遞減第L數(shù)字模N。這就是先前的復(fù)雜段落所說(shuō)的。在一些實(shí)施例中,DTSE軟件不具有指針或表示它的任何東西。它僅具有該簡(jiǎn)單的當(dāng)前靜態(tài)副本號(hào)和計(jì)數(shù)算法。因此,在一些實(shí)施例中,DTSE軟件已經(jīng)通過(guò)因數(shù)N展開(kāi)所有的環(huán)。它整體、單次進(jìn)行,而不真實(shí)地理解任何環(huán)或單獨(dú)查看它們。它真實(shí)知曉的一切是每個(gè)后邊沿的嵌套級(jí),以及這些中的最大值,即流程的嵌套級(jí)。在這些實(shí)施例中,因?yàn)闆](méi)有目標(biāo)IP改變,所以對(duì)代碼中的任何位都沒(méi)有改變。所改變的是在同一IP處的指令的每個(gè)靜態(tài)實(shí)例可具有不同的依賴性。每個(gè)靜態(tài)實(shí)例依賴于不同的其它指令,且不同的其它指令依賴于它。對(duì)于由其IP限定的每個(gè)指令,期望針對(duì)其靜態(tài)實(shí)例中的每一個(gè)單獨(dú)記錄其依賴性的能力。當(dāng)遍歷任何控制路徑時(shí),展開(kāi)副本計(jì)數(shù)器將適當(dāng)改變狀態(tài)以始終告訴現(xiàn)在指令的哪些展開(kāi)副本被查看。分支再收斂點(diǎn)。在一些實(shí)施例中,如果在控制流程圖遍歷中,命中作為環(huán)L的成員的分支B,則B所屬的分支組的標(biāo)識(shí)符被推到棧上。如果在控制流程圖遍歷中,命中一分支,該分支的分支組已經(jīng)在棧的頂部,則什么都不做。如果在控制流程圖遍歷中,對(duì)于在棧X(展開(kāi)前限定的)頂部上的分支,命中再收斂點(diǎn),則到該展開(kāi)嵌套級(jí)的版本0,且彈出該棧。這說(shuō)明X的版本0將是展開(kāi)環(huán)的實(shí)際再收斂點(diǎn)。在一些實(shí)施例中,有例外。如果被遍歷的L的最后后沿是反向后沿且L(展開(kāi)前限定的)的再收斂點(diǎn)X被命中,且L在棧的頂部,則棧被彈出,但應(yīng)維持一些展開(kāi)版本,而不是到版本0。在這種情況下,該展開(kāi)嵌套級(jí)X的版本0被限定成L的再收斂點(diǎn)。在退出時(shí),環(huán)L總是到嵌套級(jí)L的版本0(除了當(dāng)L具有反向后邊沿以外)。以上描述如何向前跟隨控制流程圖的實(shí)施例。當(dāng)在一些實(shí)施例中證明更需要遵循向后分支控制流程圖而不是前向。在一些實(shí)施例中,這與嵌套過(guò)程相同。向后,L的再收斂點(diǎn)首先被命中。復(fù)雜點(diǎn)是這可能是多個(gè)環(huán)的收斂點(diǎn)且還用于不是環(huán)的分支組。問(wèn)題是哪個(gè)結(jié)構(gòu)被倒入。的確有很多路徑進(jìn)入到該點(diǎn)。如果倒入環(huán),則它應(yīng)在當(dāng)前點(diǎn)之下的嵌套級(jí)1處。在此嵌套級(jí)處仍可有很多環(huán)以及非環(huán)分支組。可進(jìn)行挑選跟隨哪個(gè)路徑。如果挑選被倒入的環(huán)L,則有N個(gè)路徑用于跟隨進(jìn)入N個(gè)展開(kāi)副本。在一些實(shí)施例中,它們之一被挑選?,F(xiàn)在已知被倒入的代碼的靜態(tài)副本??杀徽业降哪切┦窍鄳?yīng)分支組中的分支。該信息被推到棧上。在一些實(shí)施例中,如果不在當(dāng)前嵌套級(jí)的展開(kāi)副本0中,則倒入該環(huán)的后邊沿。所以,當(dāng)?shù)竭_(dá)獲得后邊沿的最后機(jī)會(huì)時(shí),該路徑被知曉。直到那時(shí),有所有可能性。如果在當(dāng)前嵌套級(jí)的展開(kāi)副本0中,則在一些實(shí)施例中做出不采用任何后邊沿的附加選擇和環(huán)外的撤出。如果環(huán)被撤出,則彈出棧。在一些實(shí)施例中,每次獲得該環(huán)的后邊沿,則在該嵌套級(jí)模N處遞減副本號(hào)。通常在其嵌套級(jí)的靜態(tài)副本0處進(jìn)入環(huán),且它總是退出至其嵌套級(jí)的靜態(tài)副本0。記住,這些是分析該代碼的軟件內(nèi)部的操作;不是執(zhí)行該代碼。在很多實(shí)施例中,執(zhí)行不具有這種棧。將生成代碼以全部到正確的位置。對(duì)于生成進(jìn)入到所有正確位置的代碼的軟件,它自己需要知道如何遍歷流程。圖8-11示出這些操作中的一些的示例。圖8示出具有三個(gè)基本塊的示例,該三個(gè)基本塊具有兩個(gè)后邊沿。這形成兩級(jí)嵌套簡(jiǎn)單環(huán)。C的入口是B中分支的收斂點(diǎn)。從C退出的目標(biāo)是C中分支的再收斂點(diǎn)。圖9示出整個(gè)流程已經(jīng)被復(fù)制。此處示出它的一部分。我們嵌套的環(huán)有4個(gè)副本,副本00、副本01、副本10和副本11。Cx的入口是Bx中分支的收斂點(diǎn)。從Cx退出的目標(biāo)是Cx中分支的再收斂點(diǎn)。對(duì)于每個(gè)x這些是不同的。圖10示出后邊沿和至再收斂點(diǎn)的邊沿已經(jīng)利用以上討論中的操作中的一個(gè)或多個(gè)進(jìn)行修改。至C00的入口現(xiàn)在是環(huán)B00-B01的再收斂點(diǎn)。至C10的入口點(diǎn)現(xiàn)在是環(huán)B10-B11的再收斂點(diǎn)。較外部的環(huán),靜態(tài)副本00和10均到共同的再收斂點(diǎn)。有共同的再收斂點(diǎn)也是C01和C11的目標(biāo)。對(duì)此不感興趣,因?yàn)镃01和C11是死代碼。沒(méi)有辦法到達(dá)該代碼。事實(shí)上,從該段代碼退出總是在來(lái)自C00或C01的靜態(tài)副本00中。在圖11中,已經(jīng)去除死代碼和死路徑以更清楚地示出它如何工作。注意至該代碼僅有一個(gè)活入口,它在靜態(tài)副本00中,且從該代碼僅有一個(gè)活出口,它在靜態(tài)副本00中。在一些實(shí)施例中,DTSE軟件將不具體“去除”任何代碼。僅有該代碼的一個(gè)副本。沒(méi)有要去除的東西。軟件理解基本塊A和C需要僅兩個(gè)名字00和01下的依賴信息,而不是4個(gè)名字下?;緣KB需要四個(gè)名字下的依賴信息。較大數(shù)字N增加準(zhǔn)備代碼的工作量,但它還可潛在地增加利用較少動(dòng)態(tài)復(fù)制的并行性。在一些實(shí)施例中,DTSE軟件可增加N以進(jìn)行更好的工作,或減小N以憑借較小的工作產(chǎn)生代碼。一般而言,匹配最終跟蹤數(shù)的N將以合理的工作量給予最多的并行性。一般而言,比它大的N將給予略好的結(jié)果但工作多很多。環(huán)展開(kāi)提供指令I(lǐng)對(duì)于一些迭代在一個(gè)跟蹤中被執(zhí)行的可能性,而對(duì)于不同迭代,同一指令I(lǐng)的不同靜態(tài)版本在不同的跟蹤中同時(shí)執(zhí)行。此處強(qiáng)調(diào)“指令”,因?yàn)楦櫡蛛x是以指令接指令為基礎(chǔ)進(jìn)行的。指令I(lǐng)可按此方式處理,而該環(huán)中緊接I的指令J可能完全不同地處理??舍槍?duì)跟蹤0中的所有迭代執(zhí)行指令J,而該環(huán)中緊接I和J的K可針對(duì)跟蹤1中的所有迭代執(zhí)行。允許來(lái)自同一環(huán)的不同迭代的指令在不同跟蹤中執(zhí)行的環(huán)展開(kāi)是有用的工具。它揭示很多代碼中的顯著并行性。另一方面,環(huán)展開(kāi)揭示在很多代碼中根本沒(méi)有并行性。這是DTSE可使用的唯一的一個(gè)工具。此外,對(duì)于DTSE軟件中的分析,通常沒(méi)有理由復(fù)制用于展開(kāi)的任何代碼,因?yàn)槲粚⑹窍嗤摹U归_(kāi)對(duì)代碼產(chǎn)生多個(gè)名字。每個(gè)名字具有它自己的特性表。每個(gè)名字可具有不同的行為。這可以揭示并行性。甚至稍后將生成的可執(zhí)行代碼將不具有很多副本,即使在分析期間該代碼有很多名字。線性靜態(tài)復(fù)制在一些實(shí)施例中,對(duì)于整體展開(kāi),整個(gè)流程已經(jīng)被復(fù)制多次。在其頂部,在一些實(shí)施例中,按需要將整個(gè)流程復(fù)制多次。副本被命名為S0、S1、S2…。每個(gè)分支B在流程中被復(fù)制在每個(gè)靜態(tài)副本S0、S1、S2…中。B的每個(gè)副本是一般分支B的實(shí)例。類似地,B具有在S0、S1、S2…中已經(jīng)復(fù)制的再收斂點(diǎn)。所有的副本是一般分支B的一般再收斂點(diǎn)的實(shí)例。所復(fù)制的后邊沿均被標(biāo)記為后邊沿。在一些實(shí)施例中,沒(méi)有代碼被復(fù)制。在這些實(shí)施例中,在代碼中的所有東西還獲得另一級(jí)別的多個(gè)名字。每個(gè)名字獲得存儲(chǔ)信息的位置。在一些實(shí)施例中,在流程的所有“S”副本中的所有邊沿獲得改變至正確的一般基本塊的目標(biāo),但未被分配給特定的“S”副本。所有的后邊沿獲得其改變至特殊的S0副本的目標(biāo)。在一些實(shí)施例中,流程S0、S1、S2…的副本按數(shù)字順序被一一通過(guò)。對(duì)于Sk,不是后邊沿的每個(gè)邊沿E(原點(diǎn)在流程副本Sk中)將用于其目標(biāo)的特定副本分配為最低“S”號(hào)副本,使得它不與任何其它邊沿共享目標(biāo)。最后,將沒(méi)有邊沿,它不是后邊沿,它與任何其它邊沿共享目標(biāo)基本塊。當(dāng)然,后邊沿將頻繁地與其它(可能是很多其它)后邊沿共享目標(biāo)基本塊。如同在整體展開(kāi)的情況下,在一些實(shí)施例中,退出環(huán)的邊沿的目標(biāo)“S”實(shí)例通過(guò)進(jìn)入環(huán)再收斂點(diǎn)而修改,如下。在一些實(shí)施例中,如果在控制流程圖遍歷中,命中作為環(huán)L的成員的分支B,則B所屬的分支組的標(biāo)識(shí)符被推到棧上的當(dāng)前“S”實(shí)例號(hào)。在一些實(shí)施例中,如果在控制流程圖遍歷中,命中一分支,該分支的分支組已經(jīng)在棧的頂部,則什么都不做。在一些實(shí)施例中,如果在控制流程圖遍歷中,在棧頂部的環(huán)的一般收斂點(diǎn)的實(shí)例被命中,則I彈出棧且實(shí)際到從棧彈出的“S”實(shí)例號(hào)。這說(shuō)明在環(huán)中,環(huán)的每次迭代在“S”實(shí)例號(hào)0處開(kāi)始,但在退出該環(huán)時(shí),到“S”實(shí)例,其中該環(huán)被進(jìn)入。注意可使用與整體展開(kāi)所使用的相同的棧。如果使用相同的棧,將字段添加到“S”實(shí)例的每個(gè)棧元素。再次,這些是分析該代碼的軟件內(nèi)部的操作;不是執(zhí)行該代碼。執(zhí)行不具有這種棧。將生成代碼以全部到正確的位置。對(duì)于生成進(jìn)入到所有正確位置的代碼的軟件,它自己需要知道如何遍歷流程。將有第一流程副本Sx,它是不能從副本S0到達(dá)的。不需要這個(gè)以及所有較高編號(hào)的副本。除此之外,每次存活,靜態(tài)副本S1、S2通常具有大量不能從S0到達(dá)的死代碼。不能從此處到達(dá)的要素將不生成發(fā)射的可執(zhí)行代碼。依賴性分析多結(jié)果指令已經(jīng)討論在一些實(shí)施例中,原始調(diào)用指令可能已經(jīng)被推入取代,且原始返回可能已經(jīng)被彈出和比較取代。一般而言,在分析中不需要多結(jié)果指令。在一些實(shí)施例中,這些將被分成多個(gè)指令。在很多情況下(但為了確定不是全部),這些或類似指令可在代碼生成時(shí)重新構(gòu)造。推入和彈出是顯然的示例。推入是存儲(chǔ)和遞減棧指針。彈出是加載和遞增棧指針。通常期望將棧指針修改和存儲(chǔ)器操作分離。有很多其它指令具有可被分離的多個(gè)結(jié)果。在一些實(shí)施例中,這些指令被分離。分離這些的常見(jiàn)原因是很可能所有的線程需要跟蹤棧指針變化,但它不必復(fù)制在每一線程中推入的數(shù)據(jù)的計(jì)算。不變值硬件支持和機(jī)構(gòu)在一些實(shí)施例中,DTSE硬件具有軟件可用的若干“斷言寄存器”。每個(gè)“斷言寄存器”可至少保持兩個(gè)值:實(shí)際值和被斷言值,且每個(gè)值有一個(gè)有效位。在一些實(shí)施例中,斷言寄存器是所有核和硬件SMT線程的全局資源。在一些實(shí)施例中,DTSE軟件從任何核中的任何硬件SMT線程,在任何時(shí)間寫入任何斷言寄存器的實(shí)際值部分或斷言值部分。在一些實(shí)施例中,為了全局提交對(duì)給定斷言寄存器的斷言值的寫入,目標(biāo)斷言寄存器的實(shí)際值部分必須有效,且兩個(gè)值必須匹配。如果實(shí)際值不是有效的或者值不匹配,則硬件將導(dǎo)致臟流程退出,且狀態(tài)將恢復(fù)到最后的全局提交狀態(tài)。斷言寄存器為一個(gè)核中的一個(gè)邏輯處理器A上運(yùn)行的代碼提供使用不是由該邏輯處理器或核實(shí)際計(jì)算的值的能力。在一些核中的一些邏輯處理器B中,該值必須在邏輯上較早地計(jì)算,而不必在物理上較早地計(jì)算,并且被寫入斷言寄存器的實(shí)際值部分。在A中運(yùn)行的代碼可假設(shè)任何值并將其寫入相同斷言寄存器的斷言值。斷言值的寫入之后的代碼肯定知道被寫入斷言值的值精確匹配在對(duì)斷言值的寫入的邏輯位置處被寫入實(shí)際值的值,不管該代碼被放在何處。當(dāng)DTSE軟件很可能但不確定知道一值而不進(jìn)行對(duì)該值的所有計(jì)算并且該值用于很多事情時(shí),這是有用的。它提供了在多個(gè)核中的多個(gè)邏輯處理器中使用該值但僅在一個(gè)核中的一個(gè)邏輯處理器中正確計(jì)算它的可能性。在DTSE軟件關(guān)于該值是正確的情況下,本質(zhì)上對(duì)斷言操作沒(méi)有成本。如果DTSE軟件關(guān)于該值不正確,則沒(méi)有正確性問(wèn)題,但對(duì)所導(dǎo)致的流程退出可能有大的性能成本。棧指針棧指針和基址指針通常被頻繁使用。不太可能執(zhí)行非常有用的代碼而不使用棧指針和基址指針中的值。因此,通常每個(gè)DTSE線程中的代碼將使用這些寄存器中的值的大多數(shù)。例如棧指針的實(shí)際值通常取決于對(duì)棧指針的變化的長(zhǎng)依賴性鏈。在一些實(shí)施例中,DTSE軟件可通過(guò)插入對(duì)斷言寄存器的實(shí)際值部分的寫入然后是對(duì)該斷言寄存器的斷言值寫入假設(shè)值,來(lái)打破該長(zhǎng)依賴性鏈。然后是不直接依賴于實(shí)際值的寫入或之前的任何東西的值。對(duì)于原始代碼中的過(guò)程調(diào)用和返回,DTSE軟件將正常地假設(shè)緊跟返回之后的棧指針和基址指針的值與其剛好在調(diào)用之前相同。在一些實(shí)施例中,剛好在調(diào)用(原始指令)之前,可將偽指令插入。這是不會(huì)生成代碼但具有類似指令的表的指令。標(biāo)記偽作為棧指針和基址指針的消費(fèi)者。在從過(guò)程返回之后,指令被插入以將棧指針和基址指針復(fù)制到2個(gè)斷言寄存器的實(shí)際值部分。這些插入的指令被標(biāo)記為這些值的消費(fèi)者。之后,在一些實(shí)施例中,指令被插入以將棧指針和基址指針復(fù)制到這些斷言寄存器的斷言值部分。這些插入的指令被標(biāo)記為不消耗這些值,但產(chǎn)生這些值。這些指令被直接標(biāo)記為依賴于偽。類似地,對(duì)于不明顯進(jìn)行不平衡棧變化的很多環(huán),假設(shè)在每次迭代開(kāi)始時(shí),棧指針和基址指針的值是相同的。在一些實(shí)施例中,作為消費(fèi)者的偽被插入在該環(huán)的最初入口。實(shí)際值的副本被插入并標(biāo)識(shí)為消費(fèi)者,隨后是斷言值的副本,標(biāo)識(shí)為生產(chǎn)者。使斷言值的副本直接依賴于偽。很多其它用途可由此形成。注意為了使用斷言,不要求值不變。僅要求很多步驟評(píng)價(jià)可被可能正確的短得多的評(píng)價(jià)取代。斷言比較失敗由硬件報(bào)告。如果在某些實(shí)施例中觀察到斷言失敗,DTSE軟件將去除損壞的斷言寄存器使用并且在沒(méi)有失敗斷言的情況下再次處理代碼。注意即使這樣,也很可能生成錯(cuò)誤代碼。線程能結(jié)束過(guò)程中對(duì)棧指針的一些而非全部變化。因此能假設(shè)在過(guò)程結(jié)束時(shí)棧指針的錯(cuò)誤值。這不是正確性問(wèn)題。斷言將捕捉它,但斷言將總是或頻繁地失敗。如果線程不具有過(guò)程的所有棧指針變化,則我們希望它不具有它們中的任何一個(gè)。這不是直接強(qiáng)制的。對(duì)實(shí)際值寫入的線程將具有對(duì)棧指針的全部變化。這不是常見(jiàn)問(wèn)題。在一些實(shí)施例中,如果有在執(zhí)行時(shí)報(bào)告的斷言失敗,則去除該斷言。在一些實(shí)施例中,DTSE軟件能具體地檢查一些但并非全部對(duì)線程中假設(shè)的不變的改變。如果檢測(cè)到該有問(wèn)題的情況,則去除斷言?;蛘?,可將值保存在偽的位置,并且在斷言值的寫入位置再次加載??刂埔蕾囆栽谝恍?shí)施例中,每個(gè)概況用于跟蹤穿過(guò)完全復(fù)制代碼的線性路徑。該概況限定每個(gè)分支或跳躍的一般目標(biāo),且完全復(fù)制的代碼中的可用路徑限定作為目標(biāo)的特定實(shí)例。因此該跟蹤將通過(guò)指令的特定實(shí)例。概況是線性列表,但它迂回通過(guò)完全復(fù)制的靜態(tài)代碼。一般而言,它將命中相同的指令實(shí)例多次。單獨(dú)地對(duì)于每個(gè)分支的每個(gè)靜態(tài)實(shí)例,記錄其輸出邊沿中的每一個(gè)被采用多少次。如果還未看到來(lái)自分支的實(shí)例的邊沿在任何概況中被采用,則該邊沿離開(kāi)流程。這將致使不能到達(dá)一些代碼。將分支的單調(diào)實(shí)例標(biāo)記為“僅執(zhí)行的”分支。先前這些中的很多被標(biāo)識(shí)。一般分支可以是單調(diào)的。在這種情況下,該一般分支的所有實(shí)例是“僅執(zhí)行的”分支?,F(xiàn)在,即使一般分支不是單調(diào)的,該分支的某些靜態(tài)實(shí)例可以是單調(diào)的。這些實(shí)例也是“僅執(zhí)行的”分支。沒(méi)有其它的指令實(shí)例依賴于“僅執(zhí)行的分支”。特定的分支實(shí)例是或不是“僅執(zhí)行的”。在一些實(shí)施例中,對(duì)于一般分支B的每個(gè)非僅執(zhí)行的實(shí)例,在所有路徑上跟蹤向前,停止在B的一般再收斂點(diǎn)的任何實(shí)例處。該路徑上的所有指令實(shí)例被標(biāo)記為具有對(duì)B的該實(shí)例的直接依賴性。在一些實(shí)施例中,這對(duì)于所有的一般分支B進(jìn)行??纱嬖诰哂小半x開(kāi)流程”作為輸出邊沿的分支,但具有一個(gè)以上的其它邊沿。這通常用于間接分支。概況分析已經(jīng)標(biāo)識(shí)間接分支的可能目標(biāo)中的一些,但通常假設(shè)由未被標(biāo)識(shí)的目標(biāo)。如果間接分支到概況分析中未標(biāo)識(shí)的目標(biāo),則這是“離開(kāi)流程”。在這些情況下,DTSE軟件將這打破成至已知目標(biāo)的分支和是“離開(kāi)流程”或不是“離開(kāi)流程”的兩路分支。“離開(kāi)流程”或不“離開(kāi)流程”的分支是典型的單調(diào)“僅執(zhí)行”分支。直接依賴性在一些實(shí)施例中,每個(gè)指令實(shí)例的直接控制依賴性已經(jīng)被記錄。對(duì)于每個(gè)指令實(shí)例,其“寄存器”輸入被標(biāo)識(shí)。這包括執(zhí)行該指令所需的全部寄存器值。這可包括狀態(tài)寄存器、條件代碼和暗示寄存器值。在一些實(shí)施例中,進(jìn)行從所有可能的路徑上的每個(gè)指令實(shí)例向回的跟蹤以找到所需“寄存器”值的所有可能源。源是特定的指令實(shí)例,而不是一般指令。特定的指令實(shí)例從特定的指令實(shí)例獲取值。可以有多個(gè)源用于指令實(shí)例的單個(gè)所需值。概況是分支目標(biāo)、負(fù)載地址和尺寸以及存儲(chǔ)地址和尺寸的線性序列。DTSE軟件應(yīng)具有至少一個(gè)概況來(lái)進(jìn)行依賴性分析。若干概況是可用的。在一些實(shí)施例中,每個(gè)概況用于跟蹤穿過(guò)完全復(fù)制代碼的線性路徑。該概況限定每個(gè)分支或跳躍的一般目標(biāo),且完全復(fù)制的代碼中的可用路徑限定作為目標(biāo)的特定實(shí)例。因此該跟蹤將通過(guò)指令的特定實(shí)例。概況是線性列表,但它迂回通過(guò)完全復(fù)制的靜態(tài)代碼。一般而言,它將命中相同的指令實(shí)例多次。負(fù)載從存儲(chǔ)頻繁加載若干字節(jié)。原則上,每個(gè)字節(jié)是單獨(dú)的依賴性問(wèn)題。實(shí)際上,當(dāng)然這可被優(yōu)化。在一些實(shí)施例中,對(duì)于每個(gè)負(fù)載的每個(gè)字節(jié),在概況中從負(fù)載按反向順序向回看以找到對(duì)該字節(jié)最后的在前存儲(chǔ)。存在負(fù)載指令的相同實(shí)例和存儲(chǔ)的精確實(shí)例。在一些實(shí)施例中,該存儲(chǔ)實(shí)例被記錄為該負(fù)載實(shí)例中的直接依賴性。負(fù)載實(shí)例可直接依賴于很多存儲(chǔ)實(shí)例,即使對(duì)于同一字節(jié)。超級(jí)鏈沒(méi)有其它指令實(shí)例直接依賴于其上的每個(gè)指令實(shí)例是“超級(jí)鏈的生成器”。超級(jí)鏈?zhǔn)窃谝蕾囆韵掳ㄒ粋€(gè)超級(jí)鏈生成器的靜態(tài)指令實(shí)例集的過(guò)渡閉包。即,開(kāi)始超級(jí)鏈作為包含超級(jí)鏈發(fā)生器的集合。在一些實(shí)施例中,超級(jí)鏈中依賴于任何指令實(shí)例的任何指令實(shí)例被添加到該集合。在一些實(shí)施例中,這是連續(xù)遞歸,直到超級(jí)鏈包含超級(jí)鏈中的任何指令實(shí)例依賴的每個(gè)指令實(shí)例。在所有的超級(jí)鏈已經(jīng)從所標(biāo)識(shí)的超級(jí)鏈生成器形成之后,仍可能有不在任何超級(jí)鏈中的一些指令實(shí)例。在一些實(shí)施例中,不在任何超級(jí)鏈中的任何指令實(shí)例被挑選并被指定成為超級(jí)鏈生成器,并且其超級(jí)鏈形成。如果仍有不在任何超級(jí)鏈中的指令實(shí)例,則挑選任何這樣的指令實(shí)例作為超級(jí)鏈生成器。這繼續(xù)直到每個(gè)指令實(shí)例在至少一個(gè)超級(jí)鏈中。注意很多指令實(shí)例將在多個(gè)甚至很多超級(jí)鏈中。在一些實(shí)施例中,超級(jí)鏈集是依賴性分析的最終產(chǎn)物。跟蹤形成?;靖櫡蛛x在一些實(shí)施例中,如果期望N個(gè)跟蹤,則同時(shí)分離N個(gè)跟蹤。最初種子生成在一些實(shí)施例中,找到最常的超級(jí)鏈(即“主鏈(backbone)”)。對(duì)于每次跟蹤,在一些實(shí)施例中,找到具有最多的不在“主鏈”中且不在任何其它跟蹤中的指令的超級(jí)鏈。這是該跟蹤的最初種子。在一些實(shí)施例中,在跟蹤集周圍執(zhí)行一或二次迭代。對(duì)于每次跟蹤,在一些實(shí)施例中,找到具有最多的不在任何其它跟蹤中的指令的超級(jí)鏈。這是該跟蹤的下一迭代種子并且替換我們之前具有的種子。對(duì)于該細(xì)化,如果它真的成為最獨(dú)特的選擇,它可能是(或可能不是)允許“主鏈”成為種子的好想法。典型地,僅僅是對(duì)跟蹤“播種”的開(kāi)始,而非結(jié)束。跟蹤生成在一些實(shí)施例中,挑選跟蹤T,它被動(dòng)態(tài)估計(jì)為最短。然后將超級(jí)鏈置于該跟蹤中。在一些實(shí)施例中,將按還不在任何跟蹤中的動(dòng)態(tài)指令的估計(jì)數(shù)量從最小至最大的順序回顧超級(jí)鏈。在一些實(shí)施例中,對(duì)于每個(gè)超級(jí)鏈,如果與將其放入任何其它跟蹤相比,它將導(dǎo)致將其放入跟蹤T的復(fù)制的一半或更少,則它這樣放置并且跟蹤生長(zhǎng)的開(kāi)始返回。否則跳過(guò)該超級(jí)鏈并且嘗試下一超級(jí)鏈。如果已經(jīng)達(dá)到超級(jí)鏈的列表末端而沒(méi)有將一個(gè)放入跟蹤T中,則跟蹤T需要新種子。新種子在一些實(shí)施例匯總,從T以外的所有跟蹤去除所有“已生長(zhǎng)的”超級(jí)鏈,在這些跟蹤中留下所有種子。跟蹤T臨時(shí)保留其“已生長(zhǎng)的”超級(jí)鏈。在一些實(shí)施例中,從未放置的超級(jí)鏈的當(dāng)前池,找到具有最大數(shù)量的(動(dòng)態(tài)估計(jì)的)不在T以外的任何跟蹤中的指令的超級(jí)鏈。該超級(jí)鏈?zhǔn)歉橳中的附加種子。然后從跟蹤T去除所有“已生長(zhǎng)的”超級(jí)鏈。已經(jīng)從所有其它跟蹤去除“已生長(zhǎng)的”超級(jí)鏈?,F(xiàn)在所有的跟蹤僅包含其種子。在每個(gè)跟蹤中可能有多個(gè)甚至很多種子。從此處,可執(zhí)行跟蹤生長(zhǎng)。獲取良好種子有助于質(zhì)量跟蹤分離。最長(zhǎng)的超級(jí)鏈可能是具有全部的“主鏈”指令集的一個(gè),這些指令很可能在所有的跟蹤中結(jié)束。很可能不限定與眾不同的指令集。因此,這不是最初被選為種子。在一些實(shí)施例中,相反,尋找具有盡可能多不同于“主鏈”的指令的超級(jí)鏈。這具有更好的機(jī)會(huì)與眾不同。每個(gè)連續(xù)跟蹤獲得盡可能與“主鏈”不同的種子,以便也具有最好的機(jī)會(huì)與眾不同,并且盡可能與現(xiàn)有跟蹤不同。在一些實(shí)施例中,這再次是迭代的。如果有用于每個(gè)跟蹤的東西,則如果可能則嘗試使每個(gè)跟蹤更與眾不同。每個(gè)跟蹤中種子的選擇被再次視為盡可能與其它跟蹤不同。從此處開(kāi)始,可以有雙管齊下的方法?!吧L(zhǎng)”旨在絕對(duì)遞增。它僅向跟蹤中已經(jīng)存在的添加一點(diǎn)點(diǎn),且僅當(dāng)非常清楚它真的屬于該跟蹤時(shí)?!吧L(zhǎng)”不造成大的跳躍。在一些實(shí)施例中,當(dāng)顯然的遞增生長(zhǎng)停止時(shí),進(jìn)行至新活動(dòng)中心的跳躍。為此,添加至在該跟蹤中種子的集合。通過(guò)添加種子完成大跳躍。生長(zhǎng)填充明確伴隨種子的東西。一些流程將具有非常好的連續(xù)性。從最初的種子開(kāi)始的遞增生長(zhǎng)可非常好地工作。一些流程將具有階段。每個(gè)階段具有種子。然后跟蹤將非常好地遞增地填充。在一些實(shí)施例中,為了找到跟蹤T的新種子,除它們的種子外的所有其它跟蹤變空。此處可能具有對(duì)新種子的不期望偏見(jiàn)。然而我們想要在跟蹤T中保持我們有的所有東西。這是已經(jīng)自然地與T相關(guān)聯(lián)的要素。我們想要的是找到一些不同的東西進(jìn)入T。它不會(huì)幫助我們使我們無(wú)論如何將獲得的一些東西成為種子。我們需要通過(guò)生長(zhǎng)我們可能未獲得的一些東西來(lái)作為種子進(jìn)行添加。當(dāng)返回到生長(zhǎng)時(shí),在一些實(shí)施例中,過(guò)程開(kāi)始清洗。在種子的不同情況下,生長(zhǎng)可采用顯著不同的過(guò)程,且這些種子可被優(yōu)化。在一些實(shí)施例中,生長(zhǎng)被執(zhí)行片刻,正如同用于找到種子需要什么的機(jī)制。在流程具有不同階段的情況下,可能需要在所有不同階段中的種子。但階段不是已知的或者需要多少種子。在實(shí)施例中,這就是如何找到它。因?yàn)椤霸囼?yàn)”生長(zhǎng)僅僅是發(fā)現(xiàn)需要什么種子的一種方式,所以它僅僅是投擲方式。當(dāng)有所需種子的全集時(shí),使高質(zhì)量“生長(zhǎng)”填充每個(gè)跟蹤中所進(jìn)行的。原始跟蹤代碼在一些實(shí)施例中,對(duì)于每個(gè)跟蹤,完全復(fù)制的流程是開(kāi)始點(diǎn)。從此處開(kāi)始,來(lái)自該跟蹤的代碼的每個(gè)指令實(shí)例(不在分配給該跟蹤的任何超級(jí)鏈中)被刪除。這是該跟蹤的原始代碼。一旦限定跟蹤的原始代碼,則不會(huì)進(jìn)一步使用超級(jí)鏈。超級(jí)鏈僅存在用于確定可將哪些指令實(shí)例從每個(gè)跟蹤的代碼中刪除。在這點(diǎn)上,所有的跟蹤包含所有的完全復(fù)制的基本塊。在現(xiàn)實(shí)中,僅有一般的基本塊且它具有很多名字。對(duì)于它名字中的每一個(gè),它具有其指令的不同子集。對(duì)于每個(gè)名字,它具有去往其它一般基本塊的不同名字的輸出邊沿。一些輸出邊沿是后邊沿。一般而言,在其一些或甚至全部名字下的很多基本塊將不包含指令?;緣K的每個(gè)名字具有其自身的輸出邊沿。每個(gè)空基本塊實(shí)例具有輸出邊沿??赡茉诨蚩赡懿辉诨緣K的某些名字中的分支和跳躍并不正確地支持該基本塊的該名字的輸出邊沿。存在不包含跳躍或分支指令的基本塊的實(shí)例(名字),然而存在該基本塊的該實(shí)例的輸出邊沿。存在的分支和跳躍仍具有原始代碼目標(biāo)IP。這也是固定的。目標(biāo)IP必須被改變以支持輸出邊沿,但這還未完成。并且對(duì)于很多基本塊的實(shí)例,甚至控制傳遞指令(跳躍)必須被插入在末端以支持輸出邊沿。在這一點(diǎn),所有的跟蹤精確地具有相同的控制流程結(jié)構(gòu)和精確相同的基本塊實(shí)例。它們都是相同的東西,僅僅具有對(duì)于每個(gè)跟蹤不同的指令刪除。然而,跟蹤的刪除可以很大,從整個(gè)結(jié)構(gòu)倒空所有指令。例如,環(huán)中的所有指令可能已經(jīng)從跟蹤完全消失??缍葮?biāo)記跨度標(biāo)記指令是特殊指令,在一些實(shí)施例中是對(duì)DTSE寄存器的存儲(chǔ),它還指示哪些其它跟蹤也在代碼的相同位置具有該跨度標(biāo)記。這稍后將被填充。在生成可執(zhí)行代碼之前,這將不是已知的。在一些實(shí)施例中,以展開(kāi)副本號(hào)數(shù)字級(jí)別的展開(kāi)副本0為目標(biāo)的任何后邊沿(不是反向后邊沿)獲得插入在后邊沿上的跨度標(biāo)記。這是僅包含跨度標(biāo)記的新基本塊。改變后邊沿以實(shí)際上以該新基本塊為目標(biāo)。該新基本塊僅具有一個(gè)無(wú)條件的輸出邊沿,該輸出邊沿去往后邊沿的先前目標(biāo)。在一些實(shí)施例中,來(lái)自這些跨度標(biāo)記的所有邊沿目標(biāo)將跨度標(biāo)記僅插入在連接點(diǎn)之前。該新跨度標(biāo)記不在自后邊沿上的跨度標(biāo)記開(kāi)始的路徑上。它在去往該連接點(diǎn)的所有其它路徑上。該跨度標(biāo)記還是僅包含跨度標(biāo)記且僅具有去往連接的1個(gè)無(wú)條件輸出邊沿的新基本塊。在一些實(shí)施例中,對(duì)于具有反向后邊沿的每個(gè)分支,該分支的再收斂點(diǎn)添加了跨度標(biāo)記作為基本塊中的第一指令。所有的跨度標(biāo)記將在所有的跟蹤上匹配,因?yàn)樗械母櫨哂邢嗤幕緣K和相同的邊沿。在可執(zhí)行代碼生成時(shí),相同的跨度標(biāo)記將從一些跟蹤消失。可能必須保持跟蹤哪些跨度標(biāo)記在跟蹤上匹配,所以當(dāng)它們中的一些消失時(shí)這將是已知的。可執(zhí)行代碼生成所生成的可執(zhí)行代碼不具有在DTSE軟件內(nèi)使用的標(biāo)識(shí)的靜態(tài)副本名或信息表。在一些實(shí)施例中,它是以地址次序順序地執(zhí)行的正常X86指令,除非至不同地址的分支或跳躍被執(zhí)行。該代碼是“池”。它不屬于任何特定跟蹤或其它的任何東西。如果代碼的一部分具有正確的指令序列,則任何跟蹤可在跟蹤的任何位置使用它。在“池”中,如果所需的代碼已經(jīng)存在,則不需要再次生成相同代碼的另一個(gè)副本。當(dāng)然有問(wèn)題,即一旦在一些代碼中開(kāi)始執(zhí)行,該代碼本身確定將被執(zhí)行的所有未來(lái)代碼。假設(shè)有某種代碼C,它匹配兩個(gè)不同使用U1和U2的所需指令序列,但在完成C的執(zhí)行之后,U1需要執(zhí)行指令序列X,而U2需要執(zhí)行指令序列Y,且X和Y是不同的。這可能有問(wèn)題。對(duì)于DTSE代碼生成,存在該問(wèn)題的至少兩個(gè)解決方案。在一些實(shí)施例中,第一解決方案是在DTSE軟件中生成代碼的靜態(tài)副本所采用的方式使得頻繁(但不總是)出現(xiàn)這種情況,即諸如U1和U2之類的不同使用(其需要諸如C之類的相同代碼序列一段時(shí)間)事實(shí)上在此之后將永遠(yuǎn)想要相同的代碼序列。在一些實(shí)施例中,第二解決方案是匹配諸如U1和U2之類的多種使用的諸如C之類的代碼段可成為DTSE子例程。在子例程內(nèi)U1和U2使用相同的代碼C,但在從該子例程返回后,U1和U2可以不同。而且,代碼分析軟件創(chuàng)建代碼的靜態(tài)副本所采用的方式使其通常顯而易見(jiàn)且易于形成這種子例程。這些子例程對(duì)于原始程序不是已知的。構(gòu)建塊代碼已經(jīng)被構(gòu)造成自然落入圓丘(hammock)。圓丘是成為DTSE子例程的自然候選。DTSE子例程不是原始程序已知的過(guò)程。注意,DTSE子例程的返回地址通常不被放入架構(gòu)棧中。除它對(duì)于程序不正確外,所有的執(zhí)行核將共享相同的架構(gòu)棧,然而,一般而言,它們執(zhí)行圓丘的不同版本并且需要不同的返回地址。期望使用調(diào)用和返回指令來(lái)去往DTSE子例程并從其返回,因?yàn)橛布浅>_地具有到分支預(yù)測(cè)返回的特殊結(jié)構(gòu)。在一些實(shí)施例中,棧指針在調(diào)用前被改變成指向DTSE私有棧,并在執(zhí)行代碼前改回程序棧指針。然后它被改回私有棧指針以便返回。私有棧指針值必須被保存在統(tǒng)一尋址但對(duì)于每個(gè)邏輯處理器不同的位置中。例如,一般的寄存器是這種存儲(chǔ)。但它們用于執(zhí)行程序。DTSE硬件可提供被統(tǒng)一尋址但訪問(wèn)邏輯處理器專用存儲(chǔ)的寄存器。如所指出的,它通常沒(méi)有必要形成子例程,因?yàn)楣蚕泶a序列的使用事實(shí)上將永遠(yuǎn)從該點(diǎn)執(zhí)行相同代碼。如果其用戶同意“永遠(yuǎn)”自該點(diǎn)的代碼,則將不使可共享的代碼序列成為子例程。如果對(duì)于圓丘的版本的所有使用在圓丘之后去往相同的代碼,在該點(diǎn)通常不需要返回。只要對(duì)所有的用戶相同,共同代碼可被擴(kuò)展。當(dāng)用戶不再同意執(zhí)行代碼時(shí),需要返回。僅當(dāng)期望執(zhí)行足夠長(zhǎng)以合理減少調(diào)用和返回的成本時(shí),才使圓丘成為子例程。如果這不是真的,則不使其成為子例程。內(nèi)聯(lián)過(guò)程過(guò)程被“內(nèi)聯(lián)”,生成它們的“副本”。這是遞歸的,所以僅利用幾個(gè)調(diào)用級(jí)和幾個(gè)調(diào)用點(diǎn),可以有大量的“副本”。另一方面,過(guò)程是DTSE子例程的良好候選??赡?,在最常見(jiàn)的情況下,對(duì)于過(guò)程的很多“副本”,它們均證明是相同的(而不是對(duì)于不同跟蹤為不同指令子集)。或者,證明僅有幾個(gè)實(shí)際不同的版本(而不是對(duì)于不同跟蹤為不同指令子集)。所以過(guò)程變?yōu)橐粋€(gè)或僅幾個(gè)DTSE子例程(而不是對(duì)于不同跟蹤為不同指令子集)。整體環(huán)展開(kāi)在一些實(shí)施例中,總是在環(huán)的展開(kāi)副本0中輸入環(huán)。環(huán)被限定為具有單個(gè)退出點(diǎn),即該環(huán)的展開(kāi)副本0中的環(huán)分支組的一般共同的再收斂點(diǎn)。這使其成為圓丘。因此,總是使環(huán)成為子例程。機(jī)會(huì)主義子例程分支樹(shù)的部分可作為在樹(shù)中重復(fù)的圓丘出現(xiàn)。其試驗(yàn)示例是分支的樹(shù),且線性靜態(tài)復(fù)制有效地解碼成很多線性代碼段。許多這些線性代碼段包含相同的代碼序列一段時(shí)間。線性代碼序列可總是子例程。代碼匯編在一些實(shí)施例中,對(duì)于每個(gè)跟蹤,拓?fù)涓情_(kāi)始點(diǎn),且從此處處遍歷所有的可到達(dá)代碼和所有可到達(dá)邊沿。在遍歷時(shí)生成代碼。先前解釋了如何從特定的基本塊實(shí)例前往特定的基本塊實(shí)例。特定跟蹤中的基本塊的實(shí)例可能不具有指令。然后不生成代碼。然而,可以有來(lái)自應(yīng)被維護(hù)的該基本塊實(shí)例的多個(gè)輸出邊沿。如果跟蹤中的基本塊的實(shí)例具有多個(gè)輸出邊沿,但從該跟蹤中的該實(shí)例刪除用于選擇輸出邊沿的分支或間接跳躍,則該跟蹤將不包括在該(刪除的)分支實(shí)例與其再收斂點(diǎn)之間的任何指令。在一些實(shí)施例中,遍歷不應(yīng)遵循該跟蹤中基本塊的該實(shí)例的多個(gè)輸出邊沿中的任一個(gè),但相反應(yīng)直接去往該跟蹤中該基本塊的末端處的(刪除)分支或跳躍的再收斂點(diǎn)。如果有來(lái)自基本塊實(shí)例的單個(gè)輸出邊沿,則不管是否有分支或跳躍,都遵循該邊沿。如果在該跟蹤的基本塊實(shí)例的末端處有在多個(gè)輸出邊沿之間進(jìn)行選擇的分支或間接跳躍,則遍歷遵循該多個(gè)輸出邊沿。在一些實(shí)施例中,當(dāng)跟蹤中的遍歷遇到包括用于該跟蹤的一個(gè)或多個(gè)指令的基本塊實(shí)例時(shí),將存在代碼。池中已經(jīng)存在的代碼可被使用或者可將新代碼添加到池。在任一種情況下,將待使用代碼置于特定地址。然后,該路徑上最后生成的代碼被固定以去往該地址??赡艿那闆r是,在該路徑上的最后在前代碼之后,可順序地放置該代碼。然后此處不需要獲得任何東西。否則,最后的在前指令可能已經(jīng)成為分支或跳躍。然后,其目標(biāo)IP需要被固定以去往正確的位置。該路徑上最后的在前代碼可能不是分支或跳躍。在這種情況下,需要插入至正確目的地的無(wú)條件跳躍。在跟蹤中,多數(shù)基本塊實(shí)例通常不可到達(dá)。所生成的代碼不必且不應(yīng)具有大量盲目生成的中間形式的靜態(tài)副本。所生成的代碼僅需要具有在每個(gè)可到達(dá)路徑上的正確的指令序列。在遍歷中間形式的邊緣時(shí),它可從一個(gè)靜態(tài)副本至另一個(gè)。靜態(tài)副本在所生成的代碼中不被區(qū)分。一般的想法是盡可能方便地到達(dá)正確的指令序列,例如如果已經(jīng)有具有正確指令序列的代碼,則使環(huán)閉合回到已經(jīng)為正確的原始IP生成的代碼。另一個(gè)示例是去往為不同的靜態(tài)副本生成的、但具有正確的指令序列的代碼。當(dāng)去往已經(jīng)在那里的代碼時(shí),出現(xiàn)問(wèn)題??赡苁?,現(xiàn)有的指令序列在一段時(shí)間是正確的,但之后它不再匹配。對(duì)于兩種不同的情況,代碼可去往相同的原始IP,但從相同原始IP需要的代碼序列對(duì)于兩種情況是不同的。線性靜態(tài)復(fù)制在一些實(shí)施例中,線性靜態(tài)復(fù)制創(chuàng)建代碼的“副本”,以防止在下一個(gè)后邊沿前,控制流在非環(huán)分支的一般再收斂點(diǎn)處物理再接合。這是基本的,直到包含環(huán)的下次迭代或包含環(huán)的退出。這些趨向于導(dǎo)致很多代碼“副本”的分支樹(shù)。在多數(shù)而非全部情況下,在分支的一般再收斂點(diǎn)之后已經(jīng)被保持分離的代碼不會(huì)變得不同,而是對(duì)于不同跟蹤的不同指令子集(期望的不同)。在代碼生成時(shí),可將其一起放回(對(duì)于對(duì)不同跟蹤形成的不同指令子集單獨(dú)地進(jìn)行),因?yàn)樵谝话阍偈諗奎c(diǎn)處,并且永遠(yuǎn)從那開(kāi)始,指令序列相同。副本已經(jīng)消失。如果代碼的可能的很多副本不全相同,它們可能僅落入幾種不同的可能性,所以很多靜態(tài)副本實(shí)際上導(dǎo)致所生成代碼的僅幾個(gè)靜態(tài)副本。即使對(duì)于分支B的副本全離開(kāi)且所生成的代碼完全再收斂,精確地如同原始代碼那樣(除了對(duì)不同跟蹤形成指令子集以外),從該靜態(tài)復(fù)制未獲得好處不是正確的。該代碼是傳送依賴性的通道。如果它未被分離,它將產(chǎn)生限制并行性的錯(cuò)誤依賴性。必須分離它。除此之外,由于跟蹤分離,在B的一般再收斂點(diǎn)之后的代碼副本有時(shí)(盡管不是通常)是不同的。整體環(huán)展開(kāi)在一些實(shí)施例中,整體環(huán)展開(kāi)創(chuàng)建用于嵌套環(huán)的代碼的很多“副本”。例如,如果有4級(jí)嵌套環(huán)且僅有2路展開(kāi),則有最內(nèi)部環(huán)體的16個(gè)副本。很不可能的是,這16個(gè)副本均不同。完全相反。環(huán)展開(kāi)具有遠(yuǎn)小于50%的機(jī)會(huì)提供任何有用的好處。流程的大部分展開(kāi)且通常全部展開(kāi)是沒(méi)有收益的。沒(méi)有收益的展開(kāi),即大部分展開(kāi),通常導(dǎo)致該環(huán)的所有副本是相同的(除了對(duì)于不同跟蹤形成不同指令子集)。因此,在代碼生成時(shí),大部分且通常是全部展開(kāi)被再次一起放回。但有時(shí),幾個(gè)副本是不同的且對(duì)并行性有益。如果來(lái)自展開(kāi)的環(huán)體的兩個(gè)副本是相同的,則在代碼生成時(shí),該環(huán)的后邊沿將去往相同的位置,因?yàn)樗璧囊韵轮噶钚蛄杏肋h(yuǎn)相同。該環(huán)的展開(kāi)副本已經(jīng)消失。如果這是內(nèi)部環(huán),則在由外部環(huán)創(chuàng)建的其很多副本中,這以相同方式發(fā)生。如果外部環(huán)具有有益展開(kāi),則非??赡艿氖莾?nèi)部環(huán)在外部環(huán)的多個(gè)副本中不是不同的,即使在外部環(huán)的副本中有區(qū)別。環(huán)自然地傾向于形成圓丘。很可能內(nèi)部環(huán)成為子例程。僅有一個(gè)它的副本(而不是對(duì)于不同跟蹤形成不同指令子集)。將從外部環(huán)的存活的多個(gè)副本中調(diào)用它。內(nèi)聯(lián)過(guò)程在一些實(shí)施例中,過(guò)程被“內(nèi)聯(lián)”,生成它們的“副本”。這是遞歸的,所以僅利用幾個(gè)調(diào)用級(jí)和幾個(gè)調(diào)用點(diǎn),可以有大量的“副本”。另一方面,過(guò)程是DTSE子例程的理想候選??赡?,在最常見(jiàn)的情況下,過(guò)程的很多“副本”,它們均證明是相同的(而不是對(duì)于不同跟蹤形成不同指令子集)?;蛘?,證明僅有幾個(gè)實(shí)際不同的版本(而不是對(duì)于不同跟蹤形成不同指令子集)。所以過(guò)程變?yōu)橐粋€(gè)或僅幾個(gè)DTSE子例程(而不是對(duì)于不同跟蹤形成不同指令子集)。如果過(guò)程未被“內(nèi)聯(lián)”則它將形成錯(cuò)誤依賴性。因此,即使過(guò)程被重構(gòu)為僅一個(gè)DTSE子例程(每個(gè)跟蹤),仍期望它被完全“復(fù)制”用于依賴性分析。除此之外,由于跟蹤分離,過(guò)程的“副本”有時(shí)但不經(jīng)常是不同的。復(fù)制存儲(chǔ)非常相同的指令最終可出現(xiàn)在多個(gè)跟蹤中,其中它將被冗余地執(zhí)行。出現(xiàn)這種情況是因?yàn)闆](méi)有從多個(gè)跟蹤刪除該指令。因?yàn)閷?duì)任何指令這都能發(fā)生,所以可以有出現(xiàn)在多個(gè)跟蹤中的存儲(chǔ),其中它們將被冗余地執(zhí)行。在一些實(shí)施例中,DTSE軟件標(biāo)記在多個(gè)跟蹤中冗余的同一存儲(chǔ)的情況。存儲(chǔ)可獲得特殊前綴或可在其前面是復(fù)制存儲(chǔ)標(biāo)記指令。在一些實(shí)施例中,復(fù)制存儲(chǔ)標(biāo)記指令可以是對(duì)DTSE寄存器的存儲(chǔ)。復(fù)制存儲(chǔ)標(biāo)記無(wú)論采用何種形式必須指示其它跟蹤將冗余地執(zhí)行該相同存儲(chǔ)。對(duì)齊標(biāo)記在一些實(shí)施例中,如果DTSE硬件檢測(cè)到從一個(gè)以上的跟蹤至相同對(duì)齊跨度中的相同字節(jié)的存儲(chǔ),則它將宣稱背離并導(dǎo)致?tīng)顟B(tài)恢復(fù)到最后的全局提交狀態(tài)并且流程退出。當(dāng)然,預(yù)期標(biāo)記的復(fù)制存儲(chǔ)。DTSE硬件將匹配冗余地執(zhí)行的所標(biāo)記復(fù)制存儲(chǔ),并且它們將被提交作為單個(gè)存儲(chǔ)??缍葮?biāo)記是對(duì)齊跨度分隔符。所標(biāo)記的復(fù)制存儲(chǔ)是對(duì)齊跨度分隔符。對(duì)齊標(biāo)記是對(duì)齊跨度分隔符。在一些實(shí)施例中,對(duì)齊標(biāo)記是特殊的指令。它是對(duì)DTSE寄存器的存儲(chǔ)并且指示其它跟蹤具有相同的對(duì)齊標(biāo)記。如果存在對(duì)多個(gè)跟蹤中的相同字節(jié)的存儲(chǔ),只要沖突存儲(chǔ)在不同的對(duì)齊跨度中,則硬件可按程序順序適當(dāng)?shù)胤胖眠@些存儲(chǔ)。DTSE硬件知道來(lái)自相同跟蹤的存儲(chǔ)器訪問(wèn)的程序順序。僅當(dāng)不同跟蹤在不同對(duì)齊跨度中時(shí),硬件知道不同跟蹤中存儲(chǔ)器訪問(wèn)的程序順序。在一些實(shí)施例中,如果硬件發(fā)現(xiàn)負(fù)載可能需要來(lái)自不在同一跟蹤中執(zhí)行的存儲(chǔ)的數(shù)據(jù),則它將宣稱違背并導(dǎo)致?tīng)顟B(tài)恢復(fù)到最后的全局提交狀態(tài),并且流程退出。在一些實(shí)施例中,DTSE軟件將相同形式的對(duì)齊標(biāo)記置于出現(xiàn)在多個(gè)跟蹤中的存儲(chǔ)之間,已經(jīng)看到該多個(gè)跟蹤命中相同字節(jié)。DTSE軟件放置對(duì)齊標(biāo)記,使得看到命中與存儲(chǔ)相同的地址的任何負(fù)載將被適當(dāng)?shù)嘏判蛑劣布?。狀態(tài)保存和恢復(fù)在一些實(shí)施例中,在每個(gè)跨度標(biāo)記處建立全局提交點(diǎn)??缍葮?biāo)記本身將標(biāo)識(shí)符發(fā)送到硬件。在一些實(shí)施例中,DTSE軟件構(gòu)建表。如果必須恢復(fù)狀態(tài)至最后的全局提交點(diǎn),則軟件將從硬件獲得標(biāo)識(shí)符并且在表中查找該全局提交點(diǎn)。DTSE軟件將該全局提交點(diǎn)的原始代碼IP放置在表中,連同不頻繁改變且在代碼準(zhǔn)備時(shí)已知的此代碼位置處的其它狀態(tài),例如,代碼運(yùn)行的環(huán)。其它信息可以是可能已經(jīng)從最后的全局提交點(diǎn)改變的寄存器。可能此處有一個(gè)至軟件代碼的指針以恢復(fù)該狀態(tài),因?yàn)樵摯a可被定制用于不同的全局提交點(diǎn)。在一些實(shí)施例中,將代碼添加到每個(gè)跨度標(biāo)記以保存任何需要保存的數(shù)據(jù),使得在需要時(shí)可恢復(fù)狀態(tài)。這可能包括至少一些寄存器值。在一些實(shí)施例中,可能定制到全局提交點(diǎn)的代碼被添加以恢復(fù)狀態(tài)。將代碼的指針置于表中。相對(duì)頻繁地遇到全局提交點(diǎn),但狀態(tài)恢復(fù)較不頻繁。有利的是當(dāng)必須執(zhí)行實(shí)際狀態(tài)恢復(fù)時(shí),以甚至大大增加工作為代價(jià)最小化全局提交點(diǎn)處的工作。因此,對(duì)于依賴性分析和跟蹤分離的一些實(shí)施例,代碼均被擴(kuò)展至很多“副本”。在可執(zhí)行代碼生成時(shí),它主要被再次一起放回。邏輯處理器管理可利用一組核實(shí)現(xiàn)DTSE,該組核具有多個(gè)同時(shí)多線程化硬件線程,例如每個(gè)核2個(gè)同時(shí)多線程化硬件線程。DTSE系統(tǒng)可創(chuàng)建更多的邏輯處理器,使得每個(gè)核看似具有例如四個(gè)邏輯處理器而不是僅兩個(gè)。此外,DTSE系統(tǒng)可有效地管理核資源以實(shí)現(xiàn)邏輯處理器。最后,如果DTSE已經(jīng)將一些代碼流分解成多個(gè)線程,則這些線程可運(yùn)行在邏輯處理器上。為了在具有例如2個(gè)同時(shí)多線程化硬件線程的核上實(shí)現(xiàn)例如四個(gè)邏輯處理器,在一些實(shí)施例中,DTSE系統(tǒng)將為例如兩個(gè)邏輯處理器(其在核硬件中不具有其狀態(tài))保持處理器狀態(tài)。DTSE系統(tǒng)將時(shí)常地切換每個(gè)同時(shí)多線程化硬件線程中的狀態(tài)。DTSE將生成用于每個(gè)軟件線程的代碼。視具體情況,DTSE可完成線程分解以從單個(gè)原始代碼流形成若干線程,或DTSE可僅從單個(gè)原始代碼流形成單個(gè)線程。無(wú)論如何,對(duì)于單個(gè)原始代碼流以相同方式生成代碼。在跟蹤分離時(shí),可將代碼分成一個(gè)以上的線程,或跟蹤分離可將所有的代碼放入相同的單個(gè)跟蹤。在生成可執(zhí)行代碼之前,可在代碼上完成附加工作,包括指令的添加,以實(shí)現(xiàn)邏輯處理器管理。在一些實(shí)施例中,DTSE硬件將提供統(tǒng)一尋址的至少一個(gè)存儲(chǔ)位置,但事實(shí)上對(duì)于執(zhí)行訪問(wèn)的每個(gè)同時(shí)多線程化硬件線程這將訪問(wèn)不同的存儲(chǔ)。在實(shí)施例中,這是處理器通用寄存器,諸如RAX。這由運(yùn)行在任何核上的任何同時(shí)多線程化硬件線程訪問(wèn),因?yàn)椤癛AX”但存儲(chǔ)位置以及因此的數(shù)據(jù)對(duì)于執(zhí)行對(duì)“RAX”的訪問(wèn)的每個(gè)同時(shí)多線程化硬件線程是不同。在實(shí)施例中,處理器通用寄存器用于運(yùn)行程序代碼,所以DTSE需要一些其它的DTSE硬件將提供的同時(shí)多線程化硬件線程專用存儲(chǔ)。對(duì)于每個(gè)DTSE邏輯模塊的同時(shí)多線程化硬件線程,這將是例如一個(gè)或幾個(gè)寄存器。具體地,在一些實(shí)施例中,同時(shí)多線程化硬件先用專用存儲(chǔ)寄存器ME將包含至當(dāng)前運(yùn)行在該同時(shí)多線程化硬件線程中的邏輯處理器的狀態(tài)保存表的指針。在此位置的表將包含某些其它信息,諸如至運(yùn)行的下一邏輯處理器的保存區(qū)的指針以及至運(yùn)行在該同時(shí)多線程化硬件線程保存表上的先前邏輯處理器的指針。對(duì)于所有的原始代碼流,對(duì)于所有的線程,DTSE生成的全部代碼在相同的地址空間中。因此,任何原始代碼流的任何生成的代碼可跳至任何原始代碼流的所生成代碼。DTSE專用數(shù)據(jù)也全在相同的地址空間中。一般而言,程序數(shù)據(jù)空間在每個(gè)原始代碼流的不同地址空間內(nèi)。有效線程切換。在一些實(shí)施例中,DTSE將在為其生成代碼的每個(gè)線程中插入HT切換入口點(diǎn)和退出點(diǎn)。因此,在硬件部分討論這種入口點(diǎn)的使用。HT切換入口點(diǎn)在一些實(shí)施例中,HT切換入口點(diǎn)處的代碼將從ME讀取至其本身的保存表的指針,然后是至下一邏輯處理器保存表的指針。從該表,可獲得下一HT切換入口點(diǎn)的IP以轉(zhuǎn)到后續(xù)被處理的入口點(diǎn)。代碼可使用特殊的指令,該指令將該地址推入分支預(yù)測(cè)器中的返回預(yù)測(cè)棧。任選地,在該地址且可能在附加的地址發(fā)出預(yù)取。這全部是對(duì)下一HT切換的設(shè)置,將在該當(dāng)前HT切換入口點(diǎn)之后進(jìn)行下一HT切換?,F(xiàn)在需要設(shè)置返回預(yù)測(cè)器,所以下一HT切換將被正確地預(yù)測(cè)。如果在下一HT切換之后,可能有I高速緩存未命中,在這點(diǎn)行應(yīng)發(fā)出預(yù)取,以在下一HT線程切換時(shí)使該I流在I高速緩存中。代碼然后將在該點(diǎn)從其自身的保存表中讀取其所需狀態(tài),并且在該HT切換入口點(diǎn)之后重新開(kāi)始執(zhí)行代碼。這可包括當(dāng)需要時(shí)加載CR3、EPT和段寄存器。有利的是,例如,使共享相同的同時(shí)多線程化硬件線程的邏輯處理器具有相同的地址空間,因?yàn)樗鼈兙\(yùn)行來(lái)自相同過(guò)程的線程,使得它不必將這些寄存器重新加載在HT切換上,盡管這不是必須的。HT切換退出點(diǎn)在一些實(shí)施例中,在HT切換退出點(diǎn)處的代碼將從ME讀取至其自身的保存表的指針。它將存儲(chǔ)所需的狀態(tài)用于恢復(fù)到其自身的保存表。它然后將從其自身的保存表讀取至下一邏輯處理器的保存表的指針,以將其運(yùn)行并寫入到ME。它讀取要去的下一HT切換入口點(diǎn)的IP,并將它推到棧上。它進(jìn)行返回指令,以執(zhí)行至所需HT切換入口點(diǎn)的完全預(yù)測(cè)跳躍。注意,在HT切換退出點(diǎn)處的代碼在其再次獲得要運(yùn)行的同時(shí)多線程化硬件線程時(shí),具有對(duì)IP的控制,它在該IP處重新開(kāi)始。它可將它想在IP中的任何東西放在其自身的保存表中。有效的不可預(yù)測(cè)間接分支在一些實(shí)施例中可由DTSE通過(guò)改變間接分支以僅計(jì)算分支目標(biāo)來(lái)有效地完成不可預(yù)測(cè)間接分支。它之后是HT切換退出點(diǎn),但存儲(chǔ)至保存表的所計(jì)算的分支目標(biāo)。當(dāng)該線程切換回時(shí),它將自然地去往間接分支的正確目標(biāo)。這可完成,且對(duì)于間接分支或HT切換,無(wú)分支未命中預(yù)測(cè)和無(wú)I高速緩存未命中。對(duì)于邏輯處理器的切換資源在一些實(shí)施例中有特殊的指令或前綴,停止獲取直到分支報(bào)告。就在分支或間接跳躍之前,可插入該指令。當(dāng)停止獲取直到分支報(bào)告被解碼時(shí),只要其它同時(shí)多線程化硬件線程正前進(jìn),對(duì)于該I流的指令獲取停止,且在該I流的下一后續(xù)指令之后沒(méi)有指令將被解碼。如果其它同時(shí)多線程化硬件線程不前進(jìn),則該指令被忽略。以下指令應(yīng)是分支或間接跳躍。它被加標(biāo)簽。分支和跳躍在執(zhí)行時(shí)報(bào)告它們被正確預(yù)測(cè)或未命中預(yù)測(cè)。當(dāng)加標(biāo)簽的分支報(bào)告時(shí),對(duì)于該I流的指令獲取和解碼被重新開(kāi)始。當(dāng)在該同時(shí)多線程化硬件線程中的任何分支報(bào)告未命中預(yù)測(cè)時(shí),指令獲取和解碼重新開(kāi)始。在一些實(shí)施例中,有特殊的指令或前綴,停止獲取直到負(fù)載報(bào)告??稍谪?fù)載之后的某一時(shí)間插入該指令。它具有操作數(shù),將使該操作數(shù)為負(fù)載的結(jié)果。停止獲取直到負(fù)載報(bào)告指令實(shí)際執(zhí)行。它將報(bào)告它何時(shí)執(zhí)行而不被取消。有兩種形式的停止獲取直到負(fù)載報(bào)告指令:有條件和無(wú)條件。無(wú)條件停止獲取直到負(fù)載報(bào)告指令在被解碼時(shí)將停止指令獲取和解碼。有條件停止獲取直到負(fù)載報(bào)告指令在被解碼時(shí)僅當(dāng)其它同時(shí)多線程化硬件線程前進(jìn)時(shí)停止該I流上的指令獲取和解碼。當(dāng)指令報(bào)告未取消的執(zhí)行時(shí),兩種形式的指令重新開(kāi)始該I流上的指令獲取和解碼,且對(duì)于該I流沒(méi)有顯著的數(shù)據(jù)高速緩存未命中。代碼分析如果該執(zhí)行實(shí)例被未命中預(yù)測(cè)或正確預(yù)測(cè),則閃速概況分析將針對(duì)每個(gè)單獨(dú)的分支或跳躍執(zhí)行實(shí)例進(jìn)行指示。它將指示獲取I高速緩存未命中、二級(jí)高速緩存未命中和對(duì)DRAM未命中的指令執(zhí)行實(shí)例。如果該執(zhí)行實(shí)例獲得數(shù)據(jù)高速緩存未命中、二級(jí)高速緩存未命中或?qū)RAM的未命中,則它將針對(duì)每個(gè)負(fù)載執(zhí)行實(shí)例進(jìn)行指示。DTSE軟件進(jìn)行的所有形式的靜態(tài)復(fù)制還可用于邏輯處理器管理。在一些實(shí)施例中,負(fù)載、分支和間接跳躍的所有靜態(tài)實(shí)例獲取未命中數(shù)。在這些實(shí)施例中指令的靜態(tài)實(shí)例獲取高速緩存未命中數(shù)。相同指令的不同靜態(tài)實(shí)例(通過(guò)原始IP)經(jīng)常具有不同的未命中行為,因此通常最好使用指令的靜態(tài)實(shí)例。指令的實(shí)例越多,每個(gè)實(shí)例的未命中率數(shù)為高或低的機(jī)會(huì)越好。中間未命中率數(shù)更難以處理。盡管盡最大努力且盡管與只使用IP相比有很大改進(jìn),然而可能仍有很多指令實(shí)例具有中間范圍的未命中數(shù)。在一些實(shí)施例中,分組是處理中間范圍未命中數(shù)的一種方式。各自具有中間范圍的未命中預(yù)測(cè)率的小分支樹(shù)可在穿過(guò)該樹(shù)的執(zhí)行路徑上的某處呈現(xiàn)大概率的某種未命中預(yù)測(cè)。類似地,各自具有中間范圍的高速緩存未命中率的若干負(fù)載的順序串可呈現(xiàn)在至少一個(gè)負(fù)載上大概率的未命中。環(huán)展開(kāi)是編組機(jī)制。在環(huán)迭代中的單個(gè)負(fù)載可具有中間范圍高速緩存未命中率。如果將若干環(huán)迭代上負(fù)載的多次執(zhí)行作為一組,則它可呈現(xiàn)在這些迭代中的至少一個(gè)中的高概率的高速緩存未命中。迭代內(nèi)的多個(gè)負(fù)載自然與編組的多個(gè)迭代組合在一起。在一些實(shí)施例中,DTSE軟件創(chuàng)建組,使得每個(gè)組具有相對(duì)高概率的某類未命中。有時(shí)組可被壓縮。對(duì)于分支樹(shù)尤其如此。分支樹(shù)中的稍后分支可通過(guò)靜態(tài)復(fù)制分支之前使用但現(xiàn)在在該分支之后的指令來(lái)向上移動(dòng)。這將樹(shù)中的分支更緊密地壓緊。如果組僅僅非??赡塬@取分支未命中預(yù)測(cè),它一般不值得HT切換。在一些實(shí)施例中,停止獲取直到分支報(bào)告在該路徑上的最后組分支之前被插入到組外的路徑上。執(zhí)行路徑上的組中的分支將被解碼,然后解碼將停止,只要其它同步多線程化硬件線程前進(jìn)。這將核資源給予其它同時(shí)多線程化硬件線程。如果組中沒(méi)有未命中預(yù)測(cè),當(dāng)執(zhí)行路徑上的最后組分支報(bào)告時(shí),將再次開(kāi)始獲取和解碼。否則,分支報(bào)告未命中預(yù)測(cè)之后,獲取將在正確的目標(biāo)地址重新開(kāi)始。這不是非常完美的,因?yàn)榉种Э赡懿话错樞驁?bào)告。然而,HT切換用于具有高概率的未命中預(yù)測(cè)的間接分支,如之前描述的。類似地,如果組僅僅非??赡塬@取數(shù)據(jù)高速緩存未命中,它一般優(yōu)選不進(jìn)行HT切換。如果可能,在一些實(shí)施例中,組中的負(fù)載將被移動(dòng),使得所有負(fù)載在任何負(fù)載的第一消費(fèi)者之前。在一些實(shí)施例中,使有條件停止獲取直到負(fù)載報(bào)告指令依賴于組中最后的負(fù)載并被置于負(fù)載之后但在任何消費(fèi)者之前。如果數(shù)據(jù)高速緩存數(shù)據(jù)高速緩存未命中幾乎確定,但它僅僅是數(shù)據(jù)高速緩存未命中,可使用無(wú)條件停止獲取直到負(fù)載報(bào)告指令。通常,組中的負(fù)載一般不被放在任何消費(fèi)者之前。例如,如果組是環(huán)的展開(kāi)迭代,則這不起作用。在這種情況下,期望使組足夠大,使得至少一個(gè)且優(yōu)選為若干個(gè)數(shù)據(jù)高速緩存未命中幾乎不可避免。如果組是環(huán)的展開(kāi)迭代,則這一般可實(shí)現(xiàn)。在一些實(shí)施例中,生成預(yù)取集以覆蓋組中的負(fù)載。首先放置預(yù)取,然是HT切換然后是代碼。具有高概率的二級(jí)高速緩存未命中、D流或I流的組被證明且HT切換。首先放置預(yù)取,然是HT切換,然后是代碼。甚至大約30%的DRAM未命中可能性可證明HT切換是正當(dāng)?shù)?。在這些實(shí)例中,在一些實(shí)施例中,首先進(jìn)行預(yù)取,然后是HT切換。仍然優(yōu)選的是更多分組以使未命中概率更高,且如果可覆蓋若干未命中則更好。在一些實(shí)施例中,在HT切換發(fā)生時(shí),其它同時(shí)的多線程化硬件線程上的工作被“覆蓋”。目標(biāo)是總是使一個(gè)同時(shí)的多線程化硬件線程進(jìn)行實(shí)際工作。如果一個(gè)同時(shí)的多線程化硬件線程進(jìn)行實(shí)際工作,而其它停止獲取,在運(yùn)行同時(shí)多線程化硬件線程的任何時(shí)間存在問(wèn)題風(fēng)險(xiǎn)。所以一般而言,不會(huì)長(zhǎng)時(shí)間僅依賴單個(gè)工作的同時(shí)多線程化硬件線程。另外,長(zhǎng)的停止獲取通常不是期望的。如果進(jìn)行得太長(zhǎng),在一些實(shí)施例中進(jìn)行HT切換,所以當(dāng)其遇到阻礙時(shí)工作的同時(shí)多線程化硬件線程被另一個(gè)支持。示例性計(jì)算機(jī)系統(tǒng)和處理器圖12是示出根據(jù)本發(fā)明的實(shí)施例的核的示例性無(wú)序架構(gòu)的框圖。然而,上述指令也可實(shí)現(xiàn)在有序架構(gòu)中。在圖12中,箭頭指示兩個(gè)或更多個(gè)單元之間的耦合,且箭頭的方向指示這些單元之間的數(shù)據(jù)流的方向。該架構(gòu)的組件可用于處理以上詳述的指令,包括這些指令的獲取、解碼和執(zhí)行。圖12包括耦合到執(zhí)行引擎單元1210和存儲(chǔ)器單元1215的前端單元1205;執(zhí)行引擎單元1210還耦合到存儲(chǔ)器單元1215。前端單元1205包括耦合到二級(jí)(L2)分支預(yù)測(cè)單元1222的一級(jí)(L1)分支預(yù)測(cè)單元1220。這些單元允許核獲取并執(zhí)行指令而不等待分支被解析。L1和L2分支預(yù)測(cè)單元1220和1222耦合到L1指令高速緩存單元1224。L指令高速緩存單元1224保持將可能由執(zhí)行引擎單元1210執(zhí)行的指令或一個(gè)或多個(gè)線程。L1指令高速緩存單元1224耦合到指令轉(zhuǎn)換后備緩沖器(ITLB)1226。ITLB1226耦合到指令獲取和預(yù)解碼單元1228,該指令獲取和預(yù)解碼單元1228將字節(jié)流分成分立指令。指令獲取和預(yù)解碼單元1228耦合到指令隊(duì)列單元1230以存儲(chǔ)這些指令。解碼單元1232解碼包括上述指令的排隊(duì)指令。在一些實(shí)施例中,解碼單元1232包括復(fù)雜解碼器單元1234和三個(gè)簡(jiǎn)單解碼器單元1236、1238和1240。簡(jiǎn)單解碼器可處理大多數(shù)(如果不是全部的話)x86指令,其解碼成單個(gè)微操作。復(fù)雜解碼器可解碼映射到多個(gè)微操作的指令。解碼單元1232還可包括微代碼ROM單元1242。L1指令高速緩存單元1224還耦合到存儲(chǔ)器單元1215中的L2高速緩存單元1248。指令TLB單元1226還耦合到存儲(chǔ)器單元1215中的二級(jí)TLB單元1246。解碼單元1232、微代碼ROM單元1242和環(huán)流檢測(cè)器(LSD)單元1244各自耦合到執(zhí)行引擎單元1210中的重命名/分配器單元1256。LSD單元1244檢測(cè)何時(shí)執(zhí)行軟件中的環(huán),停止預(yù)測(cè)分支(及可能不正確預(yù)測(cè)環(huán)的最后分支)以及其外部的流指令。在一些實(shí)施例中,LSD1244高速緩存微操作。執(zhí)行引擎單元1210包括耦合到退役單元1274和統(tǒng)一調(diào)度器單元1258的重命名/分配器單元1256。重命名/分配器單元1256在任何寄存器重命名之前確定所需資源并分配可用資源用于執(zhí)行。該單元還將邏輯寄存器重命名至物理寄存器文件的物理寄存器。退役單元1274還耦合到執(zhí)行單元1260且包括記錄器緩沖器單元1278。該單元在指令完成時(shí)使指令退役。統(tǒng)一調(diào)度器單元1258還耦合到物理寄存器文件單元1276,物理寄存器文件單元1276耦合到執(zhí)行單元1260。該調(diào)度器在處理器上運(yùn)行的不同線程之間共享。物理寄存器文件單元1276包括MSR單元1277A、浮點(diǎn)寄存器單元1277B和整數(shù)寄存器單元1277C,且可包括未示出的附加寄存器文件(例如,混疊在MMX打包整數(shù)平面寄存器文件550上的標(biāo)量浮點(diǎn)棧寄存器文件545)。執(zhí)行單元1260包括三個(gè)混合標(biāo)量和SIMD執(zhí)行單元1262、1264和1272;負(fù)載單元1266;存儲(chǔ)地址單元1268;存儲(chǔ)數(shù)據(jù)單元1270。負(fù)載單元1266、存儲(chǔ)地址單元1268和存儲(chǔ)數(shù)據(jù)單元1270執(zhí)行負(fù)載/存儲(chǔ)和存儲(chǔ)器操作,且各自進(jìn)一步耦合到存儲(chǔ)器單元1215中的TLB單元1252。存儲(chǔ)器單元1215包括耦合到數(shù)據(jù)TLB單元1252的二級(jí)TLB單元1246。數(shù)據(jù)TLB單元1252耦合到L1數(shù)據(jù)高速緩存單元1254。L1數(shù)據(jù)高速緩存單元1254還耦合到L2高速緩存單元1248。在一些實(shí)施例中,L2高速緩存單元1248還耦合到存儲(chǔ)器單元1215內(nèi)部和/或外部的L3和更高級(jí)高速緩存單元1250。以下是適用于執(zhí)行本文詳述的指令的示例性系統(tǒng)。對(duì)于膝上計(jì)算機(jī)、臺(tái)式機(jī)、手持PC、個(gè)人數(shù)字助理、工程師工作站、服務(wù)器、網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)集線器、交換器、嵌入式處理器、數(shù)字信號(hào)處理器(DSP)、圖形設(shè)備、視頻游戲設(shè)備、機(jī)頂盒、微控制器、蜂窩電話、便攜式媒體播放器、手持設(shè)備以及各種其它電子設(shè)備,其它業(yè)內(nèi)已知的系統(tǒng)設(shè)計(jì)和配置也是適用的。一般而言,本文中公開(kāi)的各種能夠合并處理器和/或其它執(zhí)行邏輯的系統(tǒng)或電子設(shè)備一般是適用的?,F(xiàn)在參考圖13,所示出的是根據(jù)本發(fā)明一實(shí)施例的系統(tǒng)1300的框圖。系統(tǒng)1300可包括耦合至圖形存儲(chǔ)器控制器中樞(GMCH)1320的一個(gè)或多個(gè)處理元件1310、1315。附加的處理元件1315的任選性在圖13中通過(guò)虛線來(lái)表示。每個(gè)處理元件可以是單核,或可替代地包括多核。處理元件可任選地包括除處理核之外的其它片上元件,諸如集成存儲(chǔ)器控制器和/或集成I/O控制邏輯。此外,對(duì)于至少一個(gè)實(shí)施例,處理元件的(多個(gè))核可多線程化,因?yàn)樗鼈儗?duì)每個(gè)核可包括一個(gè)以上的硬件線程上下文。圖13示出GMCH1320可耦合至存儲(chǔ)器1340,該存儲(chǔ)器1340可以是例如動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)。對(duì)于至少一個(gè)實(shí)施例,DRAM可以與非易失性高速緩存相關(guān)聯(lián)。GMCH1320可以是芯片組或芯片組的一部分。GMCH1320可以與(多個(gè))處理器1310、1315進(jìn)行通信,并控制處理器1310、1315和存儲(chǔ)器1340之間的交互。GMCH1320還可擔(dān)當(dāng)(多個(gè))處理器1310、1315和系統(tǒng)1300的其它元件之間的加速總線接口。對(duì)于至少一個(gè)實(shí)施例,GMCH1320經(jīng)由諸如前端總線(FSB)1395之類的多點(diǎn)總線與(多個(gè))處理器1310、1315進(jìn)行通信。此外,GMCH1320耦合至顯示器1345(諸如平板顯示器)。GMCH1320可包括集成圖形加速器。GMCH1320還耦合至輸入/輸出(I/O)控制器中樞(ICH)1350,該輸入/輸出(I/O)控制器中樞(ICH)1350可用于將各種外圍設(shè)備耦合至系統(tǒng)1300。在圖13的實(shí)施例中作為示例示出了外部圖形設(shè)備1360以及另一外圍設(shè)備1370,該外部圖形設(shè)備1360可以是耦合至ICH1350的分立圖形設(shè)備。替代地,系統(tǒng)1300中還可存在附加或不同的處理元件。例如,附加(多個(gè))處理元件1315可包括與處理器1310相同的附加處理器、與處理器1310異類或不對(duì)稱的附加(多個(gè))處理器、加速器(諸如例如圖形加速器或數(shù)字信號(hào)處理(DSP)單元)、現(xiàn)場(chǎng)可編程門陣列或任何其它處理元件。按照包括架構(gòu)、微架構(gòu)、熱、功耗特征等等優(yōu)點(diǎn)的度量譜,物理資源1310、1315之間存在各種差別。這些差別會(huì)有效顯示為處理元件1310、1315之間的不對(duì)稱性和異類性。對(duì)于至少一個(gè)實(shí)施例,各種處理元件1310、1315可駐留在同一管芯封裝中?,F(xiàn)在參照?qǐng)D14,所示出的是根據(jù)本發(fā)明一實(shí)施例的第二系統(tǒng)1400的框圖。如圖14所示,多處理器系統(tǒng)1400是點(diǎn)對(duì)點(diǎn)互連系統(tǒng),并且包括經(jīng)由點(diǎn)對(duì)點(diǎn)互連1450耦合的第一處理元件1470和第二處理元件1480。如圖14所示,處理元件1470和1480中的每一個(gè)都可以是多核處理器,包括第一和第二處理器核(即,處理器核1474a與1474b以及處理器核1484a與1484b)。替代地,處理元件1470、1480中的一個(gè)或多個(gè)可以是除處理器之外的元件,諸如加速器或現(xiàn)場(chǎng)可編程門陣列。雖然僅以兩個(gè)處理元件1470、1480來(lái)示出,但應(yīng)理解本發(fā)明的范圍不限于此。在其它實(shí)施例中,在給定處理器中可存在一個(gè)或多個(gè)附加處理元件。第一處理元件1470還可包括存儲(chǔ)器控制器中樞(MCH)1472和點(diǎn)對(duì)點(diǎn)(P-P)接口1476和1478。類似地,第二處理元件1480可包括MCH1482與P-P接口1486和1488。處理器1470、1480可以經(jīng)由使用點(diǎn)對(duì)點(diǎn)(PtP)接口電路1478、1488的點(diǎn)對(duì)點(diǎn)(PtP)接口1450來(lái)交換數(shù)據(jù)。如圖14所示,MCH1472和1482將處理器耦合到相應(yīng)的存儲(chǔ)器,即存儲(chǔ)器1442和存儲(chǔ)器1444,這些存儲(chǔ)器可以是本地附連到相應(yīng)處理器的主存儲(chǔ)器部分。處理器1470、1480可各自經(jīng)由使用點(diǎn)對(duì)點(diǎn)接口電路1476、1494、1486、1498的單獨(dú)PtP接口1452、1454與芯片組1490交換數(shù)據(jù)。芯片組1490還可經(jīng)由高性能圖形接口1439與高性能圖形電路1438交換數(shù)據(jù)。本發(fā)明的實(shí)施方式可以置于具有任意數(shù)目的處理核的任意處理器中,或置于圖14的PtP總線代理中的每一個(gè)中。在一個(gè)實(shí)施例中,任意處理器核可包括本地高速緩存存儲(chǔ)器(未示出)或者以其它方式關(guān)聯(lián)于本地高速緩存存儲(chǔ)器(未示出)。此外,共享高速緩存(未示出)可被包括于在這兩個(gè)處理器的外部但經(jīng)由p2p互連與這些處理器連接的任一處理器中,從而如果一處理器被置于低功率模式,則任一個(gè)或這兩個(gè)處理器的本地高速緩存信息可被存儲(chǔ)在該共享的高速緩存中。第一處理元件1470和第二處理元件1480可分別經(jīng)由P-P互連1476、1486和1484耦合到芯片組1490。如圖14所示,芯片組1490包括P-P接口1494和1498。此外,芯片組1490包括將芯片組1490與高性能圖形引擎1448耦合的接口1492。在一個(gè)實(shí)施例中,總線1449可被用于將圖形引擎1448耦合到芯片組1490。替代地,點(diǎn)對(duì)點(diǎn)互連1449可耦合這些部件。芯片組1490又經(jīng)由接口1496耦合至第一總線1416。在一個(gè)實(shí)施例中,第一總線1416可以是外圍部件互連(PCI)總線或諸如PCIExpress總線或另一第三代I/O互連總線之類的總線,雖然本發(fā)明的范圍不限于此。如圖14所示,各種I/O設(shè)備1414可連同總線橋1418一起耦合到第一總線1416,總線橋1418將第一總線1416耦合到第二總線1420。在一個(gè)實(shí)施例中,第二總線1420可以是低引腳數(shù)(LPC)總線。多個(gè)設(shè)備可耦合至第二總線1420,包括例如鍵盤/鼠標(biāo)1422、通信設(shè)備1426以及數(shù)據(jù)存儲(chǔ)單元1428(諸如盤驅(qū)動(dòng)器或其它大容量存儲(chǔ)設(shè)備,在一個(gè)實(shí)施例中其可包括代碼1430)。此外,音頻I/O1424可耦合至第二總線1420。注意,其它體系結(jié)構(gòu)是可能的。例如,代替圖14的點(diǎn)對(duì)點(diǎn)架構(gòu),系統(tǒng)可實(shí)施多點(diǎn)總線或另一此類架構(gòu)?,F(xiàn)在參照?qǐng)D15,所示出的是根據(jù)本發(fā)明實(shí)施例的第三系統(tǒng)1500的框圖。圖14和15中的類似元件使用類似附圖標(biāo)記,且在圖15中省略了圖14的某些方面以避免混淆圖15的其它方面。圖15示出處理元件1470、1480可分別包括集成存儲(chǔ)器和I/O控制邏輯(“CL”)1472和1482。對(duì)于至少一個(gè)實(shí)施例,CL1472、1482可包括諸如以上結(jié)合圖13和14所描述的存儲(chǔ)器控制器中樞邏輯(MCH)。此外。CL1472、1482還可包括I/O控制邏輯。圖15示出不僅存儲(chǔ)器1442、1444耦合至CL1472、1482,而且I/O設(shè)備1514也耦合至控制邏輯1472、1482。傳統(tǒng)I/O設(shè)備1515耦合至芯片組1490。本文中公開(kāi)的機(jī)構(gòu)的實(shí)施例可按照硬件、軟件、固件或此類實(shí)現(xiàn)方法的組合來(lái)實(shí)現(xiàn)。本發(fā)明的實(shí)施例可被實(shí)現(xiàn)為在包括至少一個(gè)處理器、數(shù)據(jù)儲(chǔ)存器系統(tǒng)(包括易失性和非易失性存儲(chǔ)器和/或儲(chǔ)存元件)、至少一個(gè)輸入設(shè)備以及至少一個(gè)輸出設(shè)備的可編程系統(tǒng)上執(zhí)行的計(jì)算機(jī)程序??蓪⒅T如圖14中所示的代碼1430的程序代碼應(yīng)用于輸入數(shù)據(jù)以執(zhí)行本文中所描述的功能,并產(chǎn)生輸出信息。可按照已知方式將輸出信息應(yīng)用于一個(gè)或多個(gè)輸出設(shè)備。為了此應(yīng)用的目的,處理系統(tǒng)包括具有諸如例如數(shù)字信號(hào)處理器(DSP)、微控制器、專用集成電路(ASIC)或微處理器之類的處理器的任意系統(tǒng)。程序可按照高級(jí)過(guò)程或面向?qū)ο蟮母呒?jí)編程語(yǔ)言來(lái)實(shí)現(xiàn),以與處理系統(tǒng)通信。程序代碼在需要時(shí)還可按照匯編或機(jī)器語(yǔ)言來(lái)實(shí)現(xiàn)。實(shí)際上,本文中描述的機(jī)制在范圍上不限于任何特定編程語(yǔ)言。在任何情況下,該語(yǔ)言可以是編譯或解釋語(yǔ)言。至少一個(gè)實(shí)施例的一個(gè)或多個(gè)方面可以由存儲(chǔ)在機(jī)器可讀介質(zhì)上的代表性數(shù)據(jù)來(lái)實(shí)現(xiàn),該數(shù)據(jù)表示處理器中的各種邏輯,其在被機(jī)器讀取時(shí)使得該機(jī)器生成執(zhí)行本文描述的技術(shù)的邏輯。被稱為“IP核”的這些表示可以被存儲(chǔ)在有形的機(jī)器可讀介質(zhì)上,并被提供給各個(gè)顧客或生產(chǎn)設(shè)施以加載到實(shí)際制造該邏輯或處理器的制造機(jī)器中。此類機(jī)器可讀存儲(chǔ)介質(zhì)可包括但不限于通過(guò)機(jī)器或設(shè)備制造或形成的粒子的有形排列,包括存儲(chǔ)介質(zhì),諸如:硬盤;包括軟盤、光盤、壓縮盤只讀存儲(chǔ)器(CD-ROM)、可重寫壓縮盤(CD-RW)以及磁光盤的任何其它類型的盤;諸如只讀存儲(chǔ)器(ROM)之類的半導(dǎo)體器件;諸如動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)、靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM)之類的隨機(jī)存取存儲(chǔ)器(RAM);可擦除可編程只讀存儲(chǔ)器(EPROM);閃存;電可擦除可編程只讀存儲(chǔ)器(EEPROM);磁卡或光卡;或適于存儲(chǔ)電子指令的任何其它類型的介質(zhì)。因此,本發(fā)明的實(shí)施例也包括非瞬態(tài)有形機(jī)器可讀介質(zhì),該介質(zhì)包含諸如HDL之類的設(shè)計(jì)數(shù)據(jù),該設(shè)計(jì)數(shù)據(jù)限定本文中描述的結(jié)構(gòu)、電路、裝置、處理器和/或系統(tǒng)特征。此類實(shí)施例也可被稱為程序產(chǎn)品。本文公開(kāi)的指令的某些操作可由硬件組件執(zhí)行,且可體現(xiàn)在機(jī)器可執(zhí)行指令中,該指令用于導(dǎo)致或至少致使電路或其它硬件組件以執(zhí)行該操作的指令編程。電路可包括通用或?qū)S锰幚砥?、或邏輯電路,這里僅給出幾個(gè)示例。操作也可任選地由硬件和軟件的組合來(lái)執(zhí)行。執(zhí)行邏輯和/或處理器可包括響應(yīng)于從機(jī)器指令導(dǎo)出的機(jī)器指令或一個(gè)或多個(gè)控制信號(hào)以存儲(chǔ)指令指定的結(jié)果操作數(shù)的專用或特定電路或其它邏輯。例如,本文公開(kāi)的指令的實(shí)施例可在圖13、14和15的一個(gè)或多個(gè)系統(tǒng)中執(zhí)行,且指令的實(shí)施例可存儲(chǔ)在將在系統(tǒng)中執(zhí)行的程序代碼中。上述描述旨在說(shuō)明本發(fā)明的優(yōu)選實(shí)施例。根據(jù)上述討論,還應(yīng)當(dāng)顯而易見(jiàn)的是,在發(fā)展迅速且進(jìn)一步的進(jìn)展難以預(yù)見(jiàn)的此技術(shù)領(lǐng)域中,本領(lǐng)域技術(shù)人員可在安排和細(xì)節(jié)上對(duì)本發(fā)明進(jìn)行修改,而不背離落在所附權(quán)利要求及其等價(jià)方案的范圍內(nèi)的本發(fā)明的原理。例如,方法的一個(gè)或多個(gè)操作可組合或進(jìn)一步分開(kāi)。可選實(shí)施例盡管已經(jīng)描述了將自然執(zhí)行本文公開(kāi)的指令的實(shí)施例,但本發(fā)明的可選實(shí)施例可通過(guò)運(yùn)行在執(zhí)行不同指令集的處理器(例如,執(zhí)行美國(guó)加利福亞州桑尼維爾的MIPS技術(shù)的MIPS指令集的處理器、執(zhí)行加利福亞州桑尼維爾的ARM保持的ARM指令集的處理器)上的仿真層來(lái)執(zhí)行指令。同樣,盡管附圖中的流程圖示出本發(fā)明的某些實(shí)施例的特定操作順序,按應(yīng)理解該順序是示例性的(例如,可選實(shí)施例可按不同順序執(zhí)行操作、組合某些操作、使某些操作重疊等)。在以上描述中,為解釋起見(jiàn),闡明了眾多具體細(xì)節(jié)以提供對(duì)本發(fā)明的實(shí)施例的透徹理解。然而,將對(duì)本領(lǐng)域技術(shù)人員明顯的是,在沒(méi)有這些具體細(xì)節(jié)中的一些的情況下,也可實(shí)踐一個(gè)或多個(gè)其他實(shí)施例。提供所描述的具體實(shí)施例不是為了限制本發(fā)明而是為了說(shuō)明本發(fā)明的實(shí)施例。本發(fā)明的范圍不是由前面提供的具體示例來(lái)確定的,而是僅由所附權(quán)利要求來(lái)確定的。
當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
临沭县| 沛县| 梅州市| 磐安县| 延吉市| 石泉县| 松溪县| 嘉兴市| 浪卡子县| 广河县| 襄垣县| 股票| 双鸭山市| 池州市| 象州县| 隆尧县| 新巴尔虎右旗| 合水县| 东乌珠穆沁旗| 张掖市| 屯昌县| 嵊州市| 长泰县| 高尔夫| 桦甸市| 镇安县| 新野县| 玛纳斯县| 凌海市| 德庆县| 米脂县| 如东县| 昌都县| 梁河县| 永仁县| 罗定市| 海伦市| 汝南县| 武城县| 达日县| 岳阳县|