英特爾® Performance Counter Monitor(PCM)--測量 CPU 利用率的更好方法

               

http://software.intel.com/zh-cn/articles/intel-performance-counter-monitor

下載代碼示例
IntelPerformanceCounterMonitorV1.6.zip

過去幾十年內,計算系統的複雜性顯著增加。層次化高速緩存子系統、非一致性內存、同步多線程和亂序執行等技術均爲現代處理器的性能和計算能力帶來了巨大的影響。

Figure%201%20%u201CCPU%20Utilization%u201D%20measures%20only%20the%20time%20a%20thread%20is%20scheduled%20on%20a%20core
圖 1:“CPU 利用率”僅測量了線程在內核上預定的時間


通常,能夠理解並自動適應現代處理器資源利用率的軟件具備出色的性能和功耗優勢。英特爾® Performance Counter Monitor 可提供範例 C++ 例程和實用程序,用於估算最新英特爾® 至強® 和英特爾® 酷睿™ 處理器的內部資源利用率,進而實現大幅度的性能提升。

當 CPU 利用率數據無法體現 CPU 利用率時

從操作系統(OS)獲得的 CPU 利用率數字是一項重要的衡量指標,一直以來被用作多種目的,例如產品尺寸選擇、計算能力規劃和任務調度等。該指標的當前實施(UNIX*“top”實用程序和 Windows* 任務管理器報告的數字)顯示了操作系統中的 CPU 調度程序可分配給運行程序或操作系統執行的時隙比例;剩餘的時間則處於空閒狀態。對於受計算量限制的工作負載,採用上述方法計算的 CPU 利用率指標預測了剩餘的 CPU 計算能力,非常適合性能相較現代系統而言更統一、可預測性更強的八十年代架構。但是,計算架構領域的改進使得該算法不再可靠,因爲當前的計算架構引入了多內核和多 CPU 系統、多層高速緩存、非一致性內存、同步多線程(SMT)、流水線、亂序執行等先進技術。

Diagram%20of%20a%20multi-socket%2C%20multi-core%20system
圖 2:現代化多處理器、多內核系統的複雜性


一個極具代表性的示例是採用英特爾® 超線程技術(英特爾® HT 技術)的處理器上的非線性 CPU 利用率。英特爾® HT 技術是一項卓越的性能特性,能夠將性能提升多至 30%。然而,不瞭解超線程技術的最終用戶很容易會被報告的 CPU 利用率搞得暈頭轉向:假設某款應用在每枚物理內核上運行一條線程。雖然應用會佔用 70%-100% 的執行單元,而報告的 CPU 利用率只有 50%。關於詳細信息請參見注釋 [1]。

另一個不同示例是多核系統上“內存吞吐量”密集型工作負載的 CPU 利用率。帶寬測試“流”已經使內存控制器的容量達到飽和,線程數量要少於內核數量。

性能監視單元(PMU)的抽象層

值得高興的是,英特爾處理器已經集成相關技術,能夠監視處理器內部的性能事件。爲了獲得更精確的 CPU 資源利用率信息,我們將希望寄託於在英特爾處理器內部實施的性能監視單元(PMU)所提供的動態數據。我們特別關注隨當前英特爾® 至強® 5500、5600、7500、E7 和酷睿™ i7 系列處理器提供的高級特性集[2-4]。

我們實施了一系列採用高級接口的基本例程,這些例程可通過用戶的 C++ 應用進行調用,能夠實時提供各種 CPU 性能指標。與其它現有框架如 PAPI* 和 Linux*“perf”不同,我們不僅支持內核 PMU,還支持英特爾處理器(包括最近推出的英特爾® 至強® E7 系列處理器)的非內核。非內核是處理器的一部分,包括集成內存控制器以及到其它處理器和 I/O 中樞的英特爾® 快速通道互聯(QPI)鏈路。總得來說,支持的衡量指標如下:

  • 內核:退回的指令、流逝的內核時鐘計時單元、內核頻率(啓用英特爾® 睿頻加速技術)、二級高速緩存命中和未命中、三級高速緩存未命中和命中(包括或不包括探聽)。
  • 非內核:來自內存控制器的讀取字節、到內存控制器的寫入字節、通過英特爾® 快速通道互聯鏈路傳輸的數據流量。

