VTune工具使用心得
轉(zhuǎn)載自:http://hi.baidu.com/luguowei/blog/item/b19568e796feca2db93820c9.html/cmtid/4d3dd7f809696c01d9f9fdc90. 概述
VTune是Intel一個比較強(qiáng)大的性能分析軟件。主要包括三個小工具:
(1)Performance Analyzer:性能分析,找到軟件性能比較熱的部分,一般也就是性能瓶頸的關(guān)鍵點(diǎn),幫助我們收集數(shù)據(jù)發(fā)現(xiàn)問題,至于Analyzer這個功能,有點(diǎn)大言不慚了,還得靠各位大家自己分析了,當(dāng)然個人認(rèn)為這一點(diǎn)會是Intel下一步強(qiáng)化該工具的重點(diǎn)。
(2)Intel Threading Checker:用于查找線程錯誤, 能夠檢測資源競爭、線程死鎖等問題. 大家程序在并行化后,可以通過Threading Checker 檢測一下有沒有多線程相關(guān)的錯誤。
(3)Intel Threading Profiler:線程性能檢測工具,多線程化有可能會有負(fù)載比平衡, 同步開銷過大等等線程相關(guān)的性能問題。該工具可以幫你發(fā)現(xiàn)每一個線程每一時刻的狀態(tài)。
可以簡單認(rèn)為該工具是如下的使用順序:(發(fā)現(xiàn)可以多線程的代碼瓶頸)---進(jìn)行并行等編碼階段---(發(fā)現(xiàn)多線程中錯誤部分)---改正代碼bug階段---(發(fā)現(xiàn)多線程中有待提高的瓶頸部分)---優(yōu)化代碼性能階段。可以看出這套軟件針對代碼并行的實(shí)現(xiàn)有點(diǎn)服務(wù)到家的感覺,核心思想就是:”找茬”。
另外推薦一個配套的工具,就是Intel C++ 編譯器,可以集成到VS2005或者命令行下,配套使用應(yīng)該會一些更好的效果,傳說中對Intel 的C++ 編譯器好像都是贊不絕口的,而且都是自家的東西,Intel肯定不會虧待它的。
還有一個網(wǎng)上推薦的東西,直接粘貼過來,沒有了解過,不好多加評論: Intel MKL 函數(shù)庫,提供了VML 函數(shù), 這些函數(shù)可以對超越函數(shù)(sin, cos, exp, log等)進(jìn)行優(yōu)化。
此外友情提示一下,如果你使用的是AMD的CPU芯片,并一心決定以后繼續(xù)使用它的話,建議同學(xué)你就不用往下看了,理由就不告訴你了^_^
本文章主要是對VTune的一個初級使用的心得總結(jié),有什么不對的大家多扔板磚,算是一個拋磚引玉的作用吧,歡迎大家一起總結(jié)完善!
1. Intel Performance Analyzer
對于該工具使用比較簡單,不過直接說一下,軟件名稱是性能分析,實(shí)際上只是對軟件操作進(jìn)行時間上的總結(jié)和統(tǒng)計,用戶自己需要根據(jù)數(shù)據(jù)進(jìn)行分析,總體來說,該性能分析工具同IBM的性能分析工具大致一樣,個人認(rèn)為還不如IBM的好用的,呵呵。
基本操作:
(1)新建一個工程:File->new project,一般選Quick Performence Analysis Wizard就可以了。
(2)選擇要測試的程序,在彈出的對話框中有Application to Launch,填入Debug文件下的exe程序就行了。
(3)Run Activity:按工具欄上的綠色三角按鈕就行了,一般會自動運(yùn)行程序,這時你執(zhí)行你想要的操作。本來還有些配置可以配的,不過比較麻煩,一般的分析就算了。
(4)完了就會生成很多表,最麻煩的就是怎么看這些數(shù)據(jù)。左邊有這些數(shù)據(jù)的一個樹型列表,可以選擇看哪個統(tǒng)計表,中間就是相應(yīng)的圖表現(xiàn)實(shí),圖表下面還有一個Legend窗口,解釋圖表中的符號各是什么意思。

