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