英特爾® Performance Counter Monitor(PCM)版本1.5(和更高版本)還支持英特爾® 凌動TM 處理器,但內存帶寬、英特爾® QPI 帶寬和三級高速緩存未命中等計數器將持續顯示“0”,因爲英特爾® 凌動TM 處理器沒有三級高速緩存和集成內存控制器或英特爾® QPI 鏈路。

英特爾® PCM 版本 1.6 支持第二代英特爾® 酷睿TM 處理器家族(英特爾® 微架構 Sandy Bridge)的內核性能指標(如每時鐘週期執行的指令數、三級高速緩存未命中次數),此外還嘗試支持部分較早的英特爾® 微架構(如 Penryn):可通過在 cpucounter.cpp 中定義 PCM_TEST_FALLBACK_TO_ATOM 來啓用該支持。

我希望看看這些計數器!

PCM 軟件包屬於額外贈品,其中包括易於使用的命令行和基於這些例程的圖形實用程序。它們支持即購即用,特別適合不能或不想在代碼中集成例程但卻希望能夠實時監視和了解 CPU 計算能力極限的用戶。

圖 3 是 Windows* 平臺上命令行實用程序的截屏。雖然 Linux* 版本能夠依賴隨 Linux 內核提供的 MSR 內核模塊,但 Windows 上沒有此類工具。在 Windows 操作環境中,Windows 驅動程序的範例實施能夠提供相似的界面。

Screenshot%20of%20Intel%20PCM%20command%20line%20tool
圖 3:英特爾 Performance Counter Monitor 命令行版本


但是,未來將有更多新技術推出。對於 Linux 操作系統,軟件包中含有一個可插入 KDE* utility ksysguard 中的適配器。使用該後臺程序,能夠實時獲得不同指標的曲線圖。圖 4 也是一個截屏,展示了工作負載運行過程中顯示的部分指標。

Screenshoot%20of%20ksysguard%20with%20Intel%20PCM
圖 4:Linux 上的 KDE utility ksysguard 可以使用插件繪製性能計數器的曲線圖。


鑑於這些實用程序能夠提供連接系統內部的直接通道,甚至可以使用它們迅速地實時查找和了解基本的性能瓶頸。(與英特爾® VTuneTM 可視化性能分析器不同,它們不會告訴您導致性能問題的是應用的哪些部分。)

自 1.5 版本開始,英特爾® Performance Counter Monitor 軟件包集成了一項基於 Microsoft .Net* 2.0 或更高版本的 Windows* 服務,該服務能夠創建性能計數器,並顯示在隨 Microsoft Windows* 操作系統附帶提供的 Perfmon 程序中。微軟的 perfmon 程序能夠在 Windows* 操作系統上顯示大量有用的性能計數器,例如磁盤活動、內存使用、CPU 負載等。請點擊此處,瞭解與面向 Windows* 7 和 Windows* 2008/R2 的 perfmon 程序有關的更多信息(現多個 Windows 版本均配有 perfmon)。請閱讀 Windows_howto.rtf 文件,瞭解如何安裝和卸載針對英特爾® PCM 的服務。

針對上述所有面向 Nehalem 和 Westmere 架構平臺的硬件計數器,我們創建了一個相應的 perfmon 計數器,這樣一來,perfmon 支持的所有特性將全部適用於這些計數器,如在文件或數據庫中持續記錄日誌等。對於英特爾® 凌動TM 處理器,出於我們之前已提及的原因,關於內存帶寬、英特爾® QPI 帶寬和三級高速緩存未命中的 perfmon 計數器將持續顯示“0”。在未來的英特爾® Performance Counter Monitor 更新版本中,服務將只顯示可用的計數器。

PCM+Service+screenshot.png


圖 5:Windows* Perfmon 顯示從英特爾® Performance Counter Monitor 獲得的數據






集成於您的程序之內的英特爾® Performance Counter Monitor

藉助庫提供的抽象層,您能夠非常輕鬆地監控應用中的處理器性能指標。使用性能計數器之前,應首先對它們進行初始化。完成初始化後,可在相關代碼段之前和之後捕獲計數器狀態。不同例程會捕獲面向內核、插槽或整個系統的計數器,並將它們的狀態存儲於相應的數據結構中。其它例程則可基於這些狀態計算性能指標。下方的代碼片段展示了一個具體的使用示例:


