專利名稱:對(duì)特定指令類型的指令執(zhí)行和數(shù)據(jù)訪問(wèn)計(jì)數(shù)的方法和設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及一種改進(jìn)的數(shù)據(jù)處理系統(tǒng)。具體地說(shuō),本發(fā)明提供一種用于獲得數(shù)據(jù)處理系統(tǒng)內(nèi)的性能數(shù)據(jù)的方法和設(shè)備。更具體地說(shuō),本發(fā)明提供一種用于在獲得數(shù)據(jù)處理系統(tǒng)內(nèi)的性能數(shù)據(jù)時(shí)對(duì)軟件工具提供硬件協(xié)助的方法和設(shè)備。
背景技術(shù):
在分析和增強(qiáng)數(shù)據(jù)處理系統(tǒng)和在該數(shù)據(jù)處理系統(tǒng)內(nèi)執(zhí)行的應(yīng)用程序的性能時(shí),知道數(shù)據(jù)處理系統(tǒng)內(nèi)的哪些軟件模塊正在使用系統(tǒng)資源是有幫助的。數(shù)據(jù)處理系統(tǒng)的有效管理和增強(qiáng)需要知道如何和何時(shí)使用了各種系統(tǒng)資源。性能工具用來(lái)監(jiān)測(cè)和檢查數(shù)據(jù)處理系統(tǒng)以確定各種軟件應(yīng)用程序在數(shù)據(jù)處理系統(tǒng)內(nèi)執(zhí)行時(shí)的資源消耗。例如,性能工具可以識(shí)別數(shù)據(jù)處理系統(tǒng)中最頻繁執(zhí)行的模塊和指令,或者可以識(shí)別分配最大量的存儲(chǔ)器或執(zhí)行最多I/O請(qǐng)求的那些模塊。硬件性能工具可以內(nèi)置在系統(tǒng)中,或者在以后的時(shí)間點(diǎn)添加。
一種公知的軟件性能工具是跟蹤工具。跟蹤工具可以使用多種技術(shù)來(lái)提供表示執(zhí)行程序的執(zhí)行流的跟蹤信息。一種技術(shù)通過(guò)隨著特定事件的出現(xiàn)而對(duì)其進(jìn)行記錄來(lái)跟蹤該特定指令序列,即所謂的基于事件的剖析(profiling)技術(shù)。例如,跟蹤工具可以記錄對(duì)模塊、子例程、方法、函數(shù)或系統(tǒng)組件的每一次進(jìn)入和每一次退出?;蛘撸櫣ぞ呖梢杂涗浢恳粋€(gè)存儲(chǔ)器分配請(qǐng)求的請(qǐng)求者以及為其分配的存儲(chǔ)器量。典型地,為每一個(gè)這樣的事件產(chǎn)生帶時(shí)間戳記錄。還使用類似于進(jìn)入一退出記錄的對(duì)應(yīng)記錄對(duì)來(lái)跟蹤開(kāi)始和完成I/O或數(shù)據(jù)傳輸以及用于很多其它感興趣事件的任意代碼段的執(zhí)行。
為了改善由不同計(jì)算機(jī)家族生成的代碼的性能,經(jīng)常有必要確定處理器在執(zhí)行代碼時(shí)在何處花費(fèi)了時(shí)間,這樣的工作在計(jì)算機(jī)處理領(lǐng)域內(nèi)通常稱作定位“熱點(diǎn)”。在理想情況下,希望以指令和/或源代碼行級(jí)別查出這樣的熱點(diǎn),從而將注意力集中在通過(guò)代碼改進(jìn)而可能受益最大的區(qū)域。
另一種跟蹤技術(shù)涉及周期性地對(duì)程序的執(zhí)行流進(jìn)行采樣以識(shí)別該程序似乎花費(fèi)大量時(shí)間的特定程序位置。該技術(shù)基于以規(guī)則間隔周期性地中斷應(yīng)用程序或數(shù)據(jù)處理系統(tǒng)執(zhí)行的思想,即所謂的基于樣本的剖析。每次中斷時(shí),對(duì)預(yù)定時(shí)間長(zhǎng)度或者預(yù)定次數(shù)的感興趣事件記錄信息。例如,在此間隔期間可以記錄當(dāng)前執(zhí)行線程的程序計(jì)數(shù)器,其是正被剖析的較大程序的可執(zhí)行部分??梢栽诤筇幚頃r(shí)對(duì)照數(shù)據(jù)處理系統(tǒng)的裝入圖(load map)和符號(hào)表信息來(lái)解析這些值,并且可以通過(guò)這一分析獲得正在何處花費(fèi)時(shí)間的剖析信息(profile)。
創(chuàng)建諸如得到與特定情形或問(wèn)題有關(guān)的答案的工具可能非常費(fèi)力,并且可能非常難以校準(zhǔn),因?yàn)檐浖ぞ弑旧碛绊憸y(cè)試中的系統(tǒng)。本發(fā)明認(rèn)識(shí)到對(duì)工具開(kāi)發(fā)和問(wèn)題分析的硬件協(xié)助可以極大地減輕開(kāi)發(fā)軟件性能工具所需的工作量。此外,隨著處理器的密度增大,可以包括硬件協(xié)助來(lái)提供附加調(diào)試和分析特性。
因此,具有一種用于為用來(lái)分析數(shù)據(jù)處理系統(tǒng)的性能的性能工具提供硬件協(xié)助的改進(jìn)方法、設(shè)備和計(jì)算機(jī)指令將是有利的。
發(fā)明內(nèi)容
本發(fā)明提供了一種用于處理指令的方法、設(shè)備和計(jì)算機(jī)指令。響應(yīng)數(shù)據(jù)處理系統(tǒng)的處理器的指令高速緩存中接收到要執(zhí)行的指令,判定指示符是否與該指令相關(guān)聯(lián),以及該指令是否為指令范圍內(nèi)的特定類型。如果指示符與該指令相關(guān)聯(lián)并且該指令為該指令范圍內(nèi)的特定類型,則產(chǎn)生中斷。
在所附權(quán)利要求中闡述了被認(rèn)為是本發(fā)明特征的新穎特性。然而,通過(guò)參考下面結(jié)合附圖對(duì)示例性實(shí)施例的詳細(xì)描述,本發(fā)明本身以及優(yōu)選使用模式及其進(jìn)一步目的和優(yōu)點(diǎn)將會(huì)得到更好的理解,其中圖1是可以實(shí)現(xiàn)本發(fā)明的數(shù)據(jù)處理系統(tǒng)的方框圖;圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于處理信息的處理器系統(tǒng)的方框圖;圖3是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于處理與指示符相關(guān)聯(lián)的指令的組件的圖;圖4是示出根據(jù)優(yōu)選實(shí)施例的一種用于將性能指示符與指令或存儲(chǔ)單元(memory location)相關(guān)聯(lián)的機(jī)制的圖;圖5是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的指令包(bundle)的圖;圖6A和6B是根據(jù)本發(fā)明優(yōu)選實(shí)施例的包含性能指示符的子例程的圖;圖7是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于處理包含性能指示符的指令的過(guò)程的流程圖;圖8是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于選擇性地發(fā)送指令到中斷單元的過(guò)程的流程圖;圖9是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于響應(yīng)對(duì)與性能指示符相關(guān)聯(lián)的存儲(chǔ)單元的訪問(wèn)而產(chǎn)生中斷的過(guò)程的流程圖;圖10是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)事件進(jìn)行計(jì)數(shù)的過(guò)程的流程圖;圖11是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)指令進(jìn)行選擇性計(jì)數(shù)的過(guò)程的流程圖;圖12是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)指令進(jìn)行選擇性計(jì)數(shù)的過(guò)程的流程圖;圖13是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于識(shí)別超過(guò)閾值的指令的過(guò)程的流程圖;圖14是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于訪問(wèn)存儲(chǔ)單元的過(guò)程的流程圖;圖15是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于生成元數(shù)據(jù)如性能指示符的組件的方框圖;圖16是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的元數(shù)據(jù)的圖;圖17是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的裝入和維護(hù)性能檢測(cè)映像高速緩存(performance instrumentation shadow cache)時(shí)所涉及的組件的圖;圖18是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于生成指令元數(shù)據(jù)的過(guò)程的流程圖;圖19是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于生成存儲(chǔ)單元元數(shù)據(jù)的過(guò)程的流程圖;圖20是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)特定指令的執(zhí)行進(jìn)行計(jì)數(shù)的過(guò)程的流程圖;圖21是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)特定存儲(chǔ)單元的訪問(wèn)進(jìn)行計(jì)數(shù)的過(guò)程的流程圖;圖22是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于訪問(wèn)關(guān)于對(duì)指令的執(zhí)行或?qū)Υ鎯?chǔ)單元的訪問(wèn)所收集的信息的組件的圖;
圖23是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于自主修改程序中的代碼以允許對(duì)部分代碼進(jìn)行選擇性計(jì)數(shù)或剖析的組件的方框圖;圖24是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于將性能指示符動(dòng)態(tài)添加到指令中或者使其與指令相關(guān)聯(lián)的過(guò)程的流程圖;圖25是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用來(lái)通過(guò)將性能指示符與頁(yè)內(nèi)的指令相關(guān)聯(lián)來(lái)掃描頁(yè)的組件的圖;圖26是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于將指示符關(guān)聯(lián)到頁(yè)內(nèi)的指令的過(guò)程的流程圖;圖27是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的包含堆棧幀的調(diào)用堆棧的圖;圖28是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于識(shí)別與調(diào)用和返回從性能監(jiān)測(cè)器單元收集數(shù)據(jù)的指令相關(guān)聯(lián)的事件的過(guò)程的流程圖;圖29是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于識(shí)別已被執(zhí)行多于選定次數(shù)的指令的過(guò)程的流程圖;圖30是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于在特定指令被執(zhí)行多于某選定次數(shù)時(shí)檢查調(diào)用堆棧并識(shí)別例程調(diào)用者的過(guò)程的流程圖;圖31是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的為進(jìn)行監(jiān)視而選擇的指令和數(shù)據(jù)范圍的圖;以及圖32是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)設(shè)定范圍的訪問(wèn)次數(shù)以及在設(shè)定范圍內(nèi)執(zhí)行的指令數(shù)進(jìn)行計(jì)數(shù)的過(guò)程的流程圖。
具體實(shí)施例方式
現(xiàn)在參照?qǐng)D1,其中示出了可以實(shí)現(xiàn)本發(fā)明的數(shù)據(jù)處理系統(tǒng)的方框圖??蛻魴C(jī)100是計(jì)算機(jī)的例子,實(shí)現(xiàn)本發(fā)明的過(guò)程的代碼或指令可以位于其中??蛻魴C(jī)100采用外圍組件互連(PCI)局部總線架構(gòu)。雖然所示例子采用PCI總線,但是也可以使用其它總線架構(gòu)如加速圖形端口(AGP)和工業(yè)標(biāo)準(zhǔn)架構(gòu)(ISA)。處理器102和主存儲(chǔ)器104通過(guò)PCI橋108連接到PCI局部總線106。PCI橋108還可以包括用于處理器102的集成存儲(chǔ)器控制器和高速緩沖存儲(chǔ)器。與PCI局部總線106的其它連接可以通過(guò)直接組件互連或者通過(guò)內(nèi)插板來(lái)實(shí)現(xiàn)。在所示例子中,局域網(wǎng)(LAN)適配器110、小型計(jì)算機(jī)系統(tǒng)接口SCSI主機(jī)總線適配器112和擴(kuò)展總線接口114通過(guò)直接組件連接而連接到PCI局部總線106。與此相反,音頻適配器116、圖形適配器118和音頻/視頻適配器119通過(guò)插入到擴(kuò)展槽中的內(nèi)插板而連接到PCI局部總線106。擴(kuò)展總線接口114為鍵盤和鼠標(biāo)適配器120、調(diào)制解調(diào)器122和附加存儲(chǔ)器124提供連接。SCSI主機(jī)總線適配器112為硬盤驅(qū)動(dòng)器126、磁帶驅(qū)動(dòng)器128和CD-ROM驅(qū)動(dòng)器130提供連接。典型的PCI局部總線實(shí)現(xiàn)將支持三個(gè)或四個(gè)PCI擴(kuò)展槽或內(nèi)插連接器。
操作系統(tǒng)運(yùn)行在處理器102上,并且用來(lái)協(xié)調(diào)和提供對(duì)圖1的數(shù)據(jù)處理系統(tǒng)100內(nèi)的各個(gè)組件的控制。操作系統(tǒng)可以是市場(chǎng)上可買到的操作系統(tǒng),如可從微軟公司獲得的Windows XP。面向?qū)ο蟮木幊滔到y(tǒng)如Java可以結(jié)合操作系統(tǒng)運(yùn)行,并且提供從在客戶機(jī)100上執(zhí)行的Java程序或應(yīng)用程序?qū)Σ僮飨到y(tǒng)的調(diào)用?!癑ava”是太陽(yáng)微系統(tǒng)公司(Sun Microsystems,Inc.)的商標(biāo)。操作系統(tǒng)、面向?qū)ο蟮木幊滔到y(tǒng)、以及應(yīng)用程序或程序的指令位于諸如硬盤驅(qū)動(dòng)器126的存儲(chǔ)裝置上,并且可以裝入到主存儲(chǔ)器104中以由處理器102執(zhí)行。
本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,圖1中的硬件可以根據(jù)具體實(shí)現(xiàn)而不同。作為對(duì)圖1所示的硬件的補(bǔ)充或替代,可以使用其它內(nèi)部硬件或外圍裝置,如快閃只讀存儲(chǔ)器(ROM)、等效非易失性存儲(chǔ)器或光盤驅(qū)動(dòng)器等。另外,本發(fā)明的過(guò)程也可以應(yīng)用于多處理器數(shù)據(jù)處理系統(tǒng)。
例如,客戶機(jī)100,如果可選地配置為網(wǎng)絡(luò)計(jì)算機(jī),則可以不包括SCSI主機(jī)總線適配器112、硬盤驅(qū)動(dòng)器126、磁帶驅(qū)動(dòng)器128和CD-ROM 130。在這種情況下,該計(jì)算機(jī)可以適當(dāng)?shù)胤Q作客戶計(jì)算機(jī),并包括某種網(wǎng)絡(luò)通信接口如LAN適配器110、調(diào)制解調(diào)器122等。作為另一個(gè)例子,客戶機(jī)100可以是配置成在不依賴于某種網(wǎng)絡(luò)通信接口的情況下可啟動(dòng)的獨(dú)立系統(tǒng),而不管客戶機(jī)100是否包括某種網(wǎng)絡(luò)通信接口。作為另外一個(gè)例子,客戶機(jī)100可以是個(gè)人數(shù)字助理(PDA),其配置有ROM和/或快閃ROM來(lái)提供用于存儲(chǔ)操作系統(tǒng)文件和/或用戶所產(chǎn)生數(shù)據(jù)的非易失性存儲(chǔ)器。圖1所示的例子和上述例子不意味著隱含架構(gòu)限制。
本發(fā)明的過(guò)程使用可以位于例如主存儲(chǔ)器104、存儲(chǔ)器124或一個(gè)或多個(gè)外圍裝置126-130的存儲(chǔ)器中的計(jì)算機(jī)實(shí)現(xiàn)指令由處理器102執(zhí)行。
接下來(lái)參照?qǐng)D2,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于處理信息的處理器系統(tǒng)的方框圖。處理器210可以作為圖1中的處理器102實(shí)現(xiàn)。
在優(yōu)選實(shí)施例中,處理器210是單個(gè)集成電路超標(biāo)量微處理器。從而,如下面進(jìn)一步所述,處理器210包括各種單元、寄存器、緩沖器、存儲(chǔ)器和其它部分,所有這些都由集成電路形成。另外,在優(yōu)選實(shí)施例中,處理器210根據(jù)簡(jiǎn)化指令集計(jì)算機(jī)(“RISC”)技術(shù)運(yùn)行。如圖2所示,系統(tǒng)總線211連接到處理器210的總線接口單元(“BIU”)212。BIU212控制處理器210與系統(tǒng)總線211之間的信息傳輸。
BIU212連接到處理器210的指令高速緩存214和數(shù)據(jù)高速緩存216。指令高速緩存214將指令輸出到定序器單元218。響應(yīng)來(lái)自指令高速緩存214的這些指令,定序器單元218將指令選擇性地輸出到處理器210的其它執(zhí)行電路。
除了定序器單元218之外,在本優(yōu)選實(shí)施例中,處理器210的執(zhí)行電路還包括多個(gè)執(zhí)行單元,即轉(zhuǎn)移(branch)單元220、定點(diǎn)單元A(“FXUA”)222、定點(diǎn)單元B(“FXUB”)224、復(fù)合定點(diǎn)單元(“CFXU”)226、裝入/存儲(chǔ)單元(“LSU”)228以及浮點(diǎn)單元(“FPU”)230。FXUA222、FXUB224、CFXU226和LSU228從多個(gè)通用架構(gòu)寄存器(“GPR”)232和多個(gè)定點(diǎn)重命名(rename)緩沖器234輸入其源操作數(shù)信息。而且,F(xiàn)XUA222和FXUB224從進(jìn)位(“CA”)寄存器239輸入“進(jìn)位”。FXUA222、FXUB224、CFXU226和LSU228輸出其運(yùn)算結(jié)果(目的操作數(shù)信息)以存儲(chǔ)在定點(diǎn)重命名緩沖器234內(nèi)的選定條目(entry)上。另外,CFXU226從專用寄存器處理單元(“SPR單元”)237輸入并向其輸出源操作數(shù)信息和目的操作數(shù)信息。
FPU230從多個(gè)浮點(diǎn)架構(gòu)寄存器(“FPR”)236和多個(gè)浮點(diǎn)重命名緩沖器238輸入其源操作數(shù)信息。FPU230輸出其運(yùn)算結(jié)果(目的操作數(shù)信息)以存儲(chǔ)在浮點(diǎn)重命名緩沖器238內(nèi)的選定條目上。
響應(yīng)裝入指令,LSU228從數(shù)據(jù)高速緩存216輸入信息,并且將該信息拷貝到重命名緩沖器234和238中選定的一個(gè)。如果該信息未存儲(chǔ)在數(shù)據(jù)高速緩存216中,則數(shù)據(jù)高速緩存216(通過(guò)BIU212和系統(tǒng)總線211)從連接到系統(tǒng)總線211的系統(tǒng)存儲(chǔ)器239輸入該信息。而且,數(shù)據(jù)高速緩存216能夠(通過(guò)BIU212和系統(tǒng)總線211)將信息從數(shù)據(jù)高速緩存216輸出到連接到系統(tǒng)總線211的系統(tǒng)存儲(chǔ)器239。響應(yīng)存儲(chǔ)指令,LSU228從GPR232和FPR236中選定的一個(gè)輸入信息,并且將該信息拷貝到數(shù)據(jù)高速緩存216。
定序器單元218從GPR232和FPR236輸入信息,并且向其輸出信息。轉(zhuǎn)移單元220從定序器單元218輸入指令和表示處理器210的當(dāng)前狀態(tài)的信號(hào)。響應(yīng)該指令和信號(hào),轉(zhuǎn)移單元220(向定序器單元218)輸出表示存儲(chǔ)要由處理器210執(zhí)行的指令序列的合適的存儲(chǔ)器地址的信號(hào)。響應(yīng)來(lái)自轉(zhuǎn)移單元220的該信號(hào),定序器單元218從指令高速緩存214輸入所指示的指令序列。如果一條或多條指令序列沒(méi)有存儲(chǔ)在指令高速緩存214中,則指令高速緩存214(通過(guò)BIU212和系統(tǒng)總線211)從連接到系統(tǒng)總線211的系統(tǒng)存儲(chǔ)器239輸入這些指令。
響應(yīng)從指令高速緩存214輸入的指令,定序器單元218選擇性地將指令調(diào)度到執(zhí)行單元220、222、224、226、228和230中選定的一個(gè)。每個(gè)執(zhí)行單元執(zhí)行一條或多條特定指令類的指令。例如,F(xiàn)XUA222和FXUB224對(duì)源操作數(shù)執(zhí)行第一類定點(diǎn)數(shù)學(xué)運(yùn)算,如加法、減法、與運(yùn)算、或運(yùn)算以及異或運(yùn)算。CFXU226對(duì)源操作數(shù)執(zhí)行第二類定點(diǎn)運(yùn)算,如定點(diǎn)乘法和除法。FPU230對(duì)源操作數(shù)執(zhí)行浮點(diǎn)運(yùn)算,如浮點(diǎn)乘法和除法。
當(dāng)信息存儲(chǔ)在選定的一個(gè)重命名緩沖器234上時(shí),該信息與由為其分配了選定重命名緩沖器的指令指定的存儲(chǔ)位置(例如,GPR232或進(jìn)位(CA)寄存器242之一)相關(guān)聯(lián)。響應(yīng)來(lái)自定序器單元218的信號(hào),將選定的一個(gè)重命名緩沖器234上存儲(chǔ)的信息拷貝到與其關(guān)聯(lián)的一個(gè)GPR232(或CA寄存器242)中。定序器單元218響應(yīng)“完成”產(chǎn)生了該信息的指令,引導(dǎo)拷貝在選定的一個(gè)重命名緩沖器234上存儲(chǔ)的信息。該拷貝稱作“寫回”當(dāng)信息存儲(chǔ)在選定的一個(gè)重命名緩沖器238上時(shí),該信息與一個(gè)FPR236相關(guān)聯(lián)。響應(yīng)來(lái)自定序器單元218的信號(hào),將選定的一個(gè)重命名緩沖器238上存儲(chǔ)的信息拷貝到與其關(guān)聯(lián)的一個(gè)FPR236中。定序器單元218響應(yīng)“完成”產(chǎn)生該信息的指令,引導(dǎo)拷貝在選定的一個(gè)重命名緩沖器238上存儲(chǔ)的信息。
處理器210通過(guò)在執(zhí)行單元220、222、224、226、228和230中的各個(gè)單元上同時(shí)處理多條指令來(lái)實(shí)現(xiàn)高性能。因此,每條指令作為一系列級(jí)處理,其中每個(gè)級(jí)與其它指令的級(jí)可并行執(zhí)行。該技術(shù)稱作“流水線技術(shù)”。在該示例性實(shí)施例的一個(gè)重要方面,指令通常以六個(gè)級(jí)處理,即提取、譯碼、調(diào)度、執(zhí)行、完成和寫回。
在提取級(jí),定序器單元218選擇性地(從指令高速緩存214)從上面有關(guān)轉(zhuǎn)移單元220和定序器單元218而進(jìn)一步討論的存儲(chǔ)指令序列的一個(gè)或多個(gè)存儲(chǔ)器地址輸入一條或多條指令。
在譯碼級(jí),定序器單元218對(duì)多達(dá)四條所提取的指令進(jìn)行譯碼。
在調(diào)度級(jí),定序器單元218在為所調(diào)度指令結(jié)果(目的操作數(shù)信息)保留重命名緩沖器條目之后,將多達(dá)四條已譯碼的指令選擇性地調(diào)度到執(zhí)行單元220、222、224、226、228和230中(響應(yīng)譯碼級(jí)中的譯碼)選定的一個(gè)。在調(diào)度級(jí),將操作數(shù)信息提供給所調(diào)度指令的選定執(zhí)行單元。處理器210以指令編程序列的次序調(diào)度指令。
在執(zhí)行級(jí),如上所述,執(zhí)行單元執(zhí)行其調(diào)度指令,并且輸出其操作結(jié)果(目的操作數(shù)信息)以存儲(chǔ)在重命名緩沖器234和重命名緩沖器238內(nèi)的選定條目上。以這種方式,處理器210能夠相對(duì)于指令編程序列無(wú)序地執(zhí)行指令。
在完成級(jí),定序器單元218指示指令“完成”。處理器210以指令編程序列的次序“完成”指令。
在寫回級(jí),定序器218引導(dǎo)將信息分別從重命名緩沖器234和238拷貝到GPR232和FPR236。定序器單元218引導(dǎo)拷貝選定重命名緩沖器上存儲(chǔ)的信息。同樣,在特定指令的寫回級(jí),處理器210響應(yīng)該特定指令更新其架構(gòu)狀態(tài)。處理器210以指令編程序列的次序處理指令的各“寫回”級(jí)。處理器210在特定情形下有利地合并指令的完成級(jí)和寫回級(jí)。
在該示例性實(shí)施例中,每條指令需要一個(gè)機(jī)器周期來(lái)完成指令處理的每一個(gè)級(jí)。但是,一些指令(例如由CFXU226執(zhí)行的復(fù)合定點(diǎn)指令)可能需要多個(gè)周期。因此,響應(yīng)完成先前指令所需的時(shí)間的變化,在特定指令的執(zhí)行和完成級(jí)之間可能發(fā)生可變延遲。
完成緩沖器248安設(shè)在定序器218內(nèi)以跟蹤正在執(zhí)行單元內(nèi)執(zhí)行的多條指令的完成。一旦出現(xiàn)以應(yīng)用程序指定順序成功地完成了一條指令或一組指令的指示時(shí),可以利用完成緩沖器248來(lái)發(fā)起將這些已完成指令的結(jié)果傳輸?shù)疥P(guān)聯(lián)通用寄存器。
另外,處理器210還包括連接到指令高速緩存214以及處理器210中其它單元的性能監(jiān)測(cè)器單元240??梢岳眯阅鼙O(jiān)測(cè)器單元240來(lái)監(jiān)測(cè)處理器210的操作,在本示例性實(shí)施例中,性能監(jiān)測(cè)器單元240是能夠提供描述指令執(zhí)行資源利用和存儲(chǔ)控制的詳細(xì)信息的軟件可訪問(wèn)機(jī)制。雖然圖2中未示出,性能監(jiān)測(cè)器單元240耦接到處理器210的每個(gè)功能單元以允許監(jiān)測(cè)處理器210的所有方面的操作,包括例如重建事件之間的關(guān)系、識(shí)別虛假觸發(fā)、識(shí)別性能瓶頸、監(jiān)測(cè)流水線停頓(pipeline stall)、監(jiān)測(cè)空閑處理器周期、確定調(diào)度效率、確定轉(zhuǎn)移效率、確定未對(duì)準(zhǔn)(misaligned)數(shù)據(jù)訪問(wèn)的性能損失、識(shí)別串行化指令的執(zhí)行頻率、識(shí)別被禁止中斷以及確定性能效率。感興趣事件還可以包括例如指令譯碼時(shí)間、指令執(zhí)行、轉(zhuǎn)移事件、高速緩存失敗(miss)和高速緩存成功(hit)。
性能監(jiān)測(cè)器單元240包括其數(shù)目依賴于具體實(shí)現(xiàn)的(例如,2-8個(gè))計(jì)數(shù)器241-242,標(biāo)記為PMC1和PMC2,用來(lái)對(duì)選定事件的出現(xiàn)進(jìn)行計(jì)數(shù)。性能監(jiān)測(cè)器單元240還包括至少一個(gè)監(jiān)測(cè)器模式控制寄存器(MMCR)。在本例中,有兩個(gè)指定計(jì)數(shù)器241-242功能的控制寄存器MMCR243和244。計(jì)數(shù)器241-242和MMCR243-244最好作為通過(guò)可由CFXU226執(zhí)行的MFSPR(從SPR傳送)和MTSPR(傳送至SPR)指令可訪問(wèn)以進(jìn)行讀或?qū)懙腟PR實(shí)現(xiàn)。然而,在一個(gè)可替換實(shí)施例中,計(jì)數(shù)器241-242和MMCR243-244可以簡(jiǎn)單地作為I/O空間中的地址實(shí)現(xiàn)。在另一個(gè)替換實(shí)施例中,控制寄存器和計(jì)數(shù)器可以通過(guò)變址寄存器來(lái)間接訪問(wèn)。該實(shí)施例在來(lái)自英特爾公司(IntelCorporation)的處理器內(nèi)的IA-64架構(gòu)中實(shí)現(xiàn)。
另外,處理器210還包括連接到指令高速緩存214的中斷單元250。另外,雖然圖2中未示出,中斷單元250連接到處理器210內(nèi)的其它功能單元。中斷單元250可以從其它功能單元接收信號(hào),并且發(fā)起諸如開(kāi)始錯(cuò)誤處理或捕獲過(guò)程的操作。在這些例子中,使用中斷單元250來(lái)產(chǎn)生在程序執(zhí)行期間可能發(fā)生的中斷和異常。
本發(fā)明提供了在程序執(zhí)行期間監(jiān)視對(duì)特定指令的執(zhí)行以及對(duì)特定存儲(chǔ)單元的訪問(wèn)的能力。具體地說(shuō),可以使用空閑字段來(lái)保存用于標(biāo)識(shí)指令或存儲(chǔ)單元為要由性能監(jiān)測(cè)器單元或處理器中的某個(gè)其它單元監(jiān)測(cè)的指令或存儲(chǔ)單元的指示符?;蛘撸甘痉梢源鎯?chǔ)在與指令或存儲(chǔ)單元相關(guān)聯(lián)的另一個(gè)位置中。在指示符置于指令中的情況下,典型地使用空閑字段,但是在一些情況下可以擴(kuò)展指令以包括指示符所需的空間。在這種情況下,處理器的架構(gòu)可能需要改變。例如,64位架構(gòu)可以改成65位架構(gòu)以容納指示符。對(duì)于數(shù)據(jù)訪問(wèn),指示符可以與數(shù)據(jù)或該數(shù)據(jù)所在的存儲(chǔ)單元相關(guān)聯(lián)。
現(xiàn)在參照?qǐng)D3,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于處理與指示符相關(guān)聯(lián)的指令的組件的圖。指令高速緩存300接收指令包(bundle)302。指令高速緩存300是圖2中的指令高速緩存214的示例。指令包是一種指令編組。這種指令編組典型地出現(xiàn)于可從英特爾公司獲得的IA-64處理器中。指令高速緩存300處理所要執(zhí)行的指令。
作為該指令處理的一部分,指令高速緩存300確定哪些指令與指示符相關(guān)聯(lián)。在這些例子中,這些指示符也稱作“性能指示符”。信號(hào)304已與性能指示符相關(guān)聯(lián)。結(jié)果,將指令的信號(hào)304發(fā)送到性能監(jiān)測(cè)器單元306。性能監(jiān)測(cè)器單元306是圖2中的性能監(jiān)測(cè)器單元240的示例。
當(dāng)指令高速緩存300確定存在與指示符相關(guān)聯(lián)的指令時(shí),發(fā)送信號(hào)以表示正在執(zhí)行被標(biāo)記(marked)的指令。在這些例子中,被標(biāo)記的指令是與性能指示符相關(guān)聯(lián)的指令?;蛘?,性能指示符可以指示指令包中的所有項(xiàng)目或指令均被標(biāo)記以被計(jì)數(shù)。另外,這些指令的信號(hào)由指令高速緩存300發(fā)送到適當(dāng)?shù)墓δ軉卧8鶕?jù)具體實(shí)現(xiàn),不同于性能監(jiān)測(cè)器單元306的功能單元可以對(duì)指令執(zhí)行進(jìn)行計(jì)數(shù)。在性能指示符位于指令或指令包中的情況下,高速緩存單元即指令高速緩存300探測(cè)指示符,并且向性能監(jiān)測(cè)器單元306發(fā)送信號(hào)。
當(dāng)性能監(jiān)測(cè)器單元306接收到這些指令的信號(hào)時(shí),性能監(jiān)測(cè)器單元306對(duì)與指令304執(zhí)行相關(guān)聯(lián)的事件進(jìn)行計(jì)數(shù)。如圖所示,性能監(jiān)測(cè)器單元306編程為僅對(duì)與性能指示符相關(guān)聯(lián)的指令的事件進(jìn)行計(jì)數(shù)。換句話說(shuō),使用與指令或存儲(chǔ)單元相關(guān)聯(lián)的指示符來(lái)使得能夠由性能監(jiān)測(cè)器單元306對(duì)與指令或存儲(chǔ)單元相關(guān)聯(lián)的事件進(jìn)行計(jì)數(shù)。如果指令高速緩存300接收到?jīng)]有性能指示符的指令,則不對(duì)與該指令相關(guān)聯(lián)的事件進(jìn)行計(jì)數(shù)??偠灾阅苤甘痉沟媚軌蛟谔幚砥髦兄饌€(gè)指令地或逐個(gè)存儲(chǔ)單元地進(jìn)行計(jì)數(shù)。
如果性能監(jiān)測(cè)器單元306設(shè)成對(duì)這些類型的被標(biāo)記指令所允許的規(guī)格(metrics)進(jìn)行計(jì)數(shù)的模式,則性能監(jiān)測(cè)器單元306對(duì)與性能指示符相關(guān)聯(lián)的指令的事件進(jìn)行計(jì)數(shù)。在某些情況下,性能監(jiān)測(cè)器單元306可以設(shè)成執(zhí)行作為當(dāng)前可用功能的某種其它類型的計(jì)數(shù),例如對(duì)所有指令的執(zhí)行進(jìn)行計(jì)數(shù)。
對(duì)于訪問(wèn)存儲(chǔ)單元中的數(shù)據(jù),由數(shù)據(jù)高速緩存如圖2中的數(shù)據(jù)高速緩存216而不是由指令高速緩存來(lái)處理數(shù)據(jù)和指示符。數(shù)據(jù)高速緩存將表示正在訪問(wèn)被標(biāo)記存儲(chǔ)單元的信號(hào)發(fā)送到性能監(jiān)測(cè)器單元306。被標(biāo)記存儲(chǔ)單元類似于被標(biāo)記指令。這些類型的存儲(chǔ)單元是與性能指示符相關(guān)聯(lián)的存儲(chǔ)單元。
現(xiàn)在參照?qǐng)D4,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的一種用于將性能指示符與指令或存儲(chǔ)單元相關(guān)聯(lián)的機(jī)制的圖。處理器400從高速緩存402接收指令。在本例中,指示符不與指令一起存儲(chǔ),也不存儲(chǔ)于找到數(shù)據(jù)的存儲(chǔ)單元中。相反,指示符存儲(chǔ)在單獨(dú)的存儲(chǔ)區(qū)域,即性能檢測(cè)映像高速緩存(shadowcache)404內(nèi)。該存儲(chǔ)裝置可以是任何存儲(chǔ)裝置,例如系統(tǒng)存儲(chǔ)器、閃存、高速緩存或盤。
當(dāng)處理器400從高速緩存402接收指令時(shí),處理器400檢查性能檢測(cè)映像高速緩存404以查看性能指示符是否與指令相關(guān)聯(lián)。對(duì)包含數(shù)據(jù)的存儲(chǔ)單元的訪問(wèn)進(jìn)行類似的檢查。在一個(gè)實(shí)施例中,為每個(gè)不影響實(shí)際數(shù)據(jù)段的對(duì)應(yīng)的字提供完全映像字。換句話說(shuō),處理器400允許高速緩存402的架構(gòu)或配置保持不變。在這些例子中,所述映射是逐字的。然而,也可以使用某種其它類型的映射,例如每數(shù)據(jù)字一個(gè)映像位,其中性能檢測(cè)映像高速緩存404中的一位對(duì)應(yīng)于數(shù)據(jù)的一個(gè)字。
對(duì)于這種類型的架構(gòu),利用該特性,編譯器以類似于調(diào)試符號(hào)的方式在與數(shù)據(jù)區(qū)本身分離的工作區(qū)內(nèi)創(chuàng)建調(diào)試信息。當(dāng)裝入模塊時(shí),由裝入器準(zhǔn)備額外的信息即性能指示符,從而當(dāng)將指令裝入到高速緩存402中時(shí)使其可用于并入性能檢測(cè)映像高速緩存404中。這些高速緩存區(qū)域可以是混合的并且要么如此標(biāo)記要么通過(guò)操作模式理解。處理器400使用性能指示符來(lái)確定如何對(duì)相關(guān)數(shù)據(jù)訪問(wèn)和指令執(zhí)行進(jìn)行計(jì)數(shù),或者如何避免(take exception)相關(guān)數(shù)據(jù)訪問(wèn)和指令執(zhí)行。在這些例子中,通過(guò)調(diào)試器或性能分析程序?qū)⒃撨^(guò)程編程為了解在執(zhí)行指令時(shí)是否使用映像信息。
現(xiàn)在參照?qǐng)D5,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的指令包的圖。指令包500包含指令槽502、指令槽504、指令槽506和模板508。如圖所示,指令包500包含128位。每個(gè)指令槽包含41位,而模板508包含5位。模板508用來(lái)標(biāo)識(shí)當(dāng)前指令包內(nèi)的終止,并且將槽內(nèi)的指令映射到不同類型的執(zhí)行單元中。
指令包500內(nèi)的空閑位用來(lái)保存本發(fā)明的指示符。例如,指示符510、512和514分別位于指令槽502、504和506內(nèi)。這些指示符可以根據(jù)具體實(shí)現(xiàn)而采取各種形式和各種大小。指示符可以使用單個(gè)位或者可以使用多個(gè)位。單個(gè)位可以用來(lái)指示響應(yīng)該指令的執(zhí)行要對(duì)事件進(jìn)行計(jì)數(shù)。多個(gè)位可以用來(lái)標(biāo)識(shí)閾值,例如可以在對(duì)事件進(jìn)行計(jì)數(shù)之前傳遞的指令執(zhí)行的處理器或時(shí)鐘周期的數(shù)量。此外,這些位甚至可以用作針對(duì)特定指令的計(jì)數(shù)器。類似的字段使用可以用于標(biāo)記數(shù)據(jù)或存儲(chǔ)單元的指示符。
或者,模板508可以用來(lái)包含相關(guān)指示符的指令包,從而使用一位來(lái)標(biāo)識(shí)指令包中的所有指令。另外,指令包本身可以擴(kuò)展成256位或某一其它位數(shù),以包含性能指示符的額外信息。
接下來(lái)參照?qǐng)D6A和6B,示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的包含性能指示符的子例程和包含性能指示符的數(shù)據(jù)的圖。在本例中,圖6A中的子例程600包括多條指令,其中指令602、604和606與性能指示符相關(guān)聯(lián)。這些指令也稱作被標(biāo)記指令。當(dāng)執(zhí)行這些指令時(shí),對(duì)與這些指令相關(guān)聯(lián)的事件進(jìn)行計(jì)數(shù),從而為軟件工具獲得數(shù)據(jù)以分析執(zhí)行子例程600的數(shù)據(jù)處理系統(tǒng)的性能。
數(shù)據(jù)或包含數(shù)據(jù)的存儲(chǔ)單元可以采用類似方式以指示符標(biāo)記。在這些例子中,這些指示符用于對(duì)數(shù)據(jù)或存儲(chǔ)單元訪問(wèn)進(jìn)行計(jì)數(shù)。在圖6B中,數(shù)據(jù)610包括與性能指示符相關(guān)聯(lián)的數(shù)據(jù)。數(shù)據(jù)612和數(shù)據(jù)614是與性能指示符相關(guān)聯(lián)的數(shù)據(jù)610的部分。與性能指示符相關(guān)聯(lián)的這些數(shù)據(jù)部分也稱作被標(biāo)記數(shù)據(jù)。
現(xiàn)在參照?qǐng)D7,其示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于處理包含性能指示符的指令的過(guò)程的流程圖。圖7所示的過(guò)程可以在指令高速緩存如圖2中的指令高速緩存214中實(shí)現(xiàn)。
該過(guò)程以接收指令包(步驟700)開(kāi)始。在這些例子中,每個(gè)指令包具有類似于圖5中的指令包500的格式。識(shí)別指令包中的指令(步驟702)。判定是否存在與指令相關(guān)聯(lián)的性能指示符(步驟704)。該判定可以通過(guò)檢查指令或指令包中的適當(dāng)字段來(lái)進(jìn)行?;蛘?,可以檢查性能檢測(cè)映像高速緩存如圖4中的性能檢測(cè)映像高速緩存404,以查看性能指示符是否與指令相關(guān)聯(lián)。
如果存在性能指示符,則發(fā)送信號(hào)到性能監(jiān)測(cè)器單元(步驟706)。當(dāng)接收到該信號(hào)時(shí),性能監(jiān)測(cè)器單元將對(duì)與指令執(zhí)行相關(guān)聯(lián)的事件進(jìn)行計(jì)數(shù)。另外,對(duì)指令進(jìn)行處理(步驟708)。指令處理包括例如將指令發(fā)送到適當(dāng)?shù)墓δ軉卧员銏?zhí)行。
然后,判定在指令包中是否存在另外的未處理指令(步驟710)。如果在指令包中存在另外的未處理指令,則該過(guò)程返回到如上所述的步驟702。否則,該過(guò)程終止?;氐讲襟E704,如果不存在性能指示符,則該過(guò)程直接進(jìn)入步驟708。
現(xiàn)在參照?qǐng)D8,其示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于選擇性地發(fā)送信號(hào)到中斷單元的過(guò)程的流程圖。圖8所示的過(guò)程可以在指令高速緩存如圖2的指令高速緩存242中實(shí)現(xiàn)。在使用性能監(jiān)測(cè)器單元監(jiān)測(cè)事件可能錯(cuò)過(guò)特定事件的情況下采用該過(guò)程。例如,性能監(jiān)測(cè)器單元對(duì)事件進(jìn)行計(jì)數(shù)。當(dāng)發(fā)生高速緩存失敗時(shí),發(fā)送信號(hào)到性能監(jiān)測(cè)器單元。當(dāng)將對(duì)應(yīng)高速緩存線的元數(shù)據(jù)裝入到高速緩存中時(shí),也引發(fā)(raise)一個(gè)或多個(gè)適當(dāng)信號(hào)。如果元數(shù)據(jù)表示要引發(fā)異常,則發(fā)送信號(hào)到中斷單元,其中該信號(hào)表示要引發(fā)異常。
該過(guò)程以接收指令包(步驟800)開(kāi)始。識(shí)別指令包中的指令(步驟802)。判定是否存在與該指令相關(guān)聯(lián)的性能指示符(步驟804)。發(fā)送到中斷單元以表示要引發(fā)異常的信號(hào)不同于發(fā)送到性能監(jiān)測(cè)器單元的信號(hào)。例如,指令可以與具有導(dǎo)致發(fā)送信號(hào)到中斷單元的第一值的特定性能指示符相關(guān)聯(lián)。性能指示符的第二值可以用來(lái)發(fā)送不同信號(hào)到性能監(jiān)測(cè)器單元。如果存在具有第一值的性能指示符,則發(fā)送信號(hào)到中斷單元(步驟806)。當(dāng)接收到該信號(hào)時(shí),中斷單元發(fā)起適當(dāng)?shù)恼{(diào)用流支持以處理該中斷。調(diào)用流支持可以例如記錄試圖訪問(wèn)高速緩存中的指令或數(shù)據(jù)的功能單元可能發(fā)生的高速緩存失敗。
另外,對(duì)指令進(jìn)行處理(步驟808)。指令的處理包括例如發(fā)送指令到適當(dāng)?shù)墓δ軉卧员銏?zhí)行。
然后,判定指令包中是否存在另外的未處理指令(步驟810)。如果指令包中存在另外的未處理指令,則該過(guò)程返回到如上所述的步驟802。否則,該過(guò)程終止?;氐讲襟E804,如果不存在性能指示符,則該過(guò)程直接進(jìn)入步驟808。
現(xiàn)在參照?qǐng)D9,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于響應(yīng)對(duì)與性能指示符相關(guān)聯(lián)的存儲(chǔ)單元的訪問(wèn)而產(chǎn)生中斷的過(guò)程的流程圖。圖9所示的過(guò)程可以在數(shù)據(jù)高速緩存如圖2的數(shù)據(jù)高速緩存246中實(shí)現(xiàn)。
該過(guò)程以識(shí)別訪問(wèn)存儲(chǔ)單元的請(qǐng)求(步驟900)開(kāi)始。響應(yīng)于識(shí)別出該請(qǐng)求,判定性能指示符是否與存儲(chǔ)單元相關(guān)聯(lián)(步驟902)。如果性能指示符與存儲(chǔ)單元相關(guān)聯(lián),則通過(guò)發(fā)送信號(hào)到中斷單元來(lái)產(chǎn)生中斷(步驟904)。然后,處理對(duì)存儲(chǔ)單元的訪問(wèn)(步驟906),然后該過(guò)程終止。
在圖10中,示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)事件進(jìn)行計(jì)數(shù)的過(guò)程的流程圖。圖10所示的過(guò)程可以在性能監(jiān)測(cè)器單元如圖2的性能監(jiān)測(cè)器單元240中實(shí)現(xiàn)。
該過(guò)程以從指令高速緩存接收表示正在處理帶有性能指示符的指令的信號(hào)(步驟1000)開(kāi)始。下一步,對(duì)與正被處理的指令相關(guān)聯(lián)的事件進(jìn)行計(jì)數(shù)(步驟1002),然后該過(guò)程終止。事件計(jì)數(shù)可以存儲(chǔ)在計(jì)數(shù)器如圖2的計(jì)數(shù)器241中。
接下來(lái)參照?qǐng)D11,其示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)指令進(jìn)行選擇性計(jì)數(shù)的過(guò)程的流程圖。圖11所示的過(guò)程可以在指令高速緩存如圖2的指令高速緩存214中實(shí)現(xiàn)。
該過(guò)程以判定是否接收到與性能指示符相關(guān)聯(lián)的指令(步驟1100)開(kāi)始。在本例中,該指示符導(dǎo)致對(duì)由處理器執(zhí)行的這一指令和所有后續(xù)指令的事件進(jìn)行計(jì)數(shù)?;蛘撸撝甘痉梢允侵甘疽_(kāi)始新計(jì)數(shù)模式的指令本身。如果接收到帶有指示符的指令,則設(shè)置(set)標(biāo)志以開(kāi)始對(duì)指令的事件進(jìn)行計(jì)數(shù)(步驟1102)。該標(biāo)志表示應(yīng)開(kāi)始對(duì)指令的事件進(jìn)行計(jì)數(shù)。
下一步,判定是否接收到帶有指示符的指令(步驟1104)?;蛘?,指示符可以是指示要停止新計(jì)數(shù)模式的指令本身。如果接收到帶有指示符的指令,則清除(unset)該標(biāo)志以停止對(duì)事件的計(jì)數(shù)(步驟1106),然后該過(guò)程終止。
步驟1100和步驟1104中的指示符可以是相同的指示符,其中該指示符切換標(biāo)志的設(shè)置和清除。在另一種實(shí)現(xiàn)中,可以使用兩個(gè)不同的指示符,其中第一指示符僅設(shè)置標(biāo)志。第二指示符用來(lái)清除標(biāo)志??梢酝ㄟ^(guò)在要進(jìn)行計(jì)數(shù)時(shí)采用高信號(hào)而在不再啟動(dòng)計(jì)數(shù)時(shí)采用低信號(hào)來(lái)簡(jiǎn)單地實(shí)現(xiàn)高速緩存單元如指令高速緩存或數(shù)據(jù)高速緩存與性能監(jiān)測(cè)器單元之間為表示計(jì)數(shù)模式而進(jìn)行的通信。
接下來(lái)參照?qǐng)D12,其示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)指令進(jìn)行選擇性計(jì)數(shù)的過(guò)程的流程圖。圖12所示的過(guò)程可以在指令高速緩存如圖2的指令高速緩存214中實(shí)現(xiàn)。
該過(guò)程以檢查標(biāo)志(步驟1200)開(kāi)始。判定是否設(shè)置了標(biāo)志(步驟1202)。如果設(shè)置了標(biāo)志,則發(fā)送信號(hào)到性能監(jiān)測(cè)器單元以啟動(dòng)該單元對(duì)事件進(jìn)行計(jì)數(shù)(步驟1204),然后該過(guò)程終止。否則,發(fā)送信號(hào)到性能監(jiān)測(cè)器單元以禁止對(duì)事件計(jì)數(shù)(步驟1206),然后該過(guò)程終止。
圖11和12所示的過(guò)程在指令與性能指示符相關(guān)聯(lián)之后對(duì)所有指令的事件進(jìn)行計(jì)數(shù)。通過(guò)這種方式,可以使用較少的位來(lái)觸發(fā)對(duì)事件的計(jì)數(shù)。此外,在對(duì)所有指令計(jì)數(shù)的情況下,可以對(duì)與外部子例程調(diào)用相關(guān)聯(lián)的事件進(jìn)行計(jì)數(shù)。
現(xiàn)在參照?qǐng)D13,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于識(shí)別超過(guò)閾值的指令的過(guò)程的流程圖。圖13所示的過(guò)程可以在指令高速緩存如圖2的指令高速緩存214中實(shí)現(xiàn)。
該過(guò)程以接收與性能指示符相關(guān)聯(lián)的指令(步驟1300)開(kāi)始。為指令識(shí)別閾值(步驟1302)。在這些例子中,閾值與完成指令所需的處理器或時(shí)鐘周期的數(shù)量相關(guān)。如果訪問(wèn)高速緩存所需的高速緩存延遲或時(shí)間量超過(guò)該閾值,則對(duì)該事件進(jìn)行計(jì)數(shù)。在這些例子中,閾值設(shè)置在指示符內(nèi)。
例如,可以使用三位來(lái)設(shè)置八個(gè)不同的閾值。例如,“xx1”=10周期,“x1x”=50周期,以及“1xx”=100周期。這三位的某組合可以用來(lái)設(shè)置閾值。根據(jù)具體實(shí)現(xiàn),可以使用更多或更少的位,并且可以將不同值分配給這些位。這些位的含義也可以通過(guò)接口來(lái)控制,例如可以用來(lái)設(shè)置每個(gè)位的含義的一組寄存器。這些寄存器是為此特定目的而添加到處理器架構(gòu)的寄存器。
監(jiān)測(cè)用于執(zhí)行該指令的周期(步驟1304)。判定對(duì)該指令是否超過(guò)了閾值(步驟1306)。如果超過(guò)了閾值,則執(zhí)行選定操作(步驟1308)。該選定操作可以根據(jù)具體實(shí)現(xiàn)而采取不同的形式。例如,每次超過(guò)閾值時(shí),可以遞增計(jì)數(shù)器?;蛘?,可以產(chǎn)生中斷。中斷可以將控制傳遞給另一個(gè)過(guò)程以收集數(shù)據(jù)。例如,該數(shù)據(jù)可以包括調(diào)用堆棧和有關(guān)該調(diào)用堆棧的信息。堆棧是保留存儲(chǔ)器區(qū)域,其中一個(gè)或多個(gè)程序存儲(chǔ)狀態(tài)數(shù)據(jù),如過(guò)程和函數(shù)調(diào)用地址、所傳遞的參數(shù)、性能監(jiān)測(cè)器計(jì)數(shù)器值以及有時(shí)還有局部變量。
判定監(jiān)測(cè)是否結(jié)束(步驟1310)。步驟1310可以一次一條指令地實(shí)現(xiàn)。當(dāng)執(zhí)行了指令或者超過(guò)了閾值時(shí),發(fā)送信號(hào)。在本例中,單條指令的執(zhí)行導(dǎo)致發(fā)送一個(gè)信號(hào)。在可以同時(shí)執(zhí)行多條指令的情況下,可能需要多個(gè)信號(hào)來(lái)表示每條指令的執(zhí)行。在一些實(shí)施例中,可以支持采樣方案,其中一次僅對(duì)一條指令支持閾值。這可以通過(guò)僅支持處理器指令隊(duì)列中的特定位置中的那些指令的閾值來(lái)實(shí)現(xiàn)。在其它實(shí)施例中,如果至少一條被標(biāo)記指令超過(guò)閾值,則可以發(fā)送一個(gè)信號(hào)。對(duì)于超過(guò)閾值的每條指令,為該指令引發(fā)或產(chǎn)生單獨(dú)的信號(hào)。
如果監(jiān)測(cè)結(jié)束,則將所收集的信息發(fā)送到監(jiān)測(cè)程序(步驟1312),然后,該過(guò)程終止。否則,該過(guò)程返回到如上所述的步驟1304。在步驟1306,如果未超過(guò)該指令的閾值,則該過(guò)程直接進(jìn)入步驟1310。
可以在數(shù)據(jù)高速緩存如圖2的數(shù)據(jù)高速緩存216中實(shí)現(xiàn)類似的過(guò)程,以監(jiān)測(cè)對(duì)存儲(chǔ)單元的訪問(wèn)。圖13所示的過(guò)程可以修改成識(shí)別訪問(wèn)存儲(chǔ)單元中的數(shù)據(jù)所需的周期。如同指令執(zhí)行一樣,當(dāng)訪問(wèn)存儲(chǔ)單元中的數(shù)據(jù)所需的時(shí)間量超過(guò)指定閾值時(shí)進(jìn)行計(jì)數(shù)或產(chǎn)生中斷。
如同其它例子一樣,可以作為指令的一部分或者與存儲(chǔ)單元中的數(shù)據(jù)一起包括這些指示符。或者,這些指示符可以與指令或數(shù)據(jù)相關(guān)聯(lián)地在性能檢測(cè)映像高速緩存或存儲(chǔ)器中找到。
參照?qǐng)D14,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于監(jiān)測(cè)對(duì)存儲(chǔ)單元的訪問(wèn)的過(guò)程的流程圖。圖14所示的過(guò)程可以在數(shù)據(jù)高速緩存如圖2的數(shù)據(jù)高速緩存216中實(shí)現(xiàn)。該過(guò)程用來(lái)對(duì)存儲(chǔ)單元中的數(shù)據(jù)訪問(wèn)進(jìn)行計(jì)數(shù)。
該過(guò)程以接收與性能指示符相關(guān)聯(lián)的數(shù)據(jù)(步驟1400)開(kāi)始。判定是否訪問(wèn)了該數(shù)據(jù)的存儲(chǔ)單元(步驟1402)。如果訪問(wèn)了該存儲(chǔ)單元,則遞增計(jì)數(shù)器(步驟1404)。判定監(jiān)測(cè)是否結(jié)束(步驟1406)。如果對(duì)存儲(chǔ)單元的監(jiān)測(cè)結(jié)束,則該過(guò)程終止。否則,該過(guò)程返回到步驟1402。在步驟1402,如果沒(méi)有訪問(wèn)存儲(chǔ)單元,則該過(guò)程進(jìn)入步驟1406。
參照?qǐng)D15,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于生成元數(shù)據(jù)如性能指示符的組件的方框圖。編譯器支持嵌入在指示要生成的元數(shù)據(jù)的源代碼中的命令(directive)。編譯器1500可以生成用于執(zhí)行的指令1502和用于監(jiān)測(cè)的元數(shù)據(jù)。在這些例子中,隨著指令或數(shù)據(jù)高速緩存頁(yè)被裝入到存儲(chǔ)器中,操作系統(tǒng)程序裝入器/鏈接器和/或性能監(jiān)測(cè)程序讀取由編譯器1500生成的元數(shù)據(jù),并且將元數(shù)據(jù)裝入到存儲(chǔ)器如性能監(jiān)測(cè)器部分1506中。該部分本身被標(biāo)記為元數(shù)據(jù)1504。處理器可以接受性能監(jiān)測(cè)器部分1506中具有編譯器所生成部分?jǐn)?shù)據(jù)的格式的元數(shù)據(jù)1504,并且向處理器的內(nèi)部性能檢測(cè)映像高速緩存填充該數(shù)據(jù)。下面參照?qǐng)D17描述面向塊的方案。
在一個(gè)實(shí)施例中,該格式對(duì)于其塊或扇區(qū)(sector)引用中的每一個(gè)都簡(jiǎn)單地具有性能檢測(cè)映像高速緩存條目,并且將元數(shù)據(jù)1504傳送至其對(duì)應(yīng)的一個(gè)或多個(gè)映像條目。代替具有性能檢測(cè)映像高速緩存,可以修改高速緩存本身的內(nèi)部格式來(lái)包含元數(shù)據(jù)1504。在修改指令流本身以包含元數(shù)據(jù)的實(shí)施例中,裝入器更新指令流以包含適當(dāng)?shù)闹甘痉凸ぷ鲄^(qū),或者編譯器1500生成了代碼來(lái)包含元數(shù)據(jù)1504。在任何情況下,在裝入了代碼之后,處理器接收元數(shù)據(jù)1504。
另外,元數(shù)據(jù)1504可以與指令1502相關(guān)聯(lián)地置于性能檢測(cè)映像存儲(chǔ)器1505中。編譯器1500在表或調(diào)試數(shù)據(jù)部分中產(chǎn)生信息。性能監(jiān)測(cè)程序?qū)⒃撔畔⒀b入到性能檢測(cè)映像存儲(chǔ)器1505內(nèi)的映像數(shù)據(jù)區(qū)中?;蛘撸{(diào)試區(qū)可以由一起工作的操作系統(tǒng)和處理器自動(dòng)填充。
然后,可以由處理器1508執(zhí)行指令1502。編譯器1500可以設(shè)置處理器1508中的寄存器如模式寄存器1510。當(dāng)設(shè)置了該寄存器時(shí),處理器1508在執(zhí)行指令1502時(shí)查看性能檢測(cè)映像存儲(chǔ)器1505中的元數(shù)據(jù)1504,以判定元數(shù)據(jù)1504中的性能指示符是否與指令1502中正被執(zhí)行的指令相關(guān)聯(lián)。使用例如上面參照?qǐng)D2-14所述的過(guò)程處理這些性能指示符。如果沒(méi)有設(shè)置模式寄存器1510,則在執(zhí)行指令1502時(shí)忽略元數(shù)據(jù)1504。
可以對(duì)存儲(chǔ)單元1512中的數(shù)據(jù)執(zhí)行類似的過(guò)程。根據(jù)具體實(shí)現(xiàn),元數(shù)據(jù)1504可以置于指令內(nèi)或數(shù)據(jù)內(nèi),而不是置于性能檢測(cè)映像存儲(chǔ)器1505中。然而,通過(guò)將元數(shù)據(jù)1504置于性能檢測(cè)映像存儲(chǔ)器1505中,當(dāng)元數(shù)據(jù)1504置于性能檢測(cè)映像存儲(chǔ)器1505中時(shí)可以動(dòng)態(tài)執(zhí)行元數(shù)據(jù)1504的生成。
該特性允許在不必修改程序的情況下進(jìn)行對(duì)指令的選擇和監(jiān)測(cè)。換句話說(shuō),編譯器1500可以在編譯了指令1502以便由處理器1508執(zhí)行之后生成元數(shù)據(jù)1504。設(shè)置模式寄存器1510使處理器1508在性能檢測(cè)映像存儲(chǔ)器1505中查找元數(shù)據(jù)1504而不必修改指令1502。在這些例子中,元數(shù)據(jù)1504采取告訴處理器1508如何處理指令1502的執(zhí)行和/或?qū)Υ鎯?chǔ)單元1512的數(shù)據(jù)訪問(wèn)的性能指示符的形式。
接下來(lái)參照?qǐng)D16,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的元數(shù)據(jù)的圖。元數(shù)據(jù)1600是圖15中的元數(shù)據(jù)1504的例子。該元數(shù)據(jù)由編譯器如編譯器1500生成。
在本例中,元數(shù)據(jù)1600包括5個(gè)條目,即條目1602、1604、1606、1608和1610,如元數(shù)據(jù)1600中的行1612所示。在本例中,這些條目中的每一個(gè)都包括偏移、長(zhǎng)度和用于描述代碼的檢測(cè)(instrumentation)的標(biāo)志。
條目1602的偏移為0,而其條目長(zhǎng)度為120字節(jié)。標(biāo)志1614表示需要對(duì)由條目長(zhǎng)度1616表示的范圍內(nèi)的所有指令進(jìn)行計(jì)數(shù)。在這些例子中,每條指令的長(zhǎng)度為4字節(jié)。條目1604的條目長(zhǎng)度為4字節(jié),這與指令相對(duì)應(yīng)。標(biāo)志1618表示當(dāng)執(zhí)行該指令時(shí)應(yīng)當(dāng)產(chǎn)生異常。
在條目1606中,以160字節(jié)的偏移開(kāi)始的指令與標(biāo)志1620相關(guān)聯(lián)。該標(biāo)志表示如果超過(guò)閾值即100個(gè)周期則應(yīng)當(dāng)對(duì)指令進(jìn)行計(jì)數(shù)。
條目1608中的標(biāo)志1622表示應(yīng)當(dāng)在偏移為256字節(jié)的指令處開(kāi)始跟蹤。如條目1610中的標(biāo)志1624所指示而停止跟蹤,其中條目1610具有用于偏移為512字節(jié)的指令的標(biāo)志。
這些標(biāo)志用來(lái)生成與這些指令相關(guān)聯(lián)的性能指示符。操作系統(tǒng)將由編譯器生成的該元數(shù)據(jù)傳送到性能檢測(cè)映像存儲(chǔ)器如圖15的性能檢測(cè)映像存儲(chǔ)器1506中,并且處理該元數(shù)據(jù)。或者,根據(jù)具體實(shí)現(xiàn),該元數(shù)據(jù)可以置于指令內(nèi)的字段中。
現(xiàn)在參照?qǐng)D17,示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的在裝入和維護(hù)性能檢測(cè)映像高速緩存時(shí)所涉及的組件的圖。在本例中,現(xiàn)有高速緩存1700包含主段1702。主段1702包括塊1704、1706、1708、1710、1712、1714、1716、1718、1720、1722和1724。轉(zhuǎn)換表1726用來(lái)提供對(duì)主段1702中的塊1704-1724到性能檢測(cè)(perfinst)段1728中的塊的映射。該段中的數(shù)據(jù)置于新性能檢測(cè)映像高速緩存1730中。
在程序編譯的時(shí)候,編譯器生成如前所述的新性能檢測(cè)數(shù)據(jù)部分。在程序裝入時(shí)候,裝入器向處理器查詢以確定高速緩存線大小。裝入器以處理器所要求的格式,為裝入器所裝入的任何文本或數(shù)據(jù)段解析性能檢測(cè)段1728并且構(gòu)造映像段。該映像段置于新性能檢測(cè)映像高速緩存1730中。
映像段中的每一塊包含對(duì)應(yīng)主高速緩存塊中的指令或數(shù)據(jù)的元數(shù)據(jù)。該元數(shù)據(jù)例如包括主段1702的塊內(nèi)每個(gè)帶標(biāo)簽(tagged)項(xiàng)目的標(biāo)志、標(biāo)簽字段、閾值和計(jì)數(shù)字段。該元數(shù)據(jù)還可以包括表示塊中的所有指令或數(shù)據(jù)的標(biāo)志。
裝入器構(gòu)造將主段1702中的每一塊映射到性能檢測(cè)段1728中對(duì)應(yīng)的性能檢測(cè)塊如塊1732、1734、1736、1738、1740、1742、1744、1746、1748、1750和1752的表,即轉(zhuǎn)換表1726。此外,裝入器還向處理器登記該表即轉(zhuǎn)換表1726的頭以及主段1702的位置和大小。
在頁(yè)更替的時(shí)候,頁(yè)面調(diào)度軟件提供新接口來(lái)使性能檢測(cè)段1728與對(duì)應(yīng)主段即主段1702相關(guān)聯(lián)。當(dāng)主段1702頁(yè)面調(diào)入或調(diào)出時(shí),性能檢測(cè)段1728也頁(yè)面調(diào)入或調(diào)出。
在高速緩存線更替的時(shí)候,處理器包含新性能檢測(cè)映像高速緩存1730,其中的高速緩存幀與現(xiàn)有數(shù)據(jù)和指令高速緩存如現(xiàn)有高速緩存1700中的幀直接相關(guān)聯(lián)。當(dāng)處理器的指令或數(shù)據(jù)高速緩存裝入新線時(shí),高速緩存也必須將對(duì)應(yīng)性能檢測(cè)塊裝入到性能檢測(cè)映像高速緩存即新性能檢測(cè)映像高速緩存1730中。處理器(從程序裝入的時(shí)候由裝入器提供的登記數(shù)據(jù))知道處理器正在將塊帶入其具有關(guān)聯(lián)性能檢測(cè)段即性能檢測(cè)段1728的高速緩存。處理器在與該段相關(guān)聯(lián)的轉(zhuǎn)換表1726中查看,得到對(duì)與將要裝入的塊相對(duì)應(yīng)的性能檢測(cè)塊的引用,并且將該性能檢測(cè)塊裝入到新性能檢測(cè)映像高速緩存1730中。在這些例子中,與元數(shù)據(jù)相關(guān)聯(lián)的高速緩存失敗不被周信號(hào)通知,或者以不同于與主高速緩存塊如主段1702中的數(shù)據(jù)相關(guān)聯(lián)的高速緩存失敗的方式進(jìn)行處理。
現(xiàn)在參照?qǐng)D18,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于生成指令的元數(shù)據(jù)的過(guò)程的流程圖。圖18所示的過(guò)程可以由性能監(jiān)測(cè)程序?qū)崿F(xiàn)。
該過(guò)程以識(shí)別要剖析的指令(步驟1800)開(kāi)始。該指令可以是例如已被執(zhí)行多于選定次數(shù)的指令。為所識(shí)別的指令生成元數(shù)據(jù)(步驟1802)。該元數(shù)據(jù)采取性能指示符的形式。性能指示符可以,例如,每當(dāng)執(zhí)行該指令時(shí)遞增計(jì)數(shù)器,在執(zhí)行指令所需的周期數(shù)超過(guò)閾值的情況下遞增計(jì)數(shù)器,在該指令之后對(duì)所有事件、所有指令觸發(fā)對(duì)事件的計(jì)數(shù),或者對(duì)響應(yīng)執(zhí)行指令而發(fā)生的事件進(jìn)行計(jì)數(shù)。在優(yōu)選實(shí)施例中,計(jì)數(shù)器位于關(guān)聯(lián)的性能檢測(cè)映像高速緩存中,并且采取若干位來(lái)允許高速緩存中的數(shù)據(jù)或指令與被保留用于計(jì)數(shù)的位之間的一一對(duì)應(yīng)關(guān)系。
然后,將元數(shù)據(jù)與指令相關(guān)聯(lián)(步驟1804)。接下來(lái),判定是否存在更多指令要處理(步驟1806)。如果存在另外的指令,則該過(guò)程返回到步驟1800。否則,該過(guò)程終止。可以使用類似的過(guò)程來(lái)動(dòng)態(tài)生成存儲(chǔ)單元中的數(shù)據(jù)的元數(shù)據(jù)。
現(xiàn)在參照?qǐng)D19,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于生成存儲(chǔ)單元的元數(shù)據(jù)的過(guò)程的流程圖。圖19所示的過(guò)程可以在編譯器如圖15的編譯器1500中實(shí)現(xiàn)。
該過(guò)程以識(shí)別要剖析的存儲(chǔ)單元(步驟1900)開(kāi)始。通過(guò)探測(cè)對(duì)被標(biāo)記位置的訪問(wèn)而發(fā)生步驟1900。為所識(shí)別的存儲(chǔ)單元生成元數(shù)據(jù)(步驟1902)。該元數(shù)據(jù)采取性能指示符的形式。性能指示符可以,例如,每當(dāng)訪問(wèn)存儲(chǔ)單元時(shí)遞增計(jì)數(shù)器,在訪問(wèn)存儲(chǔ)單元所需的周期數(shù)超過(guò)閾值的情況下遞增計(jì)數(shù)器,或者觸發(fā)對(duì)存儲(chǔ)單元的所有訪問(wèn)的計(jì)數(shù)。然后,將元數(shù)據(jù)與存儲(chǔ)單元相關(guān)聯(lián)(步驟1904)。接下來(lái),判定是否存在更多存儲(chǔ)單元要處理(步驟1906)。如果存在另外的存儲(chǔ)單元,則該過(guò)程返回到步驟1900。否則,該過(guò)程終止。
現(xiàn)在參照?qǐng)D20,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)特定指令的執(zhí)行進(jìn)行計(jì)數(shù)的過(guò)程的流程圖。圖20所示的過(guò)程可以在指令高速緩存如圖2的指令高速緩存214中實(shí)現(xiàn)。
該過(guò)程以執(zhí)行指令(步驟2000)開(kāi)始。判定計(jì)數(shù)器是否與指令相關(guān)聯(lián)(步驟2002)。計(jì)數(shù)器可以包括在指令內(nèi)的字段中,或者可以位于性能檢測(cè)映像存儲(chǔ)器中。如果計(jì)數(shù)器與指令相關(guān)聯(lián),則遞增計(jì)數(shù)器(步驟2004),然后該過(guò)程終止。否則,該過(guò)程終止而不遞增計(jì)數(shù)器。如果計(jì)數(shù)器超過(guò)閾值,則可以將計(jì)數(shù)器清零。
當(dāng)計(jì)數(shù)器作為指令的一部分實(shí)現(xiàn)時(shí),該計(jì)數(shù)器可能為有限大小。在這種情況下,計(jì)數(shù)器的閾值可以設(shè)為表示計(jì)數(shù)器何時(shí)處于上溢的危險(xiǎn)中。然后,在讀到該值之后,則可以將計(jì)數(shù)器清零。該值可以由性能監(jiān)測(cè)器單元或用來(lái)分析數(shù)據(jù)的程序讀取??梢詫?shí)現(xiàn)API來(lái)訪問(wèn)該數(shù)據(jù)。
現(xiàn)在參照?qǐng)D21,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)特定存儲(chǔ)單元的訪問(wèn)進(jìn)行計(jì)數(shù)的過(guò)程的流程圖。圖21所示的過(guò)程可以在數(shù)據(jù)高速緩存如圖2的數(shù)據(jù)高速緩存216和指令高速緩存214中實(shí)現(xiàn)。
該過(guò)程以探測(cè)對(duì)存儲(chǔ)單元的訪問(wèn)(步驟2100)開(kāi)始。判定計(jì)數(shù)器是否與存儲(chǔ)單元相關(guān)聯(lián)(步驟2102)。計(jì)數(shù)器可以包括在存儲(chǔ)單元內(nèi),或者可以位于性能檢測(cè)映像存儲(chǔ)器中。如果計(jì)數(shù)器與存儲(chǔ)單元相關(guān)聯(lián),則遞增計(jì)數(shù)器(步驟2104),然后該過(guò)程終止。否則,該過(guò)程終止而不遞增計(jì)數(shù)器。
接下來(lái)參照?qǐng)D22,其是根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于訪問(wèn)關(guān)于指令執(zhí)行或存儲(chǔ)單元訪問(wèn)而收集的信息的組件的圖。在本例中,指令單元2200執(zhí)行指令2202,并且遞增計(jì)數(shù)器2204。每次執(zhí)行指令2202時(shí),都遞增該計(jì)數(shù)器。在本例中,指令單元2200可以實(shí)現(xiàn)為圖2中的指令高速緩存214。
當(dāng)指令或數(shù)據(jù)高速緩存頁(yè)被裝入到存儲(chǔ)器中時(shí),操作系統(tǒng)程序裝入器/鏈接器和/或性能監(jiān)測(cè)程序讀取由編譯器生成的元數(shù)據(jù),并且確定計(jì)數(shù)與指令或數(shù)據(jù)訪問(wèn)相關(guān)聯(lián),然后裝入過(guò)程分配數(shù)據(jù)區(qū)來(lái)維護(hù)計(jì)數(shù)器作為其性能檢測(cè)段的一部分。計(jì)數(shù)器的大小和數(shù)據(jù)訪問(wèn)的粒度決定所要分配的工作區(qū)的數(shù)量。
在簡(jiǎn)單的情況下,數(shù)據(jù)或指令訪問(wèn)的粒度可以是字大小(從而對(duì)字中的任何字節(jié)的訪問(wèn)都被認(rèn)為是一次訪問(wèn))并且計(jì)數(shù)也可以是字大小。在這種情況下,在主段和性能檢測(cè)段之間存在一對(duì)多映射(不需要全字來(lái)包含計(jì)數(shù)或閾值)。裝入過(guò)程分配一個(gè)或多個(gè)映像頁(yè),并且告訴處理器使用所述一個(gè)或多個(gè)映像頁(yè)來(lái)包含計(jì)數(shù)。該映射的詳細(xì)信息在上面參照?qǐng)D17作過(guò)描述。處理器中的高速緩存單元維護(hù)映像塊條目以指示對(duì)應(yīng)頁(yè)包含計(jì)數(shù)信息??梢蕴峁┎煌成浜筒煌?jí)別的支持。
在另一實(shí)施例中,編譯器分配工作區(qū)來(lái)維護(hù)計(jì)數(shù),并且指示將這些工作區(qū)置于其生成的數(shù)據(jù)區(qū)中。元數(shù)據(jù)中的條目可以表示數(shù)據(jù)的開(kāi)始、數(shù)據(jù)的字節(jié)數(shù)、數(shù)據(jù)的粒度、計(jì)數(shù)區(qū)的開(kāi)始和每個(gè)計(jì)數(shù)單元的粒度。在任何情況下,將元數(shù)據(jù)裝入到處理器中,并且處理器向其內(nèi)部(映像)高速緩存填充元數(shù)據(jù)。在修改指令流本身來(lái)包含元數(shù)據(jù)的示例性實(shí)施例中,裝入器更新指令流以包含適當(dāng)?shù)闹甘痉凸ぷ鲄^(qū),或者編譯器生成了代碼來(lái)包含元數(shù)據(jù)。在任一種情況下,在裝入了代碼之后,處理器接收元數(shù)據(jù)。
數(shù)據(jù)單元2206可以作為圖2中的數(shù)據(jù)高速緩存206實(shí)現(xiàn)。在本例中,每當(dāng)訪問(wèn)數(shù)據(jù)2208時(shí),都遞增計(jì)數(shù)器2210。數(shù)據(jù)2208和計(jì)數(shù)器2210均處于特定存儲(chǔ)單元中。在這些例子中,可以采用新指令,其中,該指令稱作ReadDataAccessCount(RDAC),其獲得(take)數(shù)據(jù)地址和寄存器,并且將與該數(shù)據(jù)地址相關(guān)聯(lián)的計(jì)數(shù)置于該寄存器中。
指令執(zhí)行和數(shù)據(jù)訪問(wèn)這些事件中的每一個(gè)都導(dǎo)致計(jì)數(shù)器的遞增。本發(fā)明的機(jī)制提供一個(gè)接口即硬件接口2212來(lái)訪問(wèn)所收集的這一數(shù)據(jù)。在這些例子中,硬件接口2212采取用于操作系統(tǒng)2214的應(yīng)用程序編程接口(API)的形式。這樣,分析工具2216可以從計(jì)數(shù)器2204和計(jì)數(shù)器2210獲得數(shù)據(jù)。分析工具2216可以采取多種形式,例如Oprofile,其是Linux系統(tǒng)的公知的全系統(tǒng)剖析器。雖然圖22中的例子示出向指令單元和數(shù)據(jù)單元提供接口,但是也可以實(shí)現(xiàn)硬件接口2212來(lái)提供對(duì)來(lái)自處理器中的其它單元的信息的訪問(wèn)。例如,可以為允許訪問(wèn)位于性能監(jiān)測(cè)器單元的計(jì)數(shù)器如圖2的性能監(jiān)測(cè)器單元240的計(jì)數(shù)器241和242中的信息的硬件接口2212創(chuàng)建API。
在圖23中,示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于自主修改程序代碼以允許對(duì)代碼部分進(jìn)行選擇性計(jì)數(shù)或剖析中的組件的方框圖。在本例中,剖析器2300是可以用來(lái)識(shí)別程序如程序2302中具有高使用率的例程的程序,如tprof。在這些例子中,“tprof”是定時(shí)器剖析器,其捆綁(ship)在來(lái)自國(guó)際商業(yè)機(jī)器(IBM)公司的高級(jí)交互性執(zhí)行體(AIX)操作系統(tǒng)上。該程序采集由定時(shí)器發(fā)起的樣本。當(dāng)定時(shí)器結(jié)束時(shí),tprof識(shí)別所執(zhí)行的指令。tprof是可以用于系統(tǒng)性能分析的CPU剖析工具。該工具是分析工具的例子,并且基于包括以下步驟的采樣技術(shù)通過(guò)時(shí)間或性能監(jiān)測(cè)器計(jì)數(shù)器周期性地中斷系統(tǒng);隨同進(jìn)程id(pid)和線程id(tid)一起確定被中斷代碼的地址;記錄軟件跟蹤緩沖器中的TPROF掛鉤(hook);并且返回到被中斷代碼。
或者,可以使用性能監(jiān)測(cè)器計(jì)數(shù)器的固定數(shù)目的計(jì)數(shù)來(lái)代替定時(shí)器。該程序剖析用來(lái)指示在程序內(nèi)何處花費(fèi)了時(shí)間的子例程。使用率超過(guò)特定閾值的程序也稱作“熱點(diǎn)(hot)”。通過(guò)使用來(lái)自剖析器2300的信息,可以識(shí)別感興趣的例程如程序2302中的子例程2304。
采用該信息,可以由分析工具2306自主修改子例程2304中的指令,以允許對(duì)子例程2304的執(zhí)行進(jìn)行計(jì)數(shù)。可以識(shí)別另外的例程以由分析工具2306進(jìn)行修改。例如,還可以識(shí)別子例程2304為感興趣的例程,并修改該例程的指令以允許對(duì)子例程2304的執(zhí)行進(jìn)行計(jì)數(shù)。對(duì)這些例程中的代碼的修改包括將性能指示符與這些子例程中每一個(gè)內(nèi)的一條或多條指令相關(guān)聯(lián)。
在由分析工具2306修改了這些例程中的指令之后,由處理器2308執(zhí)行程序2302。處理器2308執(zhí)行程序2302并且為這些例程提供計(jì)數(shù)。例如,對(duì)所執(zhí)行的指令和執(zhí)行例程時(shí)所用周期數(shù)的計(jì)數(shù)可以使用上述機(jī)制由處理器2308執(zhí)行。
參照?qǐng)D24,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于動(dòng)態(tài)地將性能指示符添加到指令或使其與指令關(guān)聯(lián)的過(guò)程的流程圖。圖24所示的過(guò)程可以在諸如圖23的分析工具2306的程序中實(shí)現(xiàn)。分析工具是用來(lái)獲得有關(guān)程序執(zhí)行的規(guī)格的程序。這些規(guī)格可以是任何可測(cè)量參數(shù),如執(zhí)行時(shí)間、所執(zhí)行的例程、所執(zhí)行的特定指令和所訪問(wèn)的存儲(chǔ)單元。
該過(guò)程以使用來(lái)自剖析器的數(shù)據(jù)識(shí)別感興趣的指令(步驟2400)開(kāi)始。該剖析器可以例如是AIX中見(jiàn)到的定時(shí)器剖析器。從識(shí)別出的指令中選擇一條指令以作修改(步驟2402)。然后,將性能指示符動(dòng)態(tài)添加到所選指令(步驟2404)。
在步驟2404,可以以無(wú)需為執(zhí)行而修改指令的方式添加指令??梢圆捎眯阅軝z測(cè)映像存儲(chǔ)器如圖15中的性能檢測(cè)映像存儲(chǔ)器1506來(lái)保存性能指示符。在這種情形下,設(shè)置處理器中的寄存器以指示當(dāng)執(zhí)行指令時(shí)應(yīng)檢查性能檢測(cè)映像存儲(chǔ)器以獲得性能指示符。
然后,判定是否存在另外的所識(shí)別指令要修改(步驟2406)。如果存在另外的指令要修改,則該過(guò)程返回到步驟2402。否則,該過(guò)程終止。
接下來(lái)參照?qǐng)D25,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用來(lái)通過(guò)將性能指示符與頁(yè)內(nèi)的指令相關(guān)聯(lián)而掃描頁(yè)的組件的圖。本發(fā)明的機(jī)制使用性能指示符來(lái)允許每次一頁(yè)地檢測(cè)(instrument)或修改程序中的指令。
在本例中,程序2500包含三頁(yè),即頁(yè)2502、頁(yè)2504和頁(yè)2506。掃描守護(hù)進(jìn)程(daemon)2508每次一頁(yè)或多頁(yè)地將性能指示符與程序2500中的指令相關(guān)聯(lián)。例如,頁(yè)2502中的指令可以通過(guò)掃描守護(hù)進(jìn)程2508與性能指示符相關(guān)聯(lián)。然后,由處理器2510執(zhí)行程序2500。然后可以收集來(lái)自對(duì)程序2500的執(zhí)行的數(shù)據(jù)。該數(shù)據(jù)包括例如對(duì)響應(yīng)頁(yè)2502中的指令而發(fā)生的事件的計(jì)數(shù),從而對(duì)執(zhí)行頁(yè)2502中的每條指令的次數(shù)進(jìn)行計(jì)數(shù)和/或識(shí)別對(duì)頁(yè)2502的訪問(wèn)次數(shù)。
下一步,掃描守護(hù)進(jìn)程可以從頁(yè)2502內(nèi)的指令中去除性能指示符,并且將性能指示符與頁(yè)2504中的指令相關(guān)聯(lián)。然后,由處理器2510再次執(zhí)行程序2500,并且收集來(lái)自對(duì)該程序的執(zhí)行的數(shù)據(jù)。然后,可以在所執(zhí)行的程序2500中修改頁(yè)2506中的指令以收集有關(guān)該頁(yè)的數(shù)據(jù)。
以這種方式,可以識(shí)別諸如定時(shí)器剖析器的程序通常不記錄的對(duì)例程的使用。由于中斷可能被禁止,或者樣本的定時(shí)可能產(chǎn)生同步非隨機(jī)行為,所以定時(shí)器剖析器可能不記錄對(duì)例程的某些使用。通過(guò)修改程序2500中的指令,可以獲得對(duì)例程或其它模塊的計(jì)數(shù),其中,計(jì)數(shù)是無(wú)偏的,并且系統(tǒng)是不受干擾的。以這種方式,避免了中斷驅(qū)動(dòng)的計(jì)數(shù)。此外,雖然對(duì)代碼的檢測(cè)是每次一頁(yè)的,但是在掃描程序時(shí)也可以使用指令的其它編組,例如形成程序的模塊。例如,編組可以是單個(gè)可執(zhí)行程序、庫(kù)、一組選定函數(shù)和一組選定頁(yè)。
接下來(lái)參照?qǐng)D26,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于將指示符添加到頁(yè)內(nèi)指令的過(guò)程的流程圖。圖26所示的過(guò)程可以在諸如圖25的掃描守護(hù)進(jìn)程2508的程序中實(shí)現(xiàn)。
首先,識(shí)別頁(yè)的選擇范圍(selection)(步驟2600)。在本例中,這些頁(yè)是程序中所要掃描或檢測(cè)的那些頁(yè)。接下來(lái),選擇頁(yè)的選擇范圍中的一頁(yè)以作修改(步驟2602)。然后,使指示符與選定頁(yè)內(nèi)的所有指令相關(guān)聯(lián)(步驟2604)。然后執(zhí)行程序(步驟2606)。接下來(lái),判定是否掃描了選擇范圍內(nèi)的所有頁(yè)(步驟2608)。如果掃描了所有頁(yè),則該過(guò)程隨后終止。然而,如果并非所有的頁(yè)都已被掃描,則選擇所要掃描的下一頁(yè)(步驟2610),而該過(guò)程返回到如上所述的步驟2604。
圖26所示的過(guò)程示出所掃描的作為頁(yè)的指令編組。根據(jù)具體實(shí)現(xiàn),可以以這種方式掃描或檢測(cè)其它類型的指令分組,例如形成程序的模塊。
采用程序來(lái)根據(jù)調(diào)用堆棧中找到的信息從例程中識(shí)別調(diào)用者。該程序通過(guò)識(shí)別已進(jìn)行的函數(shù)調(diào)用,允許識(shí)別例程中發(fā)生了什么,并且提供對(duì)程序中發(fā)生了什么的總結(jié)。然而,該程序需要將指令插入代碼中以獲得這一信息。
本發(fā)明的機(jī)制允許識(shí)別調(diào)用和返回,而不必執(zhí)行特別的代碼檢測(cè)。具體地說(shuō),可以使用對(duì)特定指令集產(chǎn)生中斷的函數(shù)來(lái)收集有關(guān)系統(tǒng)和應(yīng)用程序的信息。在這些例子中,調(diào)用和返回的指令與產(chǎn)生中斷的性能指示符相關(guān)聯(lián)。
通過(guò)向上回巡(walk back)調(diào)用堆棧,可以獲得完整的調(diào)用堆棧以作分析。“堆棧巡視(stack walk)”也可以描述為“堆棧展開(kāi)(stack unwind)”,而“巡視堆?!钡倪^(guò)程也可以描述為“展開(kāi)堆?!?。這些術(shù)語(yǔ)中的每一個(gè)闡明了對(duì)該過(guò)程的不同比喻。當(dāng)該過(guò)程必須逐步或逐幀地獲得和處理堆棧幀時(shí),該過(guò)程可以描述為“巡視”。當(dāng)該過(guò)程必須獲得和處理指向彼此的堆棧幀時(shí),該過(guò)程也可以描述為“展開(kāi)”,而這些指針及其信息必須通過(guò)很多指針解除參考(dereference)來(lái)“展開(kāi)”。
堆棧展開(kāi)遵循中斷時(shí)的函數(shù)/方法調(diào)用順序,并且響應(yīng)與性能指示符相關(guān)聯(lián)的指令的執(zhí)行而生成。調(diào)用堆棧是例程加上在程序執(zhí)行期間進(jìn)入的例程(即模塊、函數(shù)、方法等)內(nèi)偏移的有序列表。例如,如果例程A調(diào)用例程B,然后例程B調(diào)用例程C,而處理器正在執(zhí)行例程C中的指令,則調(diào)用堆棧為ABC。當(dāng)把控制從例程C返回到例程B時(shí),調(diào)用堆棧為AB。為了在所生成的報(bào)告內(nèi)表達(dá)更簡(jiǎn)潔和易于解釋起見(jiàn),提供例程的名稱而沒(méi)有任何偏移信息。偏移可以用于對(duì)程序執(zhí)行更詳細(xì)的分析,然而,這里不進(jìn)一步考慮偏移。
因此,在通過(guò)執(zhí)行與特定性能指示符關(guān)聯(lián)的指令而發(fā)起的中斷處理期間或后處理時(shí),所生成的基于樣本的剖析信息反映調(diào)用堆棧的采樣,而不是如同某些程序計(jì)數(shù)器采樣技術(shù)中一樣僅僅為可能調(diào)用堆棧的葉子(leaf)。葉子是分枝末端的節(jié)點(diǎn),即沒(méi)有子代的節(jié)點(diǎn)。子代是父節(jié)點(diǎn)之子,而葉子是無(wú)子節(jié)點(diǎn)。
現(xiàn)在參照?qǐng)D27,其是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的包含多個(gè)堆棧幀的調(diào)用堆棧的圖?!岸褩!笔潜A舸鎯?chǔ)器區(qū)域,其中一個(gè)或多個(gè)程序存儲(chǔ)狀態(tài)數(shù)據(jù),如過(guò)程和函數(shù)調(diào)用地址、所傳遞參數(shù),并且有時(shí)還有局部變量?!岸褩笔蔷€程堆棧的一部分,其表示單個(gè)函數(shù)調(diào)用的局部存儲(chǔ)(參數(shù)、返回地址、返回值和局部變量)。每一個(gè)活動(dòng)的執(zhí)行線程具有為其堆??臻g分配的一部分系統(tǒng)存儲(chǔ)器。線程堆棧由堆棧幀序列組成。線程堆棧上的幀集在任何時(shí)候都表示該線程的執(zhí)行狀態(tài)。由于堆棧幀典型地是相互鏈接的(例如,每個(gè)堆棧幀指向前一堆棧幀),因此經(jīng)常有可能向上往回跟蹤堆棧幀序列,并且形成“調(diào)用堆?!?。調(diào)用堆棧表示所有尚未完成的函數(shù)調(diào)用——換句話說(shuō),它反映任何時(shí)間點(diǎn)的函數(shù)調(diào)用序列。
調(diào)用堆棧2700包括標(biāo)識(shí)正在運(yùn)行的例程、調(diào)用其的例程等等一直到主程序的信息。調(diào)用堆棧2700包括多個(gè)堆棧幀2702、2704、2706和2708。在所示例子中,堆棧幀2702位于調(diào)用堆棧2700的頂部,而堆棧幀2708位于調(diào)用堆棧2700的底部。調(diào)用堆棧的頂部也稱作“根”。修改(大多數(shù)操作系統(tǒng)中所見(jiàn))的中斷,以獲得被中斷線程的程序計(jì)數(shù)器值(pcv)以及指向該線程的當(dāng)前活動(dòng)堆棧幀的指針。在英特爾架構(gòu)中,這典型地由寄存器EIP(程序計(jì)數(shù)器)和EBP(指向堆棧幀的指針)的內(nèi)容表示。
通過(guò)訪問(wèn)當(dāng)前活動(dòng)的堆棧幀,有可能利用(典型的)堆棧幀鏈接約定,以便將所有幀鏈在一起。標(biāo)準(zhǔn)鏈接約定的一部分還規(guī)定函數(shù)返回地址正好放在被調(diào)用函數(shù)的堆棧幀之上;這可以用來(lái)確定被調(diào)用函數(shù)的地址。雖然本討論采用基于英特爾的架構(gòu),但是本例不是限制。大多數(shù)架構(gòu)采用可以類似地由修改的剖析中斷處理程序?qū)Ш降逆溄蛹s定。
當(dāng)發(fā)生中斷時(shí),所獲取的第一參數(shù)是程序計(jì)數(shù)器值。下一個(gè)值是指向被中斷線程的當(dāng)前堆棧幀的頂部的指針。在所示例子中,該值將指向堆棧幀2708中的EBP2708a。EBP2708又指向堆棧幀2706中的EBP2706a,而EBP2706a又指向堆棧幀2704中的EBP2704a。該EBP又指向堆棧幀2702中的EBP2702a。標(biāo)識(shí)調(diào)用例程的返回地址的EIP2702b-2708b位于堆棧幀2702-2708內(nèi)??梢愿鶕?jù)這些地址來(lái)識(shí)別這些例程。因此,通過(guò)向上或向后巡視堆棧而收集所有返回地址來(lái)定義例程。
在某些情況下獲得完整的調(diào)用堆??赡苁抢щy的,因?yàn)槔绠?dāng)具有一個(gè)調(diào)用堆棧的應(yīng)用程序?qū)哂胁煌{(diào)用堆棧的內(nèi)核進(jìn)行調(diào)用時(shí),環(huán)境可能使跟蹤困難。由本發(fā)明的機(jī)制提供的硬件支持避免了這些問(wèn)題中的某些問(wèn)題。
接下來(lái)參照?qǐng)D28,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于識(shí)別與調(diào)用和返回指令相關(guān)聯(lián)的事件的過(guò)程的流程圖,其中從性能監(jiān)測(cè)器單元收集數(shù)據(jù)。圖28所示的過(guò)程也可以在分析工具如圖22的分析工具2216中實(shí)現(xiàn)。
該過(guò)程以識(shí)別調(diào)用和返回指令(步驟2800)開(kāi)始。調(diào)用和返回指令是用于確定何時(shí)調(diào)用了例程和何時(shí)例程完成的感興趣的指令。這可以為中斷、中斷返回、系統(tǒng)調(diào)用和從系統(tǒng)調(diào)用返回而實(shí)現(xiàn)。
接下來(lái),使性能指示符與所識(shí)別的調(diào)用和返回指令相關(guān)聯(lián)(步驟2802)。然后執(zhí)行程序(步驟2804),并且從性能監(jiān)測(cè)器單元收集數(shù)據(jù)(步驟2806),然后該過(guò)程終止。該信息可以通過(guò)接口如圖22所示的硬件接口2212來(lái)收集,其中,采用API來(lái)獲得由處理器中的不同功能單元收集的數(shù)據(jù)。
利用該數(shù)據(jù),可以識(shí)別例程的調(diào)用者。該信息可以用來(lái)產(chǎn)生諸如樹(shù)的數(shù)據(jù)結(jié)構(gòu)來(lái)跟蹤和呈現(xiàn)有關(guān)程序執(zhí)行的信息。數(shù)據(jù)結(jié)構(gòu)的這一生成可以使用類似于在分析工具中提供的過(guò)程來(lái)實(shí)現(xiàn)。
接下來(lái)參照?qǐng)D29,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于識(shí)別已被執(zhí)行多于選定次數(shù)的例程的過(guò)程的流程圖。圖29所示的過(guò)程可以在處理器內(nèi)的功能單元如圖2的指令高速緩存214中實(shí)現(xiàn)。該過(guò)程用來(lái)識(shí)別對(duì)被執(zhí)行指令的計(jì)數(shù),并且當(dāng)這些指令出現(xiàn)次數(shù)多于某選定次數(shù)時(shí)產(chǎn)生中斷。
首先,判定是否探測(cè)到對(duì)選定指令的執(zhí)行(步驟2900)。通過(guò)檢查每條被執(zhí)行的指令來(lái)判定,以查看性能指示符是否與該指令相關(guān)聯(lián)。這些性能指示符可以通過(guò)不同工具如圖15中的編譯器1500或圖22中的分析工具2216與該指令相關(guān)聯(lián)。
如果沒(méi)有識(shí)別出對(duì)包含性能指示符的指令的執(zhí)行,則該過(guò)程返回到步驟2900,直到探測(cè)出選定指令。如果選定指令被識(shí)別為正在執(zhí)行,則為該選定指令遞增具有設(shè)定閾值的計(jì)數(shù)器,以對(duì)執(zhí)行該特定指令的頻度計(jì)數(shù)(步驟2902)。在這些例子中,為被標(biāo)識(shí)以進(jìn)行監(jiān)測(cè)的每條指令分配計(jì)數(shù)器。
接下來(lái),判定是否達(dá)到設(shè)定閾值(步驟2904)。對(duì)于每一個(gè)高速緩存級(jí),起初通過(guò)使用文檔化高速緩存失敗次數(shù)來(lái)確定閾值。然而,增加次數(shù)用來(lái)確定因高速緩存干擾(來(lái)自其它處理器的訪問(wèn))引起的問(wèn)題??梢砸圆煌抵貜?fù)運(yùn)行,以識(shí)別具有最差性能的區(qū)域。
在這些例子中,指令可以與包括要監(jiān)測(cè)對(duì)指令的執(zhí)行并提供計(jì)數(shù)器的指示的指示符相關(guān)聯(lián)。此外,可以包括計(jì)數(shù)標(biāo)準(zhǔn)來(lái)識(shí)別何時(shí)要產(chǎn)生中斷。例如,當(dāng)指令被執(zhí)行多于十三次時(shí),可以產(chǎn)生中斷。
如果尚未達(dá)到閾值,則該過(guò)程返回到如上所述的步驟2900。如果達(dá)到了設(shè)定閾值,則將中斷發(fā)送到監(jiān)測(cè)程序(步驟2906),然后該過(guò)程終止。該中斷可以被發(fā)送到中斷單元如圖2中的中斷單元250,這將控制傳到適當(dāng)?shù)某绦蚧蜻M(jìn)程以處理中斷。
該過(guò)程可能對(duì)具有很多轉(zhuǎn)移的例程尤其有用。在這種情況下,將標(biāo)志所有轉(zhuǎn)移指令以進(jìn)行計(jì)數(shù)。通過(guò)這種計(jì)數(shù)而獲得的信息可能對(duì)通過(guò)使轉(zhuǎn)移最少化或調(diào)整所用處理器的指令架構(gòu)中支持的提示(hint)標(biāo)志來(lái)識(shí)別對(duì)編譯器和運(yùn)行時(shí)編譯執(zhí)行的(JIT,just-in-time)代碼生成的改進(jìn)有用。
接下來(lái)參照?qǐng)D30,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于當(dāng)特定指令被執(zhí)行的次數(shù)多于某選定次數(shù)時(shí)檢查調(diào)用堆棧并識(shí)別例程的調(diào)用者的過(guò)程的流程圖。圖7所示的過(guò)程可以由中斷單元如圖2中的中斷單元250發(fā)起。該過(guò)程用來(lái)識(shí)別例程中的調(diào)用,并且可以用來(lái)遞歸獲得調(diào)用者的信息。
首先,檢查調(diào)用堆棧,并且識(shí)別例程的調(diào)用者(步驟3000)。接下來(lái),從指令高速緩存捕獲對(duì)被執(zhí)行指令的計(jì)數(shù)(步驟3002)。該計(jì)數(shù)是針對(duì)圖29的步驟2902中所用的計(jì)數(shù)器的。然后將計(jì)數(shù)器清零(步驟3004),隨后從中斷返回控制(步驟3006)。可以使用在圖30的過(guò)程中獲得的信息來(lái)識(shí)別另外的要監(jiān)測(cè)的例程以遞歸識(shí)別例程的調(diào)用者。
接下來(lái)參照?qǐng)D31,其是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的為進(jìn)行監(jiān)測(cè)而選擇的指令和數(shù)據(jù)的范圍的圖。在本例中,程序3100包括指令范圍3102和3104。這些范圍中的每一個(gè)均被識(shí)別為所要監(jiān)測(cè)的感興趣范圍。這些范圍中的每一個(gè)均設(shè)在諸如圖2的指令高速緩存214的指令單元內(nèi)。每個(gè)范圍都用來(lái)在程序3100的執(zhí)行期間告訴處理器在一范圍內(nèi)執(zhí)行的指令數(shù)以及進(jìn)入一范圍的次數(shù)。此外,可以使用范圍寄存器3108來(lái)判定是否識(shí)別了要執(zhí)行的選定類型的指令。
使用來(lái)自范圍寄存器3108的附加或不同機(jī)制來(lái)識(shí)別一種或多種指令類型。一種機(jī)制涉及使用具有指令掩碼的指令匹配寄存器(IMR)。該掩碼用來(lái)識(shí)別指令中必須匹配特定值的位,或者用來(lái)識(shí)別其值無(wú)關(guān)緊要的位。這些位也稱作無(wú)關(guān)位。另一種方案使用操作碼或指令類型列表。在該實(shí)現(xiàn)中,指示符可以用來(lái)識(shí)別哪些指令要結(jié)合范圍寄存器3108使用。
指令高速緩存3106使用范圍寄存器3108來(lái)定義指令范圍。這些寄存器可以是現(xiàn)有寄存器,或者可以修改處理器來(lái)包括定義指令范圍的寄存器。這些范圍可以基于指令地址。另外,范圍寄存器3108可以由各種調(diào)試器程序和性能工具更新。
如果在諸如指令范圍3102或指令范圍3104的范圍內(nèi)執(zhí)行指令,則在指令高速緩存3106中遞增計(jì)數(shù)器。或者,可以發(fā)送信號(hào)到性能監(jiān)測(cè)器單元如圖2中的性能監(jiān)測(cè)器單元240。在這些例子中,性能監(jiān)測(cè)器單元跟蹤對(duì)該范圍內(nèi)執(zhí)行的指令數(shù)和進(jìn)入該指令范圍的次數(shù)的計(jì)數(shù)。此外,識(shí)別由范圍寄存器3108設(shè)置的范圍內(nèi)選定類型的指令可以導(dǎo)致指令高速緩存3106發(fā)送信號(hào)到中斷單元。在本例中,中斷單元執(zhí)行代碼,以執(zhí)行可能涉及對(duì)指令進(jìn)行計(jì)數(shù)、識(shí)別和分析指令的調(diào)用堆?;蛘吒鶕?jù)需要執(zhí)行某種其它分析的過(guò)程。
數(shù)據(jù)訪問(wèn)可以以類似方式監(jiān)測(cè)。例如,數(shù)據(jù)3112包括數(shù)據(jù)范圍3114。可以以與指令范圍3102或指令范圍3104內(nèi)的指令執(zhí)行類似的方式對(duì)數(shù)據(jù)范圍3114的數(shù)據(jù)訪問(wèn)進(jìn)行計(jì)數(shù)。這些范圍可以定義在諸如圖2的數(shù)據(jù)高速緩存216的數(shù)據(jù)單元內(nèi)的寄存器中。這些數(shù)據(jù)范圍可以作為數(shù)據(jù)的存儲(chǔ)單元范圍定義在寄存器中。
接下來(lái)參照?qǐng)D32,其示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于對(duì)設(shè)定范圍的訪問(wèn)次數(shù)以及在設(shè)定范圍內(nèi)執(zhí)行的指令數(shù)進(jìn)行計(jì)數(shù)的過(guò)程的流程圖。圖32所示的過(guò)程可以在諸如圖2的指令高速緩存214的指令單元中實(shí)現(xiàn)。該過(guò)程對(duì)識(shí)別指令地址范圍內(nèi)特定或選定類型的指令的執(zhí)行尤其有用。例如,該過(guò)程可以用于處理在一個(gè)指令范圍內(nèi)發(fā)生的轉(zhuǎn)移指令的執(zhí)行。
首先,識(shí)別所要執(zhí)行的指令(步驟3200)。接下來(lái),判定指令是否為選定類型(步驟3202)??梢酝ㄟ^(guò)使用指示符或使用與范圍寄存器分開(kāi)的寄存器集中的掩碼集來(lái)識(shí)別指令類型。掩碼或指示符用來(lái)判定指令是否為選定類型。該選定類型可以是例如轉(zhuǎn)移指令。在這些例子中,由于所采取的轉(zhuǎn)移識(shí)別路徑流,因此它們尤其令人感興趣。調(diào)用和返回也可以是被識(shí)別以進(jìn)行處理的指令類型,因?yàn)檫@些類型的指令在識(shí)別函數(shù)和/或子例程方面很有用??梢员蛔R(shí)別為選定類型的指令的其它類型的指令是與存儲(chǔ)器訪問(wèn)相關(guān)的指令,特別是重復(fù)的指令,如串傳送。
然后,判定指令是否在設(shè)定的指令范圍內(nèi)(步驟3204)。該范圍可以通過(guò)檢查定義一個(gè)或多個(gè)指令范圍的寄存器來(lái)識(shí)別。在這些例子中,設(shè)定的指令范圍可以對(duì)應(yīng)于某代碼編組,例如子例程、庫(kù)或軟件模塊。如果指令不在設(shè)定的指令范圍內(nèi),則該過(guò)程返回到如上所述的步驟3200。如果該指令在設(shè)定的指令范圍內(nèi),則發(fā)送信號(hào)到中斷單元(步驟3206)。
在步驟3206,本發(fā)明提供了一種用于處理指令的方法、設(shè)備和計(jì)算機(jī)指令。響應(yīng)數(shù)據(jù)處理系統(tǒng)的處理器內(nèi)的指令高速緩存中接收到要執(zhí)行的指令,判定指示符是否與指令相關(guān)聯(lián),以及指令是否為指令范圍內(nèi)的特定類型。如果指示符與指令相關(guān)聯(lián)并且指令為該指令范圍內(nèi)的特定類型,則產(chǎn)生中斷。
把控制傳到中斷單元,以執(zhí)行用于處理以信號(hào)通知的中斷的代碼。該代碼可以簡(jiǎn)單地對(duì)指令的執(zhí)行進(jìn)行計(jì)數(shù),或者可以獲得和分析指令的調(diào)用堆棧信息。然后,當(dāng)中斷單元完成處理中斷時(shí),處理指令(步驟3208),然后,該過(guò)程返回到如上所述的步驟3200。
回到步驟3204,如果指令不在設(shè)定范圍內(nèi),則該過(guò)程返回到步驟3200。在步驟3202,如果指令不為選定類型,則該過(guò)程也返回到步驟3200。
可以對(duì)數(shù)據(jù)執(zhí)行類似的過(guò)程。在這種實(shí)現(xiàn)中,判定選定類型的數(shù)據(jù),例如對(duì)未對(duì)準(zhǔn)(unaligned)數(shù)據(jù)字的訪問(wèn)。
因此,本發(fā)明提供了一種用于在監(jiān)測(cè)對(duì)程序的執(zhí)行時(shí)提供協(xié)助的改進(jìn)方法、設(shè)備和計(jì)算機(jī)指令。本發(fā)明的機(jī)制包括采用由處理器識(shí)別以啟動(dòng)對(duì)與指示符關(guān)聯(lián)的指令的執(zhí)行進(jìn)行計(jì)數(shù)的指示符。通過(guò)該機(jī)制啟動(dòng)如上所述的各種計(jì)數(shù)。此外,采用通過(guò)利用指示符與特定指令的關(guān)聯(lián)而提供的信息,本發(fā)明的機(jī)制還提供在監(jiān)測(cè)和分析程序性能中對(duì)程序的各種調(diào)整。此外,如上所述,可以自動(dòng)調(diào)整程序,以允許監(jiān)測(cè)選定指令乃至例程和模塊而不必修改程序。
值得注意的是,雖然本發(fā)明是在完全功能數(shù)據(jù)處理系統(tǒng)的上下文中描述的,但是本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解本發(fā)明的過(guò)程能夠以指令的計(jì)算機(jī)可讀介質(zhì)的形式和各種形式來(lái)分發(fā),并且本發(fā)明與實(shí)際上用來(lái)執(zhí)行分發(fā)的信號(hào)承載介質(zhì)的具體類型無(wú)關(guān)地同等適用。計(jì)算機(jī)可讀介質(zhì)的例子包括諸如軟盤、硬盤驅(qū)動(dòng)器、RAM、CD-ROM、DVD-ROM的可記錄型介質(zhì)和諸如數(shù)字和模擬通信鏈路、采用各種傳輸形式例如射頻和光波傳輸?shù)挠芯€或無(wú)線通信鏈路的傳輸型介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以采取為在特定數(shù)據(jù)處理系統(tǒng)中實(shí)際使用而譯碼的編碼格式的形式。
本發(fā)明的描述是為了示例和描述的目的而提供的,不旨在窮舉或者將本發(fā)明限定于所公開(kāi)的形式。對(duì)于本領(lǐng)域的普通技術(shù)人員而言,很多修改和變動(dòng)將是顯然的。例如,代替使用指令中或指令包中的字段,可以使用新指令或操作碼來(lái)指示后續(xù)的指令或后續(xù)的指令集是被標(biāo)記指令。此外,在希望在指令的字段內(nèi)包括性能指示符的情況下,如果用于性能指示符的空閑字段不可用,則可以改變處理器的架構(gòu)來(lái)包括附加位。此外,雖然給出了諸如指令執(zhí)行的事件、執(zhí)行指令所需時(shí)間如時(shí)鐘或處理器周期、訪問(wèn)數(shù)據(jù)及進(jìn)入到代碼部分中的時(shí)間的例子,但是這些例子并不旨在將本發(fā)明限定于可以計(jì)數(shù)的事件的類型??梢允褂帽景l(fā)明的機(jī)制對(duì)任何與對(duì)指令的執(zhí)行或?qū)Υ鎯?chǔ)單元的訪問(wèn)有關(guān)的事件進(jìn)行計(jì)數(shù)。
選擇和描述這些所示實(shí)施例是為了最佳地說(shuō)明本發(fā)明的原理、實(shí)際應(yīng)用,并使得本領(lǐng)域的其他普通技術(shù)人員能夠理解本發(fā)明能有計(jì)劃地以具有各種修改的各種實(shí)施例來(lái)適用于具體應(yīng)用。
權(quán)利要求
1.一種用于處理指令的數(shù)據(jù)處理系統(tǒng)中的方法,該方法包括響應(yīng)處理器的指令高速緩存中接收到要執(zhí)行的指令,判定指示符是否與該指令相關(guān)聯(lián)以及該指令是否為指令范圍內(nèi)的特定類型;以及如果指示符與該指令相關(guān)聯(lián)并且該指令為該指令范圍內(nèi)的特定類型,則產(chǎn)生中斷。
2.如權(quán)利要求1所述的方法,其中所述產(chǎn)生步驟包括從指令高速緩存發(fā)送信號(hào)到處理器中的中斷單元;以及響應(yīng)在中斷單元接收到該信號(hào),在中斷單元中處理中斷。
3.如權(quán)利要求2所述的方法,其中所述處理步驟包括執(zhí)行與該中斷相關(guān)聯(lián)的代碼。
4.如權(quán)利要求3所述的方法,其中所述代碼記錄試圖訪問(wèn)高速緩存中的指令的功能單元的高速緩存失敗。
5.如權(quán)利要求3所述的方法,其中所述代碼對(duì)特定類型的指令已被執(zhí)行的次數(shù)和所述范圍已被訪問(wèn)的次數(shù)進(jìn)行計(jì)數(shù)。
6.如權(quán)利要求1所述的方法,其中指示符位于映像存儲(chǔ)器中。
7.如權(quán)利要求1所述的方法,其中在指令包中接收指令,并且其中指示符包括指令包內(nèi)的字段中的至少一個(gè)空閑位。
8.如權(quán)利要求1所述的方法,其中指示符位于指令內(nèi)的字段中。
9.如權(quán)利要求1所述的方法,其中特定類型的指令為轉(zhuǎn)移指令。
10.如權(quán)利要求1所述的方法,其中所述指令范圍覆蓋子例程、庫(kù)函數(shù)或軟件模塊之一。
11.一種用于處理指令的數(shù)據(jù)處理系統(tǒng),該數(shù)據(jù)處理系統(tǒng)包括判定裝置,用于響應(yīng)處理器的指令高速緩存中接收到要執(zhí)行的指令,判定指示符是否與該指令相關(guān)聯(lián)以及該指令是否為指令范圍內(nèi)的特定類型;以及產(chǎn)生裝置,用于在指示符與該指令相關(guān)聯(lián)并且該指令為該指令范圍內(nèi)的特定類型的情況下,產(chǎn)生中斷。
12.如權(quán)利要求11所述的數(shù)據(jù)處理系統(tǒng),其中所述產(chǎn)生裝置包括發(fā)送裝置,用于從指令高速緩存發(fā)送信號(hào)到處理器中的中斷單元;以及處理裝置,用于響應(yīng)在中斷單元接收到該信號(hào),而在中斷單元中處理中斷。
13.如權(quán)利要求12所述的數(shù)據(jù)處理系統(tǒng),其中所述處理裝置包括執(zhí)行裝置,用于執(zhí)行與該中斷相關(guān)聯(lián)的代碼。
14.如權(quán)利要求13所述的數(shù)據(jù)處理系統(tǒng),其中所述代碼記錄試圖訪問(wèn)高速緩存中的指令的功能單元的高速緩存失敗。
15.如權(quán)利要求13所述的數(shù)據(jù)處理系統(tǒng),其中所述代碼對(duì)特定類型的指令已被執(zhí)行的次數(shù)和所述范圍已被訪問(wèn)的次數(shù)進(jìn)行計(jì)數(shù)。
16.如權(quán)利要求11所述的數(shù)據(jù)處理系統(tǒng),其中指示符位于映像存儲(chǔ)器中。
17.一種計(jì)算機(jī)可讀介質(zhì)中的計(jì)算機(jī)程序產(chǎn)品,用于處理指令,該計(jì)算機(jī)程序產(chǎn)品包括第一指令,用于響應(yīng)處理器的指令高速緩存中接收到要執(zhí)行的指令,判定指示符是否與該指令相關(guān)聯(lián)以及該指令是否為指令范圍內(nèi)的特定類型;以及第二指令,用于在指示符與該指令相關(guān)聯(lián)并且該指令為該指令范圍內(nèi)的特定類型的情況下,產(chǎn)生中斷。
18.如權(quán)利要求17所述的計(jì)算機(jī)程序產(chǎn)品,其中所述第二指令包括第一子指令,用于從指令高速緩存發(fā)送信號(hào)到處理器中的中斷單元;以及第二子指令,用于響應(yīng)在中斷單元接收到該信號(hào),而在中斷單元中處理中斷。
19.如權(quán)利要求18所述的計(jì)算機(jī)程序產(chǎn)品,其中所述第四指令包括用于執(zhí)行與該中斷相關(guān)聯(lián)的代碼的子指令。
20.如權(quán)利要求19所述的計(jì)算機(jī)程序產(chǎn)品,其中所述代碼記錄試圖訪問(wèn)高速緩存中的指令的功能單元的高速緩存失敗。
21.如權(quán)利要求19所述的計(jì)算機(jī)程序產(chǎn)品,其中所述代碼對(duì)特定類型的指令已被執(zhí)行的次數(shù)和所述范圍已被訪問(wèn)的次數(shù)進(jìn)行計(jì)數(shù)。
22.如權(quán)利要求17所述的計(jì)算機(jī)程序產(chǎn)品,其中指示符位于映像存儲(chǔ)器中。
全文摘要
一種用于處理指令的方法、設(shè)備和計(jì)算機(jī)指令。響應(yīng)數(shù)據(jù)處理系統(tǒng)的處理器內(nèi)的指令高速緩存中接收到要執(zhí)行的指令,判定指示符是否與該指令相關(guān)聯(lián)以及該指令是否為指令范圍內(nèi)的特定類型。如果指示符與該指令相關(guān)聯(lián)并且該指令為該指令范圍內(nèi)的特定類型,則產(chǎn)生中斷。
文檔編號(hào)G06F9/318GK1614570SQ20041008267
公開(kāi)日2005年5月11日 申請(qǐng)日期2004年9月27日 優(yōu)先權(quán)日2003年11月6日
發(fā)明者小吉米·E·德威特, 弗蘭克·E·萊文, 克里斯托弗·M·理查森, 羅伯特·J·厄克特 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司