2.Intel Thread Checker
非常不錯的一個工具,如果你用過上面性能分析的工具,這個上手也是比較容易的,界面和使用風格上保持一致,簡單說這個工具也是對加鎖解鎖的數(shù)據(jù)收集和對死鎖的檢測,將程序運行中發(fā)生的所有邏輯關系(讀寫操作)和認為死鎖現(xiàn)象(時間過長)體現(xiàn)給程序員,讓大家進行分析這些可能會導致deadlock、data races等問題。
基本操作:
(1) 選 New Project,在 New Project 對話框中,在 Category 下拉框里選擇 Threading Wizards ,在下面的 List View 中選擇 Intel? Thread Checker Wizard ,然后 OK 。
(2) 選擇你想要檢測的程序,一定是Debug的,可以查看源代碼,這個應該不是什么要求。
(3) Run Activity:按工具欄上的綠色三角按鈕就行了,一般會自動運行程序,這時你執(zhí)行你想要的操作。另外,對于死鎖問題,可以設定時間,在Configure---Options---Cpllector--- Synchronization中進行設定,來定義你認為作為死鎖的最小時間設定。
(4) 運行結(jié)束后生成很多表,然后就是我們自己分析了。
下面就簡要說明一下這些表的作用和一些個人的使用心得:

上圖是運行程序后生成的主界面(Diagnostics),以及源碼界面(Source View),這里最有用的信息主要是Short Descption和Descption這兩個列表內(nèi)容,第一個表主要是對該操作可能導致的并行問題的歸類,比如data race或deadlock等,如果對此類錯誤不是很理解,可以點擊右鍵在菜單中查看Diagnostics Help,會對此類型錯誤進行一個概括的介紹,如下圖所示(介紹讀寫資源競爭):

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