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
總結
以上是生活随笔為你收集整理的intel 性能监控计数器PMC寄存器详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VR智慧门店:解决线下实体门店的经营痛点
- 下一篇: html判断国家,对261个国家地区快速