由於目前的CPU越來越複雜,應用了許多方法使得CPU跑得越來越快,也使得CPU越來越難以被分析。普通的用戶、軟體開發人員,很少有精力去弄懂整個CPU架構,去了解每一個CPU模塊。若有一種分析方法,可以幫助用戶快速瞭解定位當前應用在CPU上的性能瓶頸,用戶便可以有針對性地修改自己的程序,以充分利用當前的硬體資源。

Intel有一位工程師就找到了這麼一種分析方法,稱為Top-down Microarchitecture Analysis (TMA) Method [1],並且Intel將這套方法學應用在了他們的分析工具集VTUNE上面,Intel的另一位工程師也在Linux上實現了這套方法,並且分享到了GitHub: andikleen/pmu-tools。

本人曾使用、研究過這套方法學,並且在其他的x86平臺上實現了這套方法學,確實覺得這是一種對架構瓶頸分析的有效方法,可以快速準確地反映出具體的性能瓶頸,並且通過層級圖和相應的百分比,讓用戶只需關注核心的性能瓶頸,清楚當前瓶頸對CPU性能的影響程度。並且,本人還發現此方法不僅可以應用在x86這種複雜的CPU架構中,對於簡單的比如RISC-V架構也可以同樣進行分析,並且對於複雜的GPU架構,在一些流水線比較簡單的比如機器學習相關的應用中也能進行相應的瓶頸分析。除了幫助軟體開發人員、編譯器開發人員,這套方法學還可以幫助架構師去了解目前機構的瓶頸,有針對性地去設計下一代架構,以改善相關的性能。

由於這套方法學有這麼多優點和好處,所以這裡想和大家分享這套方法學,希望大家可以從中瞭解到一些關於CPU架構性能分析的知識,並且應用在具體的工作當中。而且,這種分析方法並沒有侷限在Intel的CPU上,完全可以瞭解該方法的核心思想後,自己設計出一套適用於其他特定架構的分析方法。希望可以集思廣益,一起來完善這套方法學,使得日益複雜的處理器可以被我們所理解、所分析,讓黑盒不在黑。

由於TMA內容比較多,對於不同類別的CPU瓶頸有不同的劃分方法,所以我將會用一系列的文章來解釋這套方法學,有興趣的朋友有可以查閱相關資料來對它進行一個更加全面的瞭解。這篇文章首先會介紹TMA是什麼、有什麼用,然後會介紹TMA大概是怎麼實現的,幫助大家對它有一個大體上的認識,後續將會逐一展開每一個分類具體的實現方法和具體的公式,讓大家真正理解其原理。


先來看看Intel在一次活動中對TMA的解釋:

Top-down Microarchitecture Analysis (TMA) Method is an industry-proven systematic approach that identifies performance bottlenecks in out-of-order cores. Identifying true bottlenecks lets developers focus software tuning to remediate them and improve efficiently on same hardware. TMA simplifies cycle-accounting using microarchitecture independent-metrics organized in one single hierarchy which makes analysis simple. Using TMA, the high-learning curve associated with each microarchitecture generation is replaced by a structured drill-down that guides the user to true performance limiters.

再來看看具體可以得到的性能瓶頸架構圖:

先簡要地講解下這張圖,對於我們想要分析的具體應用,我們只需應用TMA方法,將該應用在我們的目標機器上運行一次,便可以得到上圖的結果。TMA並不會減緩目標應用在目標機器上的運行速度,並且也不會產生大量的log數據,在應用結束的同時,我們就可以得到以上的結果。

那麼這個結果怎麼看呢?初步可以簡單地理解為:在程序運行的這段時間裡面,糾結有多少是有效時間,而無效時間的那部分,主要都浪費在CPU的哪一塊了,究竟是CPU哪塊造成CPU不能愉快地奔跑起來。在第一層級,TMA對於CPU有四個分類,每個分類的比重可以先簡單地理解為所消耗的比重。在最「好」的情況下,Retiring的比重為100%,其餘比重為0%,即其餘三個分類可以理解為三類導致CPU效率不高的分類。

在我們利用TMA結果進行分析的時候,我們只需要關注第一層級中比重最高的分支,然後逐級向下去追溯最關鍵的性能瓶頸便可。就拿圖上的分析結果舉例子,我們可以得知當前應用在該CPU上的性能瓶頸是在Backend,然後只用關心Memory部分,最終可以得知,CPU效率不高的原因是由於CPU訪問DRAM這條路徑不給力所導致的。

得知了該信息,軟體開發人員便可以試著將相關數據預取到Cache中,或者減少不必要的DRAM訪問來提升DRAM部分的性能。對於架構師,如果當前結果是運行業界Benchmark(比如SPEC CPU)所產生的結果,為了提高相應的跑分,可以優化CPU到DRAM這條路徑的延時和帶寬,或者支持更高級的DRAM來改善目前的架構缺陷。


敘述完了TMA到底是什麼,接下來就說說為什麼,為什麼要選用TMA而不是其他的分析方法,得到TMA的分析結果究竟有什麼用,相關人員又能如何利用該結果,來幫助自己的相關工作?為了幫助大家更好了解該方法的實用性,下面將介紹幾個應用實例,以下例子均來源於Yasin的該篇論文。

