intel 性能監控計數器PMC寄存器詳解

所有內容來自intel官方手冊,章節號已給出。。。


一  以下內容來自(P279):30.1 PERFORMANCE MONITORING OVERVIEW


從Pentium奔騰處理器開始,Intel引入了一組計數寄存器用於做系統性能監視(System Performance monitoring)。針對不同型號的CPU處理器,它們各自擁有的性能計數寄存器是不同的,因此,相對ISA標準的普通寄存器而言,這些寄存器被稱之爲屬於PMU中的MSR寄存器。

註解:
PMU:Performance Monitoring Unit,性能監視單元
MSR:Model-Specific Register

性能計數器允許用戶對選定的處理器參數進行監視和統計,根據這些統計值進行系統調優。從Intel P6開始,性能監視機制得到了進一步的改進和增強,允許用戶選擇更廣泛的事件進行監控。在奔騰4以及至強處理器,又引入了新的性能監視機制和一組新的性能監視事件。

從Intel Core Solo and Intel Core Duo處理器開始,性能監視事件被分爲兩類:
1,non-architectural performance events(後文簡稱爲特定架構事件、特定架構監視事件)
model-specific,即不同型號的處理器各自所擁有的不同事件。

2,architectural performance events(後文簡稱爲架構兼容事件、架構兼容監視事件)
compatible among processor families,即在不同型號的處理器之間是兼容的事件。因爲要提供各個型號處理器之間的兼容,因此這一類事件比較少。




二  以下內容來自(P280):30.2 ARCHITECTURAL PERFORMANCE MONITORING


如果性能監視事件在不同微架構上的性能保存一致,那麼它就是架構兼容事件。架構兼容事件可以在處理器發展過程中逐步增強,也就是可以認爲架構兼容事件具有版本更新的概念,即在新型號的處理器上,提供的架構兼容事件可能要比舊型號的處理器要多,同一個架構兼容事件的功能可能也要更強大。通過CPUID.0AH可以獲取到當前處理器支持的架構兼容事件版本ID。



三 以下內容來自(P281):30.2.1 Architectural Performance Monitoring Version 1


通過兩組寄存器來實現對架構兼容事件的使用,一組爲事件選擇寄存器(IA32_PERFEVTSELx),一組爲計數寄存器(IA32_PMCx),這兩組寄存器是一一對應的,另外,它們的個數也非常有限。

爲了保證這兩組寄存器在各個架構之間兼容,它們有如下一些約定:
1,在各個微架構之間,IA32_PERFEVTSELx的bit位佈局是一致的。
2,在各個微架構之間,IA32_PERFEVTSELx的地址是不變的。
3,在各個微架構之間,IA32_PMCx的地址是不變的。
4,每一個邏輯處理器擁有它自己的IA32_PERFEVTSELx和IA32_PMCx。也就是說,如果某一個處理器核上有兩個邏輯處理器,那麼這兩個邏輯處理器擁有它各自的IA32_PERFEVTSELx和IA32_PMCx。



四 以下內容來自(P282):30.2.1.1 Architectural Performance Monitoring Version 1 Facilities


每一個邏輯處理器擁有的MSR寄存器IA32_PERFEVTSELx和IA32_PMCx對數可以通過CPUID.0AH:EAX[15:8]獲取。這些MSR寄存器有如下一些特點:
1,IA32_PMCx寄存器的起始地址爲0C1H,並且佔據一塊連續的MSR地址空間。
對應到linux-3.7內核代碼爲

1
#define MSR_ARCH_PERFMON_PERFCTR0                 0xc1

2,IA32_PERFEVTSELx寄存器的起始地址爲186H,並且佔據一塊連續的MSR地址空間。從該地址開始的每一個IA32_PERFEVTSELx寄存器與從0C1H開始的IA32_PMCx寄存器一一對應。
對應到linux-3.7內核代碼爲

1
#define MSR_ARCH_PERFMON_EVENTSEL0               0x186

3,通過CPUID.0AH:EAX[23:16]可獲取IA32_PMCx寄存器的bit位寬。

4,在各個微架構之間,IA32_PERFEVTSELx的bit位佈局是一致的。

IA32_PERFEVTSELx寄存器的bit位佈局如下:
0-7:Event select field,事件選擇字段
8-15:Unit mask (UMASK) field,事件檢測掩碼字段
16:USR (user mode) flag,設置僅對用戶模式(privilege levels 1, 2 or 3)進行計數,可以和OS flag一起使用。
17:OS (operating system mode) flag,設置僅對內核模式(privilege levels 0)進行計數,可以和USR flag一起使用。
18:E (edge detect) flag
19:PC (pin control) flag,如果設置爲1,那麼當性能監視事件發生時,邏輯處理器就會增加一個計數並且“toggles the PMi pins”;如果清零,那麼當性能計數溢出時,處理器就會“toggles the PMi pins”。“toggles the PMi pins”不好翻譯,其具體定義爲:“The toggling of a pin is defined as assertion of the pin for a single bus clock followed by deassertion.”,對於此處,我的理解也就是把PMi針腳激活一下,從而觸發一個PMI中斷。
20:INT (APIC interrupt enable) flag,如果設置爲1,當性能計數溢出時,就會通過local APIC來觸發邏輯處理器產生一個異常。
21:保留
22:EN (Enable Counters) Flag,如果設置爲1,性能計數器生效,否則被禁用。
23:INV (invert) flag,控制是否對Counter mask結果進行反轉。
24-31:Counter mask (CMASK) field,如果該字段不爲0,那麼只有在單個時鐘週期內發生的事件數大於等於該值時,對應的計數器才自增1。這就可以用於統計每個時鐘週期內發生多次的事件。如果該字段爲0,那麼計數器就以每時鐘週期按具體發生的事件數進行增長。
32-63:保留

