專利名稱:并行程序可視化調(diào)試方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種并行程序可視化調(diào)試方法,用于對并行語言MPI(消息傳遞接口)程序進(jìn)行可視化調(diào)試,屬于計算機(jī)并行程序調(diào)試工具和調(diào)試環(huán)境領(lǐng)域。
背景技術(shù):
目前針對不同的體系結(jié)構(gòu)和并行語言,存在的調(diào)試環(huán)境也很多。尤其很多廠商,也會提供針對自己機(jī)器的調(diào)試工具,但是都不是可視化工具,通用的集合功能比較全面的工具很少,對于平臺的依賴性也很大。目前國外有很多關(guān)于并行語言MPI和PVM(并行虛擬機(jī))的程序的調(diào)試工具,例如Total View 4.0Multi-process Debugger(全部可視化多進(jìn)程調(diào)試器)是目前功能最全面的跨平臺的并行語言調(diào)試工具,是Etnus公司研發(fā)的非開放源代碼的并行可視化調(diào)試工具,已經(jīng)實(shí)現(xiàn)了對并行程序的可視化代碼級跟蹤,多線程進(jìn)程調(diào)試。Vampir(可視化跟蹤分析MPI程序)并行調(diào)試工具主要功能側(cè)重在并行程序的執(zhí)行結(jié)果分析,通過可視化看到并行程序的一些消息互發(fā)和最后信息的統(tǒng)計,來發(fā)現(xiàn)問題的所在,重點(diǎn)也是進(jìn)程間相互通信這一部分。Vampir最開始由Dresden科學(xué)技術(shù)大學(xué)研制,最后被德國的PALLAS公司用以商業(yè)用途,是受版權(quán)保護(hù)的非開放原代碼軟件。XMPI(可視化消息傳遞接口調(diào)試工具)是一個基于X/Motif的圖形用戶界面,用來運(yùn)行、調(diào)試和可視化MPI程序的工具。在運(yùn)行時,XMPI可以實(shí)時監(jiān)視各個運(yùn)行進(jìn)程的狀態(tài)以及它們之間的消息傳遞狀況,并將這些信息保存入跟蹤文件中;又可以讀入跟蹤文件,回放程序運(yùn)行時的狀況;并且以圖形化界面來顯示和回放。另外XMPI是公開源碼的可視化并行調(diào)試工具,其基于的底層LAM/MPI(本地區(qū)域機(jī)器/消息傳遞接口)也是一個公開源碼的實(shí)現(xiàn)MPI標(biāo)準(zhǔn)的實(shí)現(xiàn)。XMPI是在LAM/MPI的基礎(chǔ)上實(shí)現(xiàn)的。目前最高的版本是xmpi-2.2.3b8。(具體的參考工具是xmpi-2.2.3b8和LAM/MPI7.0.4版本的工具包和源代碼包。工具介紹網(wǎng)址http//www.lam-mpi.org/software/xmpi/)可以看出目前存在的專門針對并行語言MPI的調(diào)試工具里面只有XMPI是實(shí)現(xiàn)了專門針對LAM/MPI程序的可視化的調(diào)試,其余的Totalview和Vampir兩個并行程序可視化調(diào)試工具都是非開放源代碼的。所以到目前為止,對于LAM/MPI程序如何實(shí)現(xiàn)可視化調(diào)試方法中,只有XMPI提出了公開的解決方法實(shí)現(xiàn)。但是XMPI本身有很多不足的地方,使得它對LAM/MPI程序的調(diào)試有很多欠缺的地方。即使在目前的最高版本的xmpi-2.2.3b8當(dāng)中,也存在以下不足 1.沒有對通信消息分類,也沒有計算各個類型通信所花費(fèi)的時間。由此在調(diào)試程序當(dāng)中,無法發(fā)現(xiàn)哪些函數(shù)花費(fèi)的時間最多,也就無法來優(yōu)化程序的設(shè)計,使程序運(yùn)行后,在消息通訊上面花費(fèi)的時間最少,更好的提高程序運(yùn)行的效率和縮短執(zhí)行的時間。
2.沒有對進(jìn)程分配到哪個物理節(jié)點(diǎn)上進(jìn)行計算和相互通訊,也沒有這些進(jìn)程具體的運(yùn)行狀態(tài)記錄和回放。由此在程序運(yùn)行期間,無法知道各個進(jìn)程在不同的物理節(jié)點(diǎn)上面進(jìn)程運(yùn)行的情況,也無法反映物理節(jié)點(diǎn)工作的負(fù)載情況以及這個物理節(jié)點(diǎn)的通訊情況,以致于無法調(diào)整進(jìn)程在物理節(jié)點(diǎn)的分布來提高程序運(yùn)行的效率和更合理的分配進(jìn)程。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對現(xiàn)有技術(shù)的不足,提出一種并行程序可視化調(diào)試方法,能夠?qū)νㄓ嵪⒌姆诸悺⒏黝愅ㄓ嵪⒌睦鄯e花費(fèi)時間,以及程序運(yùn)行期間物理節(jié)點(diǎn)運(yùn)行狀態(tài)進(jìn)行可視化顯示。
為實(shí)現(xiàn)這樣的目的,本發(fā)明針對使用LAM/MPI(消息傳遞接口)平臺運(yùn)行的MPI程序進(jìn)行調(diào)試方法的改進(jìn),提取LAM/MPI平臺上程序運(yùn)行期間進(jìn)程間通訊消息的詳細(xì)信息,并通過這些信息來計算出各個類型的通訊函數(shù)上面花費(fèi)的時間,并可視化顯示出結(jié)果。同時通過提出各個節(jié)點(diǎn)的消息的信息來反映出各個節(jié)點(diǎn)的CPU(中央處理器)運(yùn)行狀態(tài),并通過時間的順序,來連續(xù)顯示各個物理節(jié)點(diǎn)的運(yùn)行狀態(tài)。
本發(fā)明的方法具體包括如下步驟 1、首先定義一個節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表,其中包括本結(jié)構(gòu)體鏈表所在物理節(jié)點(diǎn)號、本結(jié)構(gòu)體鏈表所在的進(jìn)程號、一個具體通訊信息記錄的鏈表頭。
2、針對進(jìn)程通訊中的每一個消息,定義一個消息記錄的結(jié)構(gòu)體來記錄一個進(jìn)程通訊中的一個消息的具體屬性,包括消息類型、消息個數(shù)、消息來源、目的地、消息的通訊時間和消息的內(nèi)容,把所有進(jìn)程之間通訊形成的消息記錄的結(jié)構(gòu)體掛在節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表的通訊新型記錄的鏈表頭上面,使之形成消息記錄的鏈表。
3、定義全局存儲消息結(jié)構(gòu)體,其中包括物理節(jié)點(diǎn)號、進(jìn)程號、以及各個節(jié)點(diǎn)的消息鏈表頭。把各個節(jié)點(diǎn)各自存儲的節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表匯總到統(tǒng)一的全局存儲消息結(jié)構(gòu)體。
4、把這個匯總的全局存儲消息結(jié)構(gòu)體寫入到一個記錄消息的文件當(dāng)中,作為永久保存數(shù)據(jù)的形式,便于程序運(yùn)行結(jié)束后,重現(xiàn)消息收發(fā)的全過程。
5、定義全局調(diào)試信息存儲變量,其中內(nèi)容包括整個所有各個節(jié)點(diǎn)的進(jìn)程總數(shù)、所有進(jìn)程的各個節(jié)點(diǎn)的進(jìn)程的鏈表、信息記錄的最小時間點(diǎn)和最后記錄結(jié)束的時間。統(tǒng)一把全局存儲消息結(jié)構(gòu)體對象存放到這一個全局調(diào)試信息存儲變量中。全局調(diào)試信息存儲變量的信息格式是已經(jīng)經(jīng)過初步整合的便于調(diào)試用的信息。
6、利用LAM/MPI提供的API,把各個節(jié)點(diǎn)的信息轉(zhuǎn)到全局調(diào)試信息存儲變量當(dāng)中。
7、遍歷這個全局調(diào)試信息存儲變量中記錄的鏈表的值,把這些鏈表當(dāng)中記錄的消息,進(jìn)行一一讀取,根據(jù)記錄的消息的其中一個屬性頂層調(diào)用函數(shù)名、來進(jìn)行消息分類、并且讀出這個消息發(fā)送的時間。根據(jù)這個消息的目的地的節(jié)點(diǎn)號記錄,去查找目的地節(jié)點(diǎn)號的鏈表,找到這個消息接收時候的系統(tǒng)時間。把消息發(fā)送時的系統(tǒng)時間減去消息接收時的系統(tǒng)時間,根據(jù)得到的時間差確定頂層調(diào)用函數(shù)名這個消息從發(fā)送到接收所需時間。把所有以頂層調(diào)用函數(shù)名調(diào)用發(fā)送的消息所花費(fèi)的時間進(jìn)行累計,確定并行程序運(yùn)行期間花費(fèi)在此頂層調(diào)用函數(shù)上面的時間。
8、定義節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體,內(nèi)容包括各個進(jìn)程所在物理節(jié)點(diǎn)號、進(jìn)程號、進(jìn)程的狀態(tài),進(jìn)程的通訊時的開始時候系統(tǒng)時間以及持續(xù)的時間。
9、遍歷全局調(diào)試信息存儲變量里面信息,提取出來放到節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體里面,并形成鏈表。
10、以某個時間點(diǎn)作為基準(zhǔn)來查詢記錄消息內(nèi)容的節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體鏈表,查看這個時間點(diǎn)是否有通訊存在來確定節(jié)點(diǎn)的狀態(tài)。節(jié)點(diǎn)狀態(tài)可以分成四個狀態(tài)計算狀態(tài)、節(jié)點(diǎn)系統(tǒng)自己運(yùn)行的開銷狀態(tài)、節(jié)點(diǎn)通訊的等待狀態(tài)或系統(tǒng)處于無任務(wù)的狀態(tài)。統(tǒng)計每個物理節(jié)點(diǎn),以及這個節(jié)點(diǎn)上面在每個時間點(diǎn)的機(jī)器運(yùn)行的狀態(tài)。在一個節(jié)點(diǎn)上面可能運(yùn)行多個進(jìn)程,根據(jù)這多個進(jìn)程在同一個時間點(diǎn)的不同狀態(tài)來計算出此物理節(jié)點(diǎn)的運(yùn)算狀態(tài)。狀態(tài)的優(yōu)先級別是節(jié)點(diǎn)計算狀態(tài),節(jié)點(diǎn)的系統(tǒng)開銷狀態(tài),節(jié)點(diǎn)的等待狀態(tài)或節(jié)點(diǎn)的無任務(wù)進(jìn)程狀態(tài)依次遞減。找到所有進(jìn)程當(dāng)中最高優(yōu)先級的那個狀態(tài),作為此物理節(jié)點(diǎn)的工作狀態(tài)。
11、通過基于linux下圖形界面的開發(fā)庫X/Motif的圖形用戶界面,來把頂層調(diào)用函數(shù)名及其花費(fèi)在消息發(fā)送接收上的時間的統(tǒng)計以及隨著時間點(diǎn)的推移,就可以獲得各個物理節(jié)點(diǎn)的運(yùn)行狀態(tài)的變化情況,做成效果圖。
通過以上的步驟實(shí)施,可以獲得消息分類統(tǒng)計運(yùn)行開銷時間的可視化圖和物理節(jié)點(diǎn)的運(yùn)行狀態(tài)變化顯示圖,使其能夠在調(diào)試和運(yùn)行并行程序MPI的時候,通過觀察不同類型消息的時間花費(fèi)和某個節(jié)點(diǎn)的狀態(tài)變化。這樣可以了解并行程序在運(yùn)行期間,是有多少時間消耗在進(jìn)程間通訊,以及在哪些標(biāo)準(zhǔn)函數(shù)通訊當(dāng)中消耗的時間比較多,同時通過監(jiān)控物理節(jié)點(diǎn)的運(yùn)行狀況,來更好的調(diào)整進(jìn)程的在不同節(jié)點(diǎn)的分布使得能夠最佳有效的利用CPU,減少物理節(jié)點(diǎn)間通訊次數(shù)的調(diào)試作用,最終可以發(fā)現(xiàn)所調(diào)試的程序問題的所在,并解決問題,達(dá)到了幫助發(fā)現(xiàn)并行程序問題的調(diào)試功能。尤其是在推出了MPI-2的標(biāo)準(zhǔn)以后,對于物理節(jié)點(diǎn)的工作狀態(tài)監(jiān)控,動態(tài)加入和刪除節(jié)點(diǎn)的時時監(jiān)控的意義就更是重大了。
圖1為本發(fā)明實(shí)施例通過分類統(tǒng)計不同通訊函數(shù)開銷時間的可視化效果圖。
圖2為本發(fā)明實(shí)施例物理節(jié)點(diǎn)動態(tài)顯示的效果圖。
具體實(shí)施例方式 1、首先定義一個節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表,其中包括本鏈表所在物理節(jié)點(diǎn)號trs_node、本結(jié)構(gòu)體鏈表所在的進(jìn)程號trs_pid、一個具體通訊信息記錄的鏈表頭tracchainhead。
節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表的結(jié)構(gòu)為struct nodetrace{ ● trs_node本鏈表所在的物理節(jié)點(diǎn)號,其類型是int4型 ● trs_pid形成消息記錄鏈表的進(jìn)程號,其類型是int4型 ● struct tracchainhead *tracehead通訊信息記錄的鏈表頭,其類型由下面具體定義。
定義鏈表頭tracchainhead包括消息的時間trr_time類型為int4,消息類型trr_type類型為int4,消息記錄的結(jié)構(gòu)體數(shù)組msg。
2、針對進(jìn)程通訊中的每一個消息,定義一個消息記錄的結(jié)構(gòu)體structtracemsg來記錄一個進(jìn)程通訊中的一個消息的具體屬性,包括消息類型topfunction類型是int4,消息個數(shù)count類型是int4型,消息來源mrank類型是int4型,目的地peer類型是int4型,消息的通訊時間syst類型是int4型和消息的內(nèi)容cid類型是int4型等等,把所有進(jìn)程之間通訊形成的消息記錄的結(jié)構(gòu)體掛在節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表的通訊新型記錄的鏈表頭上面,使之形成消息記錄的鏈表。
這個消息記錄的結(jié)構(gòu)體具體的專業(yè)定義如下 struct tracemsg表示每一個消息的詳細(xì)信息! ■ Topfunc最頂層的調(diào)用函數(shù),類型是int4 ■ Wrapfunc下一層的包裝函數(shù),類型是int4 ■ syst使用的記錄消息的系統(tǒng)時間,類型是int4 ■ Blkt記錄消息受阻塞的時間,類型是int4 ■ Peer發(fā)送,接受的進(jìn)程號,類型是int4 ■ Tag唯一標(biāo)識符,類型是int4 ■ cid上下文ID,類型是int4 ■ dtype數(shù)據(jù)類型標(biāo)簽,類型是int4 ■ count數(shù)據(jù)個數(shù),類型是int4 ■ mrank對應(yīng)發(fā)送或是接受的那個進(jìn)程的號碼,類型是int4 ■ mtag對應(yīng)發(fā)送或是接受的那個進(jìn)程的唯一標(biāo)識符,類型是int4 ■ seqnum順序值,類型是int4 3.定義全局存儲消息結(jié)構(gòu)體,其中包括物理節(jié)點(diǎn)號pgs_node,進(jìn)程號gps_pid,以及各個節(jié)點(diǎn)的消息鏈表頭nodetrace。把各個節(jié)點(diǎn)各自存儲的節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表匯總到統(tǒng)一的全局存儲消息結(jié)構(gòu)體。
定義全局存儲消息結(jié)構(gòu)體struct globaltraceinfor ● gps_node節(jié)點(diǎn)號,類型是int4 ● gps_pid進(jìn)程號,類型是int4 ● nodetrace * nodetrace節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表,類型是int4 4.當(dāng)所有節(jié)點(diǎn)運(yùn)行完畢后,各個節(jié)點(diǎn)都有鏈表來記錄本節(jié)點(diǎn)的具體信息,并統(tǒng)一存到一個tracefile里面,用于以后的消息回放。5.定義全局調(diào)試信息存儲變量turinginfo,其中內(nèi)容包括整個所有各個節(jié)點(diǎn)的進(jìn)程總數(shù)nproc,,所有進(jìn)程的各個節(jié)點(diǎn)的進(jìn)程的鏈表procs,信息記錄的最小時間點(diǎn)mintime類型double和最后記錄結(jié)束的時間maxtime類型double。統(tǒng)一把全局存儲消息結(jié)構(gòu)體對象存放到這一個全局調(diào)試信息存儲變量中。全局調(diào)試信息存儲變量的信息格式是已經(jīng)經(jīng)過初步整合的便于調(diào)試用的信息。全局調(diào)試信息存儲變量具體的結(jié)構(gòu)體定義structturinginfo ● nprocs進(jìn)程數(shù),類型int ● procs進(jìn)程鏈表,類型xmproc ● mintime記錄消息的開始時間,類型double ● maxtime記錄消息的最后時間,類型double ● curtime當(dāng)前消息,類型double ● minlapse消息的最短開銷時間,類型double 6.首先把信息轉(zhuǎn)到全局變量turinginfo當(dāng)中在XMPI這個可視化調(diào)試工具當(dāng)中,它是讀取LAM/MPI在運(yùn)行一個并行程序接受后的tracefile文件,讀出程序運(yùn)行當(dāng)中消息互發(fā)的記錄信息,并重新回放顯示出來。在xmpi里面顯示trace的消息互發(fā)內(nèi)容,是如何來實(shí)現(xiàn)的,它是從哪里讀到了這些trace信息,如何的提取信息來顯示的?當(dāng)并行程序運(yùn)行完畢之后,LAM/MPI環(huán)境已經(jīng)記錄的各個節(jié)點(diǎn)消息通訊的詳細(xì)記錄。都記錄在文件當(dāng)中,并且是按照不同節(jié)點(diǎn)的鏈表不同分類。使用LAM/MPI環(huán)境提供APIlamtr_parse_world(&nprocess,&world)把所有的鏈表讀到world(structglobaltraceinfor結(jié)構(gòu)體)這個結(jié)構(gòu)體鏈表當(dāng)中,nprocess表示存在多少個鏈表。得到了world,通過操作world來獲取,因?yàn)楦鱾€節(jié)點(diǎn)都存在記錄自己節(jié)點(diǎn)的鏈表,通過使用get_mpi_world(int4 world_n,structglobaltraceinfor * world,struct globaltraceinfor * mpiworld)這個函數(shù)把各個節(jié)點(diǎn)的信息統(tǒng)一提取發(fā)送到調(diào)用這個API的節(jié)點(diǎn)并存入mpiworld,再通過使用db_init(nproes,world)這個xmpi系統(tǒng)函數(shù)來調(diào)用把globaltraceinfor轉(zhuǎn)換成全局存儲消息結(jié)構(gòu)體,它是xmdb結(jié)構(gòu)體類型。
7.遍歷這個全局調(diào)試信息存儲變量中記錄的鏈表的值,把這些鏈表當(dāng)中記錄的消息,進(jìn)行一一讀取,根據(jù)記錄的消息的其中一個屬性頂層調(diào)用函數(shù)名,來進(jìn)行消息分類,并且讀出這個消息發(fā)送的時間。根據(jù)這個消息的目的地的節(jié)點(diǎn)號記錄,去查找目的地節(jié)點(diǎn)號的鏈表,找到這個消息接收時候的系統(tǒng)時間。把消息發(fā)送時的系統(tǒng)時間減去消息接收時的系統(tǒng)時間,根據(jù)得到的時間差確定頂層調(diào)用函數(shù)觸發(fā)的消息從發(fā)送到接收所需時間。
使用一個函數(shù)來完成這個功能 double Totaltime(structturinginfo dbase int functionname){int iprocess;//記錄整個所有進(jìn)程運(yùn)行期間的進(jìn)程數(shù)目。struct xmdbproc *proc;//用來記錄進(jìn)程的鏈表。struct xmdbtr *dbtrace;//用來記錄每個進(jìn)程里面消息的鏈表。struct xmdbenv db_envelop;//記錄每個消息具體的屬性。double totaltime=0;//用來記錄某個通信函數(shù)具體花費(fèi)的時間proc=base.xdb_procs;for(iprocess=0;iprocess<dbase.nprocs;iprocess++)/*循環(huán)遍歷查找所有進(jìn)程來檢查每一個消息的屬性*/{for(int j=0;j<al_count(proc.*traces);j++)//循環(huán)遍歷每個進(jìn)程中的通訊消息數(shù)目。{dbtrace=(structxmdbtr*)proc(iprocess).xdbp_curtrace;//db_envelop=dbtrace.xdbt_envelop;//來獲得每個消息的具體屬性值if(db_envelop.xdbe_func==functionname)/*比較是這個消息是否是我們要統(tǒng)計的那個函數(shù)的名稱*/totaltime=totaltime+db_envelop.xdbt_blktotal;//如果是,就累加它的花費(fèi)時間.}}return totaltime;} 就可以得到任何一個通訊函數(shù)的總時間。
8.定義結(jié)構(gòu)體節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體xmnodestate。包括了物理節(jié)點(diǎn)號xmn_nodeid,進(jìn)程節(jié)點(diǎn)號xmn_rank,消息起始時間點(diǎn)xmn_time,消息的開銷時間xmn_lapse,進(jìn)程的狀態(tài)xmn_state。節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體struct xmnodestate ● xmn_nodeid物理節(jié)點(diǎn)號碼,類型int ● xmn_rank進(jìn)程節(jié)點(diǎn)號碼,類型int ● xmn_time消息的起始時間點(diǎn),類型double ● xmn_lapse消息的開銷時間,類型double ● xmn_state進(jìn)程的狀態(tài),類型int 9.遍歷全局調(diào)試信息存儲變量里面,并提取信息來放到節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體里面,并形成鏈表。
int xmpi_db_getnodetraces(double t1,double t2,struct xmnodestate **ptraces){//定義變量double curtime; /*當(dāng)前的時間*/struct xmnodestate *traces; /*消息狀態(tài)連表*/struct xmnodestate *etraces; /*擴(kuò)展鏈表空間*/struct xmdbproc *proc; /*進(jìn)程*//**把提取消息的時間點(diǎn)設(shè)到當(dāng)前的位置*/ curtime=dbase.curtime; xmpi_db_settime(t1);/* *循環(huán)遍歷dbase中的進(jìn)程鏈表 */ proc=dbase.xdb_procs;//從dbase里面提取進(jìn)程消息鏈表(e) for(i=0;i<dbase.nprocs;++i,++proc){ trlist=proc->xdbp_traces;//一一提取消息出來/* *把在時間t1,t2之間的消息提取出來,形成消息狀態(tài)鏈表 */<!-- SIPO <DP n="8"> --><dp n="d8"/> p=proc->xdbp_curtrace; for(;p&&(p->xdbt_time<=t2); p=(struct xmdbtr*)al_next(trlist,(char*)p)){ } /* *把進(jìn)程鏈表的消息數(shù)據(jù)提取到xmnodestate結(jié)構(gòu)體里面 */traces[n].xmn_nodeid=proc->xdbp_node;//放到結(jié)構(gòu)體里面traces[n].xmn_rank=p->xdbt_grank;//放到結(jié)構(gòu)體里面traces[n].xmn_state=p->xdbt_state;//放到結(jié)構(gòu)體里面traces[n].xmn_time=p->xdbt_time;//放到結(jié)構(gòu)體里面traces[n].xmn_lapse=p->xdbt_lapse;//放到結(jié)構(gòu)體里面 ++n; } } *ptraces=traces; xmpi_db_settime(curtim e); return(n);} 10、以某個時間點(diǎn)作為基準(zhǔn)來查詢記錄消息內(nèi)容的節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體鏈表,查看這個時間點(diǎn)是否有通訊存在來確定節(jié)點(diǎn)的狀態(tài)。節(jié)點(diǎn)狀態(tài)可以分成四個狀態(tài)計算狀態(tài),節(jié)點(diǎn)系統(tǒng)自己運(yùn)行的開銷狀態(tài),節(jié)點(diǎn)通訊的等待狀態(tài),系統(tǒng)處于等待的狀態(tài)。統(tǒng)計每個物理節(jié)點(diǎn),以及這個節(jié)點(diǎn)上面在每個時間點(diǎn)的機(jī)器運(yùn)行的狀態(tài)。在一個節(jié)點(diǎn)上面可能運(yùn)行多個進(jìn)程,根據(jù)這多個進(jìn)程在同一個時間點(diǎn)的不同狀態(tài)來計算出此物理節(jié)點(diǎn)的運(yùn)算狀態(tài)。狀態(tài)的優(yōu)先級別是節(jié)點(diǎn)計算狀態(tài),節(jié)點(diǎn)的系統(tǒng)開銷狀態(tài),節(jié)點(diǎn)的等待狀態(tài),節(jié)點(diǎn)的無任務(wù)進(jìn)程狀態(tài)依次遞減。所以找到所有進(jìn)程當(dāng)中最高優(yōu)先級的那個狀態(tài),就是此物理節(jié)點(diǎn)的工作狀態(tài)。這樣可以獲得任何一個時間點(diǎn)的,某個節(jié)點(diǎn)的機(jī)器狀態(tài)信息,是計算狀態(tài)或是等待狀態(tài)。通過這種方式,可以獲得整個并行運(yùn)行環(huán)境當(dāng)中,各個節(jié)點(diǎn)的同一個時間點(diǎn)的運(yùn)行狀態(tài)。
11、通過基于X/Motif(linux下圖形界面的開發(fā)庫)的圖形用戶界面,來把頂層調(diào)用函數(shù)名及其花費(fèi)在消息發(fā)送接收上的時間的統(tǒng)計以及隨著時間點(diǎn)的推移,就可以獲得各個物理節(jié)點(diǎn)的運(yùn)行狀態(tài)的變化情況,做成效果圖。
圖1為分類統(tǒng)計不同通訊函數(shù)開銷時間的可視化效果圖。
■ 在通訊函數(shù) ◆ mpi_recv上耗費(fèi)0.813秒 ◆ mpi_wait上耗費(fèi)的時間0.115秒等等 ■ 把所有的通訊時間相加和把所用用于計算的時間相加可以累計得到 ◆ 整個程序運(yùn)行期間計算的時間是2.028秒 ◆ 整個程序運(yùn)行期間MPI通訊函數(shù)2.109秒 圖2為物理節(jié)點(diǎn)動態(tài)顯示的效果圖。
可以通過可視化的效果圖2看出,在并行程序運(yùn)行期間,各個節(jié)點(diǎn)參與運(yùn)行的的機(jī)器都有哪些,各個節(jié)點(diǎn)在同一時刻機(jī)器運(yùn)行狀態(tài)。綠色表示參與計算,黃色表示系統(tǒng)本身開銷時間。紅色表示系統(tǒng)通訊等待狀態(tài)。各個物理節(jié)點(diǎn)出于不同狀態(tài)所標(biāo)注的顏色不同,之后根據(jù)時間的推移不同的顏色變換,來顯示各個節(jié)點(diǎn)的狀態(tài)的變化。首先啟動LAM/MPI環(huán)境,啟動了兩個結(jié)點(diǎn)一個是N0,本地的機(jī)器名grid.cs.sjtu.edu.cn的結(jié)點(diǎn),另一個是N1,在cluster環(huán)境下的遠(yuǎn)程結(jié)點(diǎn)may.cs.sjtu.edu.cn。兩個物理結(jié)點(diǎn)運(yùn)行五個并行程序。由粉線圈出的部分就是新增的物理結(jié)點(diǎn)工作狀態(tài)顯示的模塊,由圖2可以看出進(jìn)程0、2、4被分配給本地結(jié)點(diǎn),而進(jìn)程1、3被給配給參與并行計算的cluster環(huán)境下的may.cs.sjtu.edu.cn這個結(jié)點(diǎn)上面。可以看出并行程序的所有進(jìn)程運(yùn)行的時間是在0.000040s和0.002547s之間,隨著時間的推移到了圖中所示的粗的白線位置0.000624s時候,兩個物理結(jié)點(diǎn)的狀態(tài)是本結(jié)點(diǎn)處于運(yùn)行狀態(tài)(淺色),遠(yuǎn)程的may.cs.sjtu.edu.cn結(jié)點(diǎn)處于等待(深色)狀態(tài)。本實(shí)施例是使用的MPI程序中,所有進(jìn)程間都要至少通訊一次的alltoall標(biāo)尺程序做的測試和效果的顯示。
權(quán)利要求
1、一種并行程序可視化調(diào)試方法,其特征在于包括如下步驟
1)首先定義一個節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表,其中包括本結(jié)構(gòu)體鏈表所在物理節(jié)點(diǎn)號、本結(jié)構(gòu)體鏈表所在的進(jìn)程號、一個具體通訊信息記錄的鏈表頭;
2)針對進(jìn)程通訊中的每一個消息,定義一個消息記錄的結(jié)構(gòu)體來記錄一個進(jìn)程通訊中的一個消息的具體屬性,包括消息類型、消息個數(shù)、消息來源、目的地、消息的通訊時間和消息的內(nèi)容,把所有進(jìn)程之間通訊形成的消息記錄的結(jié)構(gòu)體掛在節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表的通訊新型記錄的鏈表頭上面,使之形成消息記錄的鏈表;
3)定義全局存儲消息結(jié)構(gòu)體,其中包括物理節(jié)點(diǎn)號、進(jìn)程號以及各個節(jié)點(diǎn)的消息鏈表頭,把各個節(jié)點(diǎn)各自存儲的節(jié)點(diǎn)消息結(jié)構(gòu)體鏈表匯總到統(tǒng)一的全局存儲消息結(jié)構(gòu)體;
4)把這個匯總的全局存儲消息結(jié)構(gòu)體寫入到一個記錄消息的文件當(dāng)中,作為永久保存數(shù)據(jù)的形式,便于程序運(yùn)行結(jié)束后,重現(xiàn)消息收發(fā)的全過程;
5)定義全局調(diào)試信息存儲變量,其中內(nèi)容包括整個所有各個節(jié)點(diǎn)的進(jìn)程總數(shù)、所有進(jìn)程的各個節(jié)點(diǎn)的進(jìn)程的鏈表、信息記錄的最小時間點(diǎn)和最后記錄結(jié)束的時間,統(tǒng)一把全局存儲消息結(jié)構(gòu)體對象存放到這一個全局調(diào)試信息存儲變量中,全局調(diào)試信息存儲變量的信息格式是已經(jīng)經(jīng)過初步整合的便于調(diào)試用的信息;
6)利用本地區(qū)域機(jī)器/消息傳遞接口提供的應(yīng)用程序接口,把各個節(jié)點(diǎn)的信息轉(zhuǎn)到全局調(diào)試信息存儲變量當(dāng)中;
7)遍歷這個全局調(diào)試信息存儲變量中記錄的鏈表的值,把這些鏈表當(dāng)中記錄的消息進(jìn)行一一讀取,根據(jù)記錄的消息的其中一個屬性頂層調(diào)用函數(shù)名,來進(jìn)行消息分類,并且讀出這個消息發(fā)送的時間,根據(jù)這個消息的目的地的節(jié)點(diǎn)號記錄,去查找目的地節(jié)點(diǎn)號的鏈表,找到這個消息接收時候的系統(tǒng)時間,把消息發(fā)送時的系統(tǒng)時間減去消息接收時的系統(tǒng)時間,根據(jù)得到的時間差確定頂層調(diào)用函數(shù)名這個消息從發(fā)送到接收所需時間,把所有以頂層調(diào)用函數(shù)名調(diào)用發(fā)送的消息所花費(fèi)的時間進(jìn)行累計,確定并行程序運(yùn)行期間花費(fèi)在此頂層調(diào)用函數(shù)上面的時間;
8)定義節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體,內(nèi)容包括各個進(jìn)程所在物理節(jié)點(diǎn)號、進(jìn)程號、進(jìn)程的狀態(tài)、進(jìn)程開始通訊時的系統(tǒng)時間以及通訊持續(xù)的時間;
9)遍歷全局調(diào)試信息存儲變量里面信息,提取出來放到節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體里面,并形成鏈表;
10)以某個時間點(diǎn)作為基準(zhǔn)來查詢記錄消息內(nèi)容的節(jié)點(diǎn)狀態(tài)結(jié)構(gòu)體鏈表,查看這個時間點(diǎn)是否有通訊存在來確定節(jié)點(diǎn)的狀態(tài)計算狀態(tài)、節(jié)點(diǎn)系統(tǒng)自己運(yùn)行的開銷狀態(tài)、節(jié)點(diǎn)通訊的等待狀態(tài)或系統(tǒng)處于等待的狀態(tài),統(tǒng)計每個物理節(jié)點(diǎn)以及這個節(jié)點(diǎn)上面在每個時間點(diǎn)的機(jī)器運(yùn)行的狀態(tài),根據(jù)一個節(jié)點(diǎn)上面可能運(yùn)行的多個進(jìn)程在同一個時間點(diǎn)的不同狀態(tài)來計算出此物理節(jié)點(diǎn)的運(yùn)算狀態(tài),狀態(tài)的優(yōu)先級別依次遞減是節(jié)點(diǎn)計算狀態(tài)、節(jié)點(diǎn)的系統(tǒng)開銷狀態(tài)、節(jié)點(diǎn)的等待狀態(tài)、節(jié)點(diǎn)的無任務(wù)進(jìn)程狀態(tài),找到所有進(jìn)程當(dāng)中最高優(yōu)先級的那個狀態(tài)作為此物理節(jié)點(diǎn)的工作狀態(tài);
11)通過基于linux下圖形界面的開發(fā)庫X/Motif的圖形用戶界面,把頂層調(diào)用函數(shù)名及其花費(fèi)在消息發(fā)送接收上的時間的統(tǒng)計以及隨著時間點(diǎn)的推移,獲得各個物理節(jié)點(diǎn)的運(yùn)行狀態(tài)的變化情況,做成效果圖。
全文摘要
本發(fā)明涉及一種并行程序可視化調(diào)試方法,是針對使用本地區(qū)域機(jī)器/消息傳遞接口LAM/MPI平臺運(yùn)行的MPI程序進(jìn)行調(diào)試方法的改進(jìn),提取LAM/MPI平臺上程序運(yùn)行期間進(jìn)程間通訊消息的詳細(xì)信息,并通過這些信息來計算出各個類型的通訊函數(shù)上面花費(fèi)的時間,并可視化顯示出結(jié)果。同時通過提出各個節(jié)點(diǎn)的消息的信息來反映出各個節(jié)點(diǎn)的中央處理器運(yùn)行狀態(tài),并通過時間的順序,來連續(xù)顯示各個物理節(jié)點(diǎn)的運(yùn)行狀態(tài)。本發(fā)明能更好的調(diào)整進(jìn)程在不同節(jié)點(diǎn)的分布使更有效的利用CPU,能減少物理節(jié)點(diǎn)間通訊次數(shù)的調(diào)試作用,幫助發(fā)現(xiàn)所調(diào)試的程序問題的所在并解決問題。
文檔編號G06F9/46GK1588323SQ20041006657
公開日2005年3月2日 申請日期2004年9月23日 優(yōu)先權(quán)日2004年9月23日
發(fā)明者鄧倩妮, 王旭剛 申請人:上海交通大學(xué)