使用TMA對SPEC CPU Benchmark進行分析

通過對業界一致認可的相關Benchmark進行TMA分析,可以得知具體每個測試用例的性能瓶頸在CPU的哪部分,可以有針對性地添加相應的編譯選項,來提高特定程序在特定CPU上的性能,以提高跑分。對於架構設計人員,可以通過分析結果,來瞭解當前架構的性能瓶頸體現,以便更好地對下一代相關的架構進行有針對性的優化。

SPEC CPU 1-copy vs 4-copy的TMA結果

可以看到,對於SPEC CPU Benchmark,在1個copy的情況下,DRAM Bound原因是Latency導致的,但是在4 copy的情形下,DRAM Bandwidth的比重在某些測試用例中成為主要的DRAM Bound原因,這是由於這些用例都有對DRAM進行大量的數據訪問所導致的。從中可以更好地瞭解每個測試用例的特性,是否存在大批量的對DRAM的數據訪問。

SPEC CPU在Intel 3rd和4rd上的TMA結果

通過運行同樣測試用例(SPEC CPU Benchmark),可以快速地得到兩種架構之間的差異,從結果可以得知,在4代Intel的處理器上,Front end Bound的比重明顯減少,這有由於Intel在4代的處理器上對i-TLB和i-Cache均進行了優化所導致的。從該結果可以佐證對特定模塊優化後的性能提升,並且還可以進行不同系列/不同架構直接的處理器對比,來更好地理解不同處理器之間的差異。

由於TMA對矩陣乘進行相應的優化

想要提升特定應用在特定機器上的性能,若知道該應用在特定處理器上的相應表現,便可以有的放矢地進行相應的代碼修改,以充分利用CPU資源,提升處理性能。在步驟一,先運行一次程序,發現瓶頸在DRAM,然後檢測代碼是否有優化DRAM訪問的可能性,發現循環存在問題(跳躍訪問,而不是連續訪問)。對循環進行修正後,再次運行TMA,發現瓶頸落在後端的處理上,便可以考慮是否可以矢量化,以充分利用Core中的ALU運算模塊,提升執行速度。矢量化後,發現瓶頸依然處在後端,便可以思考還有什麼方法可以提升後端的處理能力,若程序員瞭解指令集中指令的優劣,便可以選用更優的指令集代替傳統的指令集。通過這樣一步步的分析,我們便可以充分壓榨CPU的資源,以提升我們的處理速度。

用TMA對多線程優化後的程序進行分析

對於多線程優化,最怕就是鎖啊這類問題,進行多線程後,整體的性能有可能會不升反降。要分析是什麼原因導致了性能的下降,使用TMA便可以很快速地找到根本原因。通過結果,可以瞭解到是Cache上的Store出現了瓶頸,某一個線程在進行寫操作,出現了False Sharing,這是由於多個線程處理的數據都映射到同一個Cache Line導致的,讓不同的線程訪問不同Cache Line的內容便可以解決這個問題。通過對比,修正後的多線程具有和單線程幾乎一模一樣的TMA結果,表示這是真正意義上的多線程優化。

對關鍵函數進行MEM Bound優化

再來看一個對於特定應用優化的例子,對於程序中的熱點函數進行TMA分析,得到87%比重在於Backend,然後發現主要是由於DRAM的Latency導致的。那麼通過什麼方法可以改善DRAM的訪問呢?可以通過軟體預取,提前講所需的數據緩存到Cache中,以此來避免訪問DRAM的延遲對整體程序性能造成影響。通過對實現軟體預期的程序進行分析,可以發現DRAM Latency的比重有所下降,整體的速度比原來提升了2.5倍。


以上就是使用TMA對特定應用在特定CPU上的分析結果,並且介紹了這些分析結果能夠怎樣幫助我們對軟體進行進一步的優化以充分利用現有的硬體資源,還有就是能夠怎麼樣幫助硬體架構師更好地設計出性能更強大的處理。希望大家可以初步認識TMA,並且對它的效果有一定的認可,畢竟,想要分析一個複雜龐大的處理真的有點無從下手,而TMA卻很好地告知我們的瓶頸,讓我們只需要關注在能帶來最大收益的部分。

介紹完了TMA是什麼,怎麼用,對我們有什麼幫助後,接下來將會介紹TMA的實現原理,下一篇文章將會簡要介紹TMA的核心思想和實現方法,究竟TMA是如何得到第一層級的四個分類的,這四個分類究竟表示什麼含義。過程中可能會涉及到一些CPU體系結構,如果學習過Computer Architecture的朋友應該都很好理解,不過哪怕不瞭解也沒關係,我會盡量用比較簡單的語言來和大家講解。

參考文獻:

[1] Yasin, A. (2014). A Top-Down method for performance analysis and counters architecture. In ISPASS 2014 - IEEE International Symposium on Performance Analysis of Systems and Software.

補充:

  1. TMA對性能進行分析的層級:
與傳統的熱點分析方法所處的層級不一樣,TMA是站在微架構層級對軟體的性能進行分析的

推薦閱讀:

相關文章