對應到linux-3.7內核代碼的相關爲:

1
2
3
4
5
6
7
8
9
10
11
#define ARCH_PERFMON_EVENTSEL_EVENT         0x000000FFULL
#define ARCH_PERFMON_EVENTSEL_UMASK         0x0000FF00ULL
#define ARCH_PERFMON_EVENTSEL_USR           (1ULL << 16)
#define ARCH_PERFMON_EVENTSEL_OS            (1ULL << 17)
#define ARCH_PERFMON_EVENTSEL_EDGE          (1ULL << 18)
#define ARCH_PERFMON_EVENTSEL_PIN_CONTROL       (1ULL << 19)
#define ARCH_PERFMON_EVENTSEL_INT           (1ULL << 20)
#define ARCH_PERFMON_EVENTSEL_ANY           (1ULL << 21)
#define ARCH_PERFMON_EVENTSEL_ENABLE            (1ULL << 22)
#define ARCH_PERFMON_EVENTSEL_INV           (1ULL << 23)
#define ARCH_PERFMON_EVENTSEL_CMASK         0xFF000000ULL


五 以下內容來自(P284):30.2.2 Additional Architectural Performance Monitoring Extensions

第二個版本的架構兼容監視機制包含如下增強特性:
1,提供有三個固定功能的性能計數器,IA32_FIXED_CTR0、IA32_FIXED_CTR1和IA32_FIXED_CTR2,每一個固定功能性能計數器一次只能統計一個事件。通過寫位於地址38DH的IA32_FIXED_CTR_CTRL寄存器bit位來配置這些固定功能性能計數器,而不再是像通用IA32_PMCx性能計數器那樣,通過對應IA32_PERFEVTSELx寄存器來配置。
對應到linux-3.7內核代碼的相關爲:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
 * All 3 fixed-mode PMCs are configured via this single MSR:
 */
#define MSR_ARCH_PERFMON_FIXED_CTR_CTRL 0x38d
 
/*
 * The counts are available in three separate MSRs:
 */
 
/* Instr_Retired.Any: */
#define MSR_ARCH_PERFMON_FIXED_CTR0 0x309
#define INTEL_PMC_IDX_FIXED_INSTRUCTIONS    (INTEL_PMC_IDX_FIXED + 0)
 
/* CPU_CLK_Unhalted.Core: */
#define MSR_ARCH_PERFMON_FIXED_CTR1 0x30a
#define INTEL_PMC_IDX_FIXED_CPU_CYCLES  (INTEL_PMC_IDX_FIXED + 1)
 
/* CPU_CLK_Unhalted.Ref: */
#define MSR_ARCH_PERFMON_FIXED_CTR2 0x30b
#define INTEL_PMC_IDX_FIXED_REF_CYCLES  (INTEL_PMC_IDX_FIXED + 2)
#define INTEL_PMC_MSK_FIXED_REF_CYCLES  (1ULL << INTEL_PMC_IDX_FIXED_REF_CYCLES)
 
/*
 * We model BTS tracing as another fixed-mode PMC.
 *
 * We choose a value in the middle of the fixed event range, since lower
 * values are used by actual fixed events and higher values are used
 * to indicate other overflow conditions in the PERF_GLOBAL_STATUS msr.
 */
#define INTEL_PMC_IDX_FIXED_BTS             (INTEL_PMC_IDX_FIXED + 16)

2,簡化的事件編程,一般的編程操作也就是啓用事件計數、禁用事件計數、檢測計數溢出,因此提供有三個專門的架構兼容MSR寄存器:
IA32_PERF_GLOBAL_CTRL:允許軟件通過一條WRMSR指令實現對所有或任何組合的IA32_FIXED_CTRx或任意IA32_PMCx進行啓用或禁用事件計數的操作。
IA32_PERF_GLOBAL_STATUS:允許軟件通過一條RDMSR指令實現對任何組合的IA32_FIXED_CTRx或任意IA32_PMCx的溢出狀態的查詢操作。
IA32_PERF_GLOBAL_OVF_CTRL:允許軟件通過一條WRMSR指令實現對任何組合的IA32_FIXED_CTRx或任意IA32_PMCx的溢出狀態的清除操作。

對應到linux-3.7內核代碼的相關爲:

1
2
3
4
5
6
7
8
/* Intel Core-based CPU performance counters */
#define MSR_CORE_PERF_FIXED_CTR0    0x00000309
#define MSR_CORE_PERF_FIXED_CTR1    0x0000030a
#define MSR_CORE_PERF_FIXED_CTR2    0x0000030b
#define MSR_CORE_PERF_FIXED_CTR_CTRL    0x0000038d
#define MSR_CORE_PERF_GLOBAL_STATUS 0x0000038e
#define MSR_CORE_PERF_GLOBAL_CTRL   0x0000038f
#define MSR_CORE_PERF_GLOBAL_OVF_CTRL   0x00000390

參考:
http://blog.csdn.net/gengshenghong/article/details/7383438
http://blog.csdn.net/gengshenghong/article/details/7384862


轉載地址:http://lenky.info/2013/02/23/intel-%e6%80%a7%e8%83%bd%e7%9b%91%e8%a7%86%e5%99%a8/ 或 http://lenky.info/?p=2207





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章