ARM性能分析器(Streamline) 7.0版開始支持基于SPE(統(tǒng)計(jì)性能分析擴(kuò)展)的性能分析。SPE是Armv8.2-A架構(gòu)中的一個(gè)可選擴(kuò)展特性,它可以以很低的代價(jià)對處理器的流水線進(jìn)行采樣。Streamline可以從Arm Development Studio和Arm Mobile Stuido獲取。
為什么需要SPE?
Streamline前序版本只能通過硬件計(jì)數(shù)器和軟中斷中采樣PC信息獲取CPU的信息。硬件計(jì)數(shù)器只記錄觸發(fā)事件加總數(shù),不可能知道具體哪條指令觸發(fā)了事件,它只能大致提供應(yīng)用程序哪塊代碼觸發(fā)了這個(gè)計(jì)數(shù)器增加,而往往這塊代碼區(qū)域都比較大,這也導(dǎo)致了能通過這個(gè)信息來確定問題的開發(fā)者有限。同時(shí)因?yàn)椴蓸雍徒馕龆际峭ㄟ^中斷中的軟件來完成的,這也導(dǎo)致了程序計(jì)數(shù)器和棧的采樣率也是有限,太高的頻率會導(dǎo)致增大系統(tǒng)負(fù)載。SPE通過利用CPU流水線中的硬件對PC值進(jìn)行周期性采樣來避免前面提到的問題,因此采樣率可以很高,并且沒有性能負(fù)擔(dān)。因?yàn)?/span>SPE是構(gòu)建在處理器流水線里面,它可以直接采集每條指令相關(guān)的附加信息,這方便我們進(jìn)一步分析執(zhí)行代碼。
工具支持
Streamline支持同時(shí)收集系統(tǒng)/應(yīng)用模式下的SPE數(shù)據(jù)和其他性能計(jì)數(shù)器數(shù)據(jù)。
它支持圖形化顯示下列SPE數(shù)據(jù):
l 延遲計(jì)數(shù)包。它計(jì)算指令從觸發(fā)到執(zhí)行完畢的延遲,可以用來鑒別流水線中的執(zhí)行停滯。這個(gè)計(jì)數(shù)包也提供存儲存取延遲信息,這可以用來識別高延遲的存儲訪問和糟糕的緩存用法。
l 事件包。它提供每個(gè)被采樣指令的重要信息。包括下面信息:
l 這條指令是否access/hit/miss某級緩存
l 這條指令是否是錯(cuò)誤預(yù)測或者沒有采用的分支
l 這條指令是否導(dǎo)致互斥讀寫失敗
事件包可以用來識別分支預(yù)測,糟糕的緩存試用,鎖競爭等問題。
數(shù)據(jù)源包,顯示數(shù)據(jù)從哪一級存儲中獲取。
這些數(shù)據(jù)可以通過時(shí)間線顯示這些事件發(fā)生的順序,也可以在函數(shù)調(diào)用路徑,代碼試圖中看到。這讓用戶可以追蹤到線程,函數(shù),代碼行和指令行。
先決條件
使用SPE需要硬件支持相應(yīng)的擴(kuò)展,內(nèi)核需要使能arm_spe_pmu,設(shè)備樹或者UEFI需要支持SPE。此外,SPE目前需要KPTI失效(啟動kernel的時(shí)候設(shè)置kpti=off),這個(gè)要求在Arm后續(xù)處理器上可能不需要??梢酝ㄟ^檢查是否存在/sys/bus/events/devices/arm_spe_0文件驗(yàn)證內(nèi)核是否支持SPE。檢查dmesg的輸出是否有
Kernel/User page tables isolation: enabled
或者查看/sys/devices/system/cpu/vulnerabilities/meltdown是否包含Mitigation: PTI if enabled.
為了使用SPE,你需要有一個(gè)支持SPE的設(shè)備,或者使用arm的虛擬平臺FVP。本文使用Arm Neoverse N1 SDP。如果你想在虛擬平臺上測試,你可以使用FVP_Base_RevC-2xAEMv8A。Arm Mobile Studio支持SPE,但是目前還沒有消費(fèi)級的Android設(shè)備支持SPE,本文重點(diǎn)使用Arm Development Studio中的Streamline進(jìn)行演示。
Neoverse N1 SDP配置
本文使用Arm Neoverse N1 Software Development Platform運(yùn)行一個(gè)基于Linux 5.4.1內(nèi)核的環(huán)境。除了需要使能Streamline需要的內(nèi)核選項(xiàng)和前面的提到的內(nèi)核選項(xiàng),不需要其他特殊配置。Neoverse N1 SDP 是一款針對服務(wù)器市場的開發(fā)平臺,目前尚未公開,只有早期客戶才能獲取。該平臺內(nèi)含一顆Neoverse N1處理器,第一個(gè)支持SPE的處理器。
FVP配置
如果你希望在arm虛擬平臺上嘗試SPE功能,可以通過下面參數(shù)使能SPE :
-C cluster0.has_armv8-2=1 -C cluster0.has_statistical_profiling=1
-C cluster1.has_armv8-2=1 -C cluster1.has_statistical_profiling=1
因?yàn)?/span>FVP并不包含時(shí)序信息,所有的指令周期都只需要一個(gè)cycle,所以在FVP上的延遲計(jì)數(shù)器包中顯示延遲都是0.同時(shí)FVP也不模擬分支預(yù)測,所以所有的分支預(yù)測都顯示正確。
緩存模型可以被使能,使能后,SPE可以顯示緩存模型行為的相關(guān)事件。
開工
在設(shè)備上Gatord需要用root啟動。Arm Development Studio用戶可以通過下面命令進(jìn)行全系統(tǒng)分析。
/path/to/gatord
也可以通過下面的命令對某個(gè)應(yīng)用進(jìn)行分析
/path/to/gatord --system-wide no --app <some-app-to-launch>
啟動Streamline,連上設(shè)備,從計(jì)數(shù)器配置窗口可以看到Arm SPE(Statistical Profiling Extension)配置界面
Figure 1 SPE配置對話框
這個(gè)對話框可以讓用戶基于操作類型,事件,最小延遲過濾出感興趣的事件。所有的操作默認(rèn)都會被采樣,但也可以只采樣某種分支,存取操作的組合。相似的,也可以只采樣一些事件來進(jìn)一步降低采樣量。過濾設(shè)置可以針對某類問題降低采集的數(shù)據(jù)量。比如低總延遲可以用來提取除緩存外的內(nèi)存操作。錯(cuò)誤預(yù)測事件可以用來尋找那些觸發(fā)錯(cuò)誤的程序分支。盡管硬件允許,Streamline目前并不能讓用來設(shè)置采樣率。目前采樣率是每100000指令采樣一次。Streamline下一個(gè)版本,7.2,會支持配置采樣率。
Note: SPE運(yùn)行時(shí)每隔n個(gè)指令進(jìn)行一次采樣,看其是否滿足filter條件再送給Streamline后臺,而不是過濾所有樣本后每隔n條指令進(jìn)行采樣。當(dāng)Streamline采集數(shù)據(jù)到本地文件時(shí),--spe選項(xiàng)參數(shù)可以用來控制SPE采樣配置。
檢查數(shù)據(jù)
下圖顯示添加了更多SPE計(jì)數(shù)器的時(shí)間圖。SPE事件包內(nèi)的多種屬性顯示再堆疊圖上。這些圖顯示了某種屬性在樣本中存在和不存在的比例。白色方塊中顯示再所選事件內(nèi)包含某種屬性樣本的總和。有些屬性和某些特定類型的指令相關(guān),比如分支,存取。
比如Architecturally retired圖顯示了采樣的指令后完成了和沒有完成的數(shù)量,總量顯示了冒險(xiǎn)執(zhí)行的總指令量。類似地, Level 1 Data Cache Access圖顯示了采樣指令中含有對L1數(shù)據(jù)緩存存取指令總數(shù),以及hit/miss比例。
Note:這些圖標(biāo)不會實(shí)時(shí)顯示,經(jīng)過離線分析后會顯示。
這些事件圖顯示了被采樣進(jìn)程的行為概述,可以用來進(jìn)一步通過分析試圖來分析感興趣區(qū)域的細(xì)節(jié)。分析視圖中默認(rèn)顯示采集過程中每個(gè)計(jì)數(shù)器和事件發(fā)生次數(shù)總和。當(dāng)你發(fā)現(xiàn)感興趣區(qū)域,卡尺工具可以用來再分析視圖中過濾出感興趣區(qū)域的數(shù)據(jù)。
Figure 2使用cross-section標(biāo)記選擇感興趣區(qū)域,本圖顯示一個(gè)對L2緩存利用率不足的benchmark的SPE計(jì)數(shù)器,采樣模板使用實(shí)驗(yàn)性N1 SPE模板
進(jìn)一步分析
Streamline有很多視圖用來進(jìn)一步分析理解被分析對象的行為。這包括調(diào)用路徑欄,函數(shù)視圖欄和代碼欄。
調(diào)用路徑欄
調(diào)用路徑視圖顯示了按照進(jìn)程和線程顯示的調(diào)用棧。因?yàn)?/span>SPE只是采樣PC而不是調(diào)用棧,每個(gè)進(jìn)程中的函數(shù)只是平鋪展開。默認(rèn)情況,本視圖只顯示傳統(tǒng)的周期性采樣數(shù)據(jù),為了顯示SPE數(shù)據(jù),從下拉菜單中選擇SPE。
Figure 3下拉菜單顯示調(diào)用棧
事件包顯示了每個(gè)函數(shù)中符合條件和不符合條件的采樣比例,以及每個(gè)線程和進(jìn)程中事件的加總數(shù)。通過點(diǎn)擊第一列的表,可以將這些比例單獨(dú)成列用來排序,這些獨(dú)立的列顯示了符合條件的事件量,以及占總量的比例。通過對這些列的排序,可以確定哪些函數(shù)導(dǎo)致緩存存取失敗,或哪些函數(shù)導(dǎo)致分支預(yù)測失敗率高。
Figure 4 可配置顯示列
Figure 5基于L1數(shù)據(jù)緩存存取失敗排序的函數(shù)
延遲計(jì)數(shù)器以Log2(Latency)為橫軸的直方圖顯示,列按照0延遲,1 cycle延遲,2-3 cycles延遲,4-7 cycles延遲,8-15 cycles延遲等等,直至采集到的大延遲。
Figure 6 可能的延遲例子,深色的部分顯示所有延遲中的高延遲部分,一行中的高一些的柱圖顯示一行中的高延遲
調(diào)用路徑視圖的下半部分顯示子視圖。對于周期性的調(diào)用棧采樣,它會用來顯示某個(gè)選擇的函數(shù)下的所有函數(shù)調(diào)用占所有采樣中的比例。但是SPE數(shù)據(jù)只會將進(jìn)程/線程中的函數(shù)平鋪展開,這里只會顯示進(jìn)程/線程中函數(shù)占用父進(jìn)程/線程中調(diào)用比例(A函數(shù)在子線程/進(jìn)程中被調(diào)用次數(shù)除以A函數(shù)在父子進(jìn)程中調(diào)用次數(shù))。
Figure 7調(diào)用路徑子視圖,顯示一個(gè)線程的所有函數(shù)
函數(shù)欄
函數(shù)視圖欄顯示了所有進(jìn)程的中函數(shù)列表。和調(diào)用路徑欄一樣,函數(shù)欄也有一個(gè)下拉菜單選擇顯示數(shù)據(jù)。類似地,每個(gè)列也可以通過點(diǎn)擊頭部添加刪除。
Figure 8函數(shù)欄,顯示L1數(shù)據(jù)緩存存取失敗的SPE數(shù)據(jù)
代碼欄
點(diǎn)擊代碼欄或者在調(diào)用路徑視圖,函數(shù)欄中右鍵選擇一個(gè)函數(shù)即刻看到相關(guān)代碼欄。和前面二種視圖有所不同,本視圖一次只顯示一列。你可以從下拉菜單中進(jìn)行相應(yīng)選擇配置視圖。
Figure 9使用下拉菜單選擇代碼視圖配置
反匯編顯示基于每條指令的計(jì)數(shù)器變化,比如可以顯示每條指令的延遲。
Figure 10反匯編視圖
如果分析的程序包含調(diào)試信息,視圖還會顯示代碼行信息,如果運(yùn)行Streamline的機(jī)器上關(guān)聯(lián)了被調(diào)試程序的源碼,代碼欄的上半部分會顯示被選擇函數(shù)的源碼,同時(shí)每行代碼運(yùn)行帶來的計(jì)數(shù)器變化也會顯示。這可以用來識別函數(shù)中需要特別處理代碼塊。
關(guān)于億道電子
億道電子是國內(nèi)全面的開發(fā)工具提供商,致力于將全球先進(jìn)的軟件產(chǎn)品引薦給國內(nèi)研發(fā)型企業(yè)使用,為企業(yè)提供研發(fā)、設(shè)計(jì)、管理過程中使用的各種軟件工具,并致力于和客戶一同提高研發(fā)、設(shè)計(jì)效率,縮短設(shè)計(jì)周期。億道電子先后與arm、Altium、Ansys、QT、TestPlant、CollabNet、Parasoft以及TouchGFX等多家全球知名公司建立戰(zhàn)略合作伙伴關(guān)系,并成為他們在中國區(qū)的重要分銷合作伙伴。億道電子專注開發(fā)、設(shè)計(jì)、管理工具數(shù)十年,客戶超過6000家,具有豐富的工具使用及客戶支持經(jīng)驗(yàn)積累,可以為客戶提供從arm開發(fā)、EDA板級設(shè)計(jì)、軟件編譯及測試工具、結(jié)構(gòu)設(shè)計(jì)工具、多物理場仿真工具以及嵌入式GUI工具等產(chǎn)品與服務(wù)。億道電子在北京、上海、深圳設(shè)有分公司,業(yè)務(wù)遍布全國。
摘自arm中文論壇網(wǎng)