上圖為分析的主界面。對于分析圖表的結(jié)果,看上去比較多,其實(shí)真正有用的就一個(個人看法),首先出現(xiàn)的就是一個框架的分析結(jié)果,有一個柱狀圖來體現(xiàn)各種dll和進(jìn)程的時間占用統(tǒng)計,當(dāng)鼠標(biāo)在每一個柱子上停留,ToolKit會顯示該進(jìn)程的平均執(zhí)行時間和執(zhí)行的次數(shù),右側(cè)Summary概述該進(jìn)程下占用的比例等統(tǒng)計,下面的legend說明機(jī)器的配置和一些名次解釋。
選擇進(jìn)入相應(yīng)的進(jìn)程,則看到對應(yīng)進(jìn)程中各個函數(shù)的對應(yīng)信息,在此不再詳細(xì)說明。這時通過統(tǒng)計圖可以發(fā)現(xiàn)程序性能主要的花費(fèi)部分,這時就要運(yùn)用你對代碼的了解和分析、經(jīng)驗(yàn)發(fā)現(xiàn)性能提升的地方,也就是你的性能最應(yīng)該和最顯著提高,這時點(diǎn)擊你關(guān)系的函數(shù),如果你有該函數(shù)的實(shí)現(xiàn)文件(cpp),則可以結(jié)合Source File進(jìn)行一些簡單的分析,這里可以給你提供源代碼和匯編碼兩種方式來進(jìn)行體現(xiàn),供大家選擇。在Sampling Results中提供該進(jìn)程下各個函數(shù)的時間統(tǒng)計,定位到每一個執(zhí)行函數(shù)上(通常就是消耗時鐘時間最多的,即關(guān)鍵代碼)。如圖所示:
比如上面這個分析結(jié)果,該函數(shù)是對圖片像素進(jìn)行優(yōu)化分類、分割處理、生成結(jié)果的功能,具有大量的數(shù)字運(yùn)算和循環(huán),這也是我們最應(yīng)該和最有效采用多線程等手段提升效率的部分。源碼右邊的列表中給出了一些指令的執(zhí)行次數(shù)和執(zhí)行時間。經(jīng)過分析又可以定位一些比較重點(diǎn)改進(jìn)的指令。
總結(jié)此工具,和IBM的性能分析工具作用大致相同(個人感覺還是推薦IBM的,其實(shí)都差不多,主要是先入為主了,而且圖形界面比較直觀),該工具的Call Graph選項也和IBM那樣支持圖形分析,但是我在機(jī)子上運(yùn)行會崩潰,不知道為什么。該工具只是將分析的數(shù)據(jù)呈現(xiàn)給我們,而分析的過程還要依靠大家。另外,在源碼上點(diǎn)擊會出現(xiàn)一個窗口,顯示該行執(zhí)行的次數(shù)等一些分析結(jié)果,不過我這個版本該功能還是很弱的,近似于沒有用處,可能會在下面的版本有所提升。
注意:
(1)該軟件支持Linux系統(tǒng),如果分析的軟件屬于跨平臺產(chǎn)品,可以根據(jù)各自情況查看是否有必要也同事在Linux下分析,個人認(rèn)為我們的軟件沒有太大必要,完全可以在Windows下分析,發(fā)現(xiàn)問題進(jìn)行改進(jìn),此功能主要針對只運(yùn)行在Linux平臺下的軟件的,所以沒有進(jìn)行研究。
(2)該軟件支持遠(yuǎn)程模式,沒有發(fā)現(xiàn)我們的軟件是否有此功能的必要性,沒有進(jìn)行過多研究,只是發(fā)現(xiàn)一個帖子知道如何遠(yuǎn)程,會在附錄中添加上。
(3)使用VTune GUI去收集數(shù)據(jù)可能VTune本身開銷會影響分析結(jié)果,所以VTune提供命令行的分析模式,基本語法在附件中,個人認(rèn)為現(xiàn)在我們在圖形界面下進(jìn)行分析也會有很大收獲,考慮到時間成本也沒有進(jìn)行過多研究。