01PCM * m = Monitor::getInstance();
02if (m->program() != PCM::Success) // program counters
03return -1; // error occured during programming
04SystemCounterState before_sstate = getSystemCounterState();
05[run your code here]
06SystemCounterState after_sstate = getSystemCounterState();
07cout << “Instructions per clock:“ << getIPC(before_sstate,after_sstate)
08<< “L3 cache hit ratio:” << getL3CacheHitRatio(before_sstate,after_sstate)
09<< “Bytes read:”<< getBytesReadFromMC(before_sstate,after_sstate)
10<< [and so on]…


“CPU 資源”感知型調度

爲了評估掌握精確的資源利用率可能帶來的影響,我們實施了一個簡單的調度程序,在單條線程中執行 1000 個計算密集型和 1000 個內存帶寬密集型任務。我們所面臨的難題是,系統上存在無法預測的後臺負載,這是當前採用大量第三方組件的多組件系統經常出現的典型情形。圖 5 顯示了不清楚後臺活動的調度程序可能做出的調度安排。

Scheduler%20without%20Intel%20PCM
圖 5:未採用英特爾® Performance Counter Monitor 的調度程序
如果調度程序(使用提供的例程)能夠檢測到目前大量內存帶寬爲另一個進程所佔用,它便可以相應地調整安排。我們的模擬實驗顯示,在測試系統上,此類調度程序執行相同 2000 個任務的速度與一般的非感知型調度程序相比提高了 16%。

Scheduler%20with%20Intel%20PCM
圖 6:採用英特爾® Performance Counter Monitor 的調度程序Changelog

版本 1.0
- 第一版

版本 1.5
- 與 Windows* perfmon 相集成
- 支持英特爾® 凌動TM 處理器

版本 1.6
- 支持英特爾® 至強® E7 系列處理器(英特爾® 微架構 Westmere-EX)
- 第二代英特爾® 酷睿TM 處理器家族(英特爾® 微架構 Sandy Bridge)的內核性能指標
- 嘗試支持部分較早的英特爾® 微架構(如 Penryn)。可通過在 cpucounter.cpp 中定義 PCM_TEST_FALLBACK_TO_ATOM 來啓用該支持
- 增強的 Linux KDE ksysguard 插件
- 針對命令行 pcm 實用程序的全新選項
- 在 Windows 7 和 Windows Server 2008 R2 上支持超過 64 枚內核
- 支持性能監視單元共享準則,避免與其它處理器性能監視代理程序(如英特爾® VTuneTM 可視化性能分析器)產生衝突




[1] Drysdale, Gillespie, Valles 《英特爾® 超線程技術性能探究》
[2] 《英特爾® 64 和 IA-32 架構軟件開發人員指南》,第 3B 卷:系統編程指南,第 2 部分
[3] 《英特爾® 至強® 7500 系列處理器非內核編程指南》
[4] Peggy Irelan和Shihjong Kuo 《性能監控單元共享指南》
[5] David Levinthal 《面向英特爾® 酷睿™ i7 處理器和英特爾® 至強™ 5500 處理器的性能分析指南》

英特爾、Intel 標識、Xeon、至強、Core、酷睿 和 VTune 是英特爾公司在美國和其他國家(地區)商標。* 文中涉及的其它名稱及商標屬於各自所有者資產。英特爾處理器號不作爲衡量性能的標準。處理器號主要區分各處理器家族內部的不同特性,不同處理器家族之間的處理器號不具有可比性。請訪問:http://www.intel.com/products/processor_number

本文檔轉載的軟件源代碼根據軟件許可證提供,並且只能在許可證條款下使用或複製。

英特爾樣本源代碼許可協議

英特爾® 睿頻加速技術要求系統支持英特爾® 睿頻加速技術。請諮詢您的電腦製造商。具體的性能取決於硬件、軟件和系統配置。如欲瞭解更多信息,請訪問:http://www.intel.com/technology/turboboost

結果基於英特爾內部分析結果,僅供參考。系統硬件、軟件設計或配置的任何差異都可能影響實際性能。

軟件受到《美國出口管理條例》和其它美國法律的制約,不得出口或轉出口給特定國家/地區(緬甸、古巴、伊朗、朝鮮、蘇丹和敘利亞)或被禁止接收美國出口貨物的個人或實體(包括拒絕往來交易對象、特別指明的國家,和出口管理局禁止實體名單上列出的實體或涉足導彈技術或核、化學或生物武器交易的實體)。

 

           

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

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