2.Intel Thread Checker非常不錯的一個工具,如果你用過上面性能分析的工具,這個上手也是比較容易的,界面和使用風(fēng)格上保持一致,簡單說這個工具也是對加鎖解鎖的數(shù)據(jù)收集和對死鎖的檢測,將程序運(yùn)行中發(fā)生的所有邏輯關(guān)系(讀寫操作)和認(rèn)為死鎖現(xiàn)象(時間過長)體現(xiàn)給程序員,讓大家進(jìn)行分析這些可能會導(dǎo)致deadlock、data races等問題。 基本操作: (1) 選 New Project,在 New Project 對話框中,在 Category 下拉框里選擇 Threading Wizards ,在下面的 List View 中選擇 Intel? Thread Checker Wizard ,然后 OK 。 (2) 選擇你想要檢測的程序,一定是Debug的,可以查看源代碼,這個應(yīng)該不是什么要求。 (3) Run Activity:按工具欄上的綠色三角按鈕就行了,一般會自動運(yùn)行程序,這時你執(zhí)行你想要的操作。另外,對于死鎖問題,可以設(shè)定時間,在Configure---Options---Cpllector--- Synchronization中進(jìn)行設(shè)定,來定義你認(rèn)為作為死鎖的最小時間設(shè)定。 (4) 運(yùn)行結(jié)束后生成很多表,然后就是我們自己分析了。 下面就簡要說明一下這些表的作用和一些個人的使用心得: 上圖是運(yùn)行程序后生成的主界面(Diagnostics),以及源碼界面(Source View),這里最有用的信息主要是Short Descption和Descption這兩個列表內(nèi)容,第一個表主要是對該操作可能導(dǎo)致的并行問題的歸類,比如data race或deadlock等,如果對此類錯誤不是很理解,可以點(diǎn)擊右鍵在菜單中查看Diagnostics Help,會對此類型錯誤進(jìn)行一個概括的介紹,如下圖所示(介紹讀寫資源競爭): 如上是我在多線程程序中的一個數(shù)據(jù)競爭的現(xiàn)象的幫助文檔說明,其邏輯關(guān)系是Read該數(shù)據(jù)后Write該數(shù)據(jù),這種情況則可能會導(dǎo)致Data Race的問題,這在點(diǎn)上,Thread Checker則會把程序運(yùn)行中的各種出現(xiàn)的邏輯情況都羅列并定位到代碼所在行。 上圖是我在程序中的一個死鎖問題的幫助文檔的說明,給出可能的死鎖原因,正是我在程序中用到了WaitForSingleObject()函數(shù),導(dǎo)致了線程函數(shù)和進(jìn)程條死鎖的產(chǎn)生。同時可以定位到死鎖線程的源代碼,這時候,就需要我們仔細(xì)研究死鎖的原因了。下圖是我查看死鎖詳細(xì)描述定位到源代碼的界面(可見高亮顯示的兩個部分正是導(dǎo)致我線程死鎖的原因:創(chuàng)建后等待該線程,而此時線程調(diào)用MFC進(jìn)程條,而進(jìn)程條又在等該線程): ![]() 對于Descption中的內(nèi)容,則會闡述這個問題的具體內(nèi)容,可以定位到具體代碼行,雙擊可以切換到代碼,這時大家可以分析這行代碼了,所示重點(diǎn)懷疑對象了,當(dāng)然案件的真相和真兇則需要各位“偵探”來判斷啦。 以上是我對Data race和deadlock的兩個問題程序進(jìn)行的簡單的分析報告,根據(jù)Intel對該工具的介紹和相關(guān)資料,該工具主要就是針對這兩種情況進(jìn)行分析。一般并行運(yùn)算主要就是這兩種問題啦。(看資料應(yīng)該可以做出這個判斷) 總體來說該工具最有用的就是如上的兩個表的數(shù)據(jù)分析啦,當(dāng)然還有另外兩個表,一個是Stack Traces,這個主要是對堆棧跟蹤,可以發(fā)現(xiàn)該程序堆棧,看一下一共創(chuàng)建了多少個線程之類的信息。另外一個則是圖表統(tǒng)計,統(tǒng)計檢測到的問題的一個堆疊柱狀圖。感覺用處不大。下圖是堆棧跟蹤圖: 3.Intel Thread Profile正如Intel在flash演示中介紹的那樣,這款工具的作用就是:improved thread application performance.當(dāng)然坦白的說,要想讓工具自動實(shí)現(xiàn)這點(diǎn)不像說的那么簡單,準(zhǔn)確來說,它的作用應(yīng)該是幫助我們提高線程應(yīng)用的性能,重點(diǎn)在“幫助”上。相對以上兩個工具的作用和定位,感覺這款工具目前的功能和它自身的定位還是有一些差距的,沒有很多像上面兩個工具提供一些分析的作用,而只是對代碼多線程的一個統(tǒng)計和圖形的直觀顯示,畢竟,要想讓工具自己找到優(yōu)化方案是有點(diǎn)強(qiáng)人所難的。還有感覺網(wǎng)上對這款工具的使用介紹也不是很多,幾乎沒有,感覺不想上面兩款軟件應(yīng)用的廣泛或者大家的代碼還沒有達(dá)到這一階段的要求吧。操作方法還是保持的一致風(fēng)格,不用培訓(xùn),直接上手。 基本操作: (1) 選擇你想要優(yōu)化的程序,Debug版本可以調(diào)試到源代碼。在這點(diǎn)上程序支持普通模式(支持Windows API等)和OpenMP專有兩個模式。這里選擇第一個了,第二個不會用啊。 (2) 在Configure中可以配置一些選項,查看該優(yōu)化程序的Dependence等,推薦還是默認(rèn)吧,個人認(rèn)為足夠我們用的了。 (3) 點(diǎn)擊Finish運(yùn)行你的程序,運(yùn)行你的多線程程序吧,然后在運(yùn)行你需要檢測的程序功能后點(diǎn)擊結(jié)束。 (4) 這時候則會生成一系列表格圖形讓大家分析。 下面我來簡單介紹一下主要表的功能吧,都是一些很基本的方法,剛剛上手,這個工具的使用教程網(wǎng)上不多,還沒有研究很深入,需要以后在多線程開發(fā)中學(xué)以致用才是關(guān)鍵。 TimeLine表:顧名思義就是時間線的統(tǒng)計,如下表所示,在這個表中,統(tǒng)計了所有線程按照時間軸的狀態(tài): ![]() 上圖所示,在這個程序中,我創(chuàng)建了三個顯示,在加上主線程,一共四個,在這個時間軸中顯示了這四個線程從生到死的每一個瞬間,對于這些顏色,在右側(cè)會有說明,比較重要的比如綠色代表活動狀態(tài),淺綠代表等待。橙色代表至少一個線程運(yùn)行,灰色表示沒有此時沒有線程在運(yùn)行。這樣大家可以很清楚的看到每一個線程的全部狀態(tài),算是得到了程序線程運(yùn)行的最直接、最表面的第一手資料了。當(dāng)然秉承的VTune的一慣風(fēng)格,雙擊可以跟蹤到源代碼哦(如果你有的話)。 Profile Filter表:對線程各種狀態(tài)的一個歸類,對此還不是很熟悉,是對時間表的各種狀態(tài)的一個統(tǒng)計直方圖,如下表所示: ![]() 上圖是對剛才那個時間表中各種線程各種狀態(tài)花費(fèi)時間一個統(tǒng)計圖對比,灰色的是非活躍階段,橙色則是有一個線程活動的時間,統(tǒng)計出各個狀態(tài)的一個百分比。可以看出上面有許多不同的顯示方式,沒有太多研究,應(yīng)該是按照不同的分類方式來對下面時間表的一個體現(xiàn),大家可以按照自己的愛好去選擇吧。 另外還有一個Summary表格,是對整個程序運(yùn)行的一個統(tǒng)計,在這個表格中數(shù)據(jù)要比圖表詳細(xì)很多,畢竟圖表只是一個通過圖形將一個重點(diǎn)數(shù)據(jù)更加直觀的表現(xiàn),信息量相對數(shù)據(jù)來說要小很多,在這個摘要中,創(chuàng)建線程數(shù),狀態(tài)都統(tǒng)計成表格,圖像如下: ![]() 總體來說,我對這個工具研究的時間不是很多,也不是很了解,只是入門了,以后用到的時候在發(fā)揮啦,呵呵。這款軟件就是將各個線程狀態(tài)進(jìn)行一個統(tǒng)計和時間表現(xiàn)給大家,大家可以發(fā)現(xiàn)在某一時間多線程性能可能會有不盡如意的地方或還有很多提升空間,這樣大家可以抓住本質(zhì),重點(diǎn)來最有效的優(yōu)化我們的并行程序。 |