一種基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),包括過濾模塊、記錄模塊、向量時鐘計算模塊以及并行檢測模塊。過濾模塊負責監(jiān)控待檢測程序運行過程中各個線程的內(nèi)存訪問操作,過濾冗余的內(nèi)存訪問以及不可能發(fā)生數(shù)據(jù)競爭的訪問,過濾后剩下的訪問由記錄模塊寫入到各線程對應的記錄文件中。向量時鐘計算模塊從記錄文件中讀出程序的內(nèi)存訪問記錄,計算內(nèi)存訪問的向量時鐘。并行檢測模塊利用向量時鐘將檢測任務劃分成小的任務分配到多個工作線程中并負責匯總檢測結果。本發(fā)明只記錄可能發(fā)生競爭的內(nèi)存訪問并對訪問區(qū)間進行合并壓縮,使得記錄量大幅減少,同時數(shù)據(jù)競爭檢測算法的并行度較高,能夠充分利用多核硬件實現(xiàn)檢測加速。
【專利說明】一種基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng)
【技術領域】
[0001]本發(fā)明屬于計算機軟件測試與調(diào)試領域,更具體地,本發(fā)明描述一種基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng)。
【背景技術】
[0002]隨著多核硬件的廣泛普及,多線程軟件也隨之滲入到計算領域的方方面面,多線程軟件能夠充分利用多核硬件資源,在同一時間執(zhí)行多項任務,特別適用于需要快速響應用戶操作的任務,除此之外,多線程軟件還可以成倍的加速某些任務。然而多線程程序固有的不確定性帶來了數(shù)據(jù)競爭,死鎖以及違反原子性等運行時錯誤,其中數(shù)據(jù)競爭指的是當多個線程訪問同一個內(nèi)存地址并且其中至少有一個為寫操作時的程序狀態(tài),是多線程程序錯誤中最為普遍的一種錯誤。近幾十年來,數(shù)據(jù)競爭導致的軟件故障對社會造成了非常嚴重的損失和傷害,比如2003年美國東北部大范圍停電以及Therac-25重大醫(yī)療事故。不幸的是,這類錯誤與線程的調(diào)度順序密切相關,因而極其難以重現(xiàn)。近年來由于數(shù)據(jù)競爭造成的經(jīng)濟損失甚至人身傷害迫使人們加大對數(shù)據(jù)競爭檢測方法的研究。
[0003]現(xiàn)有的數(shù)據(jù)競爭檢測方法一般可分為靜態(tài)和動態(tài)兩大類。靜態(tài)檢測方法在編譯時對程序源碼進行全局分析,其優(yōu)勢在于可以覆蓋程序所有的執(zhí)行路徑,從而檢測到潛在的數(shù)據(jù)競爭。靜態(tài)方法還可以加大檢測對象的粒度,比如以對象而不是機器字為基本檢測單位可以減小檢測開銷。然而,靜態(tài)方法由于缺少程序的運行時信息只能做很多保守的假設,導致檢測結果極其不準確,給用戶造成很多的困擾。反之,動態(tài)方法在程序運行時對其進行跟蹤檢測,因為可以利用程序的運行時信息,動態(tài)方法的檢測結果較為準確,甚至可以做到?jīng)]有誤報。動態(tài)方法的缺點在于檢測結果只限于程序具體的一次執(zhí)行,因此沒有辦法檢測出潛在的競爭。另外,動態(tài)方法需要跟蹤程序的內(nèi)存訪問記錄,而多線程程序的內(nèi)存訪問數(shù)量往往極其龐大,所以動態(tài)方法的檢測開銷非常高。對于數(shù)據(jù)競爭這類極其難以推理和調(diào)試的錯誤,誤報產(chǎn)生的時間成本是難以容忍的,因此目前業(yè)界大都采用動態(tài)方法。由于數(shù)據(jù)競爭能夠造成難以估量的損失和傷害,工業(yè)界迫切需要一種準確并且低開銷的數(shù)據(jù)競爭檢測方法。
【發(fā)明內(nèi)容】
[0004]針對現(xiàn)有動態(tài)數(shù)據(jù)競爭檢測方法開銷過高的缺點,本發(fā)明提出一種離線的并行數(shù)據(jù)競爭檢測系統(tǒng),此方法充分利用待檢測程序的并行結構,使得訪存記錄量大幅減少,其檢測算法具有很高的并行性,因而可以充分利用現(xiàn)有的多核平臺來加快檢測速度。
[0005]本發(fā)明提供了一種基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),包括過濾模塊、記錄模塊、向量時鐘計算模塊以及并行檢測模塊,其中:
[0006]所述過濾模塊用于監(jiān)控線程的執(zhí)行過程,截獲線程的內(nèi)存訪問,過濾掉重復和不可能造成數(shù)據(jù)競爭的訪問,對訪問區(qū)間進行壓縮合并,最后將過濾后的訪存信息發(fā)送到所述記錄模塊;[0007]所述記錄模塊用于建立待檢測程序的訪存記錄到外部記錄文件的映射關系,即將每個線程經(jīng)過過濾的訪存信息寫入到與之對應的外部文件中,同時負責編碼和壓縮所記錄的信息;
[0008]所述向量時鐘計算模塊用于根據(jù)所述文件系統(tǒng)中記錄的信息計算各事件的向量時鐘,計算方法采用經(jīng)典的向量時鐘算法,所述并行檢測模塊利用所述計算所得向量時鐘判斷兩個事件是否可能同時發(fā)生;
[0009]所述并行檢測模塊用于并行檢測并行程序執(zhí)行過程中是否實際發(fā)生了數(shù)據(jù)競爭,并在檢測到數(shù)據(jù)競爭后將結果終結后報告給用戶。
[0010]優(yōu)選地,所述過濾模塊基于下述過濾策略進行過濾:(I)所有發(fā)生在兩次同步操作之間的內(nèi)存訪問,程序計算器、訪問地址、訪問寬度和訪問方式都相同的只被記錄一次;
(2)對于每個線程,忽略其在當前活動記錄上的內(nèi)存訪問。(3)將多個相互兼容的訪問區(qū)間合并成一個大的等價區(qū)間。
[0011]優(yōu)選地,所述記錄模塊將每個線程過濾后的訪存信息寫入到與之對應的記錄文件,每個線程與記錄文件有一一對應的關系,給定一個線程可以直接獲取其對應的記錄文件,反之給定一個記錄文件可以直接獲取其對應的線程號。
[0012]進一步優(yōu)選地,在所述記錄文件中,每個并行區(qū)對應一個目錄,目錄以“并行區(qū)號+創(chuàng)建并行區(qū)的線程號”命名,并行區(qū)內(nèi)的每個線程對應這個目錄下的一個文件,文件直接以線程號命名。
[0013]優(yōu)選地,所述向量時鐘計算模塊從所述記錄文件中讀入每個線程的訪存記錄,并將其分割成同步塊;所述向量時鐘計算模塊采用經(jīng)典向量時鐘算法為每個同步塊計算向量時鐘值,同步塊中的所有內(nèi)存訪問具有同一向量時鐘;通過比較兩個同步塊的時鐘向量可以得到兩個同步塊A,B的先后發(fā)生關系,所述關系包括A->B,B->A, AI B,其中-> 表示左邊先于右邊發(fā)生,I表示兩者同時發(fā)生,兩同步塊具有I關系時才可能發(fā)生數(shù)據(jù)競爭。
[0014]優(yōu)選地,所述并行檢測模塊逐個對比所有同步塊對A,B,如果AI B,那么A,B可能包含數(shù)據(jù)競爭,否則不可能有競爭;為進一步檢測A,B是否包含競爭,所述并行檢測模塊將問題抽象成區(qū)間重疊問題,即將每個訪存操作抽象成一個區(qū)間,區(qū)間起始地址為訪存地址,區(qū)間寬度為訪問寬度;如果存在區(qū)間SI e A,S2 e B, SI與S2重疊并且SI與S2至少有一個是寫操作,則可判定A,B之間有數(shù)據(jù)競爭;為利用多核硬件或者分布式計算系統(tǒng)加速檢測過程,一次上述檢測過程可由一個線程或分布式系統(tǒng)節(jié)點來完成,所有同步塊對的檢測可因此并行進行;檢測到的數(shù)據(jù)競爭競爭可根據(jù)PC對應到源程序的文件名和行號。
[0015]總體而言,本發(fā)明具有如下有效效果:
[0016](I)本發(fā)明能夠將多個相互兼容的訪問區(qū)間合并成一個較大的訪問區(qū)間,從而大大減少需要記錄的數(shù)據(jù)量,節(jié)省磁盤空間。同時,數(shù)據(jù)量的減少也意味著后期分析階段可以快速高效的進行。因此本發(fā)明可以應用于內(nèi)存訪問密集型并行程序。
[0017](2)本發(fā)明提出一種新的數(shù)據(jù)競爭檢測算法,該算法將數(shù)據(jù)競爭檢測問題抽象成區(qū)間重合問題,后者可以通過快速排序和二分查找來解決,最優(yōu)情況下的時間復雜度為O(NlogN),其中N為區(qū)間數(shù)量。
[0018](3)本發(fā)明的檢測算法具有較高的數(shù)據(jù)并行度,整個大的檢測任務可以劃分為多個獨立的較小任務在多核平臺上并行執(zhí)行,以此實現(xiàn)成倍的加速。【專利附圖】
【附圖說明】
[0019]圖1是本發(fā)明基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng)。
【具體實施方式】
[0020]為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結合附圖及實施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個實施方式中所涉及到的技術特征只要彼此之間未構成沖突就可以相互組合。
[0021]首先對本發(fā)明中的術語作簡單說明:
[0022]OpenMP:一種用于高效簡潔地編寫并行程序的API (Application ProgrammingInterface),以編譯器指令的形式提供易于理解和使用的并行編程接口。OpenMP以并行區(qū)為基本單位,每個并行區(qū)包含若干個成員線程。一個并行區(qū)通常對應一個可并行的任務,由成員線程合作完成。
[0023]PIN:由Intel公司研發(fā)的一個二進制插樁框架,用戶可在其上實現(xiàn)自定義的程序監(jiān)控工具,用于監(jiān)控程序運行過程中發(fā)生的事件,如讀寫操作,同步操作,函數(shù)調(diào)用等。
[0024]臨界區(qū):同一時刻至多被一個線程執(zhí)行的代碼片。
[0025]同步操作:涉及線程的等待和喚醒的指令或者函數(shù),比如lock和unlock, signal和 wait, send 和 receive 等。
[0026]同步塊:線程執(zhí)行過程中由相鄰同步操作分隔開來的指令流。
[0027]活動記錄:線程當前正在執(zhí)行的函數(shù)在堆棧上的合法內(nèi)存區(qū)域。
[0028]向量時鐘:用以表征某個事件的發(fā)生時間,通過比較兩個事件的向量時鐘可以確定它們的先后發(fā)生關系,兩個沒有明確先后發(fā)生關系的時間被認為是沖突的,因為它們有可能同時發(fā)生。
[0029]針對現(xiàn)有動態(tài)數(shù)據(jù)競爭檢測方法開銷過高的缺點,本發(fā)明提出一種離線的并行數(shù)據(jù)競爭檢測系統(tǒng),此方法充分利用待檢測程序的并行結構,使得訪存記錄量大幅減少,其檢測算法具有很高的并行性,因而可以充分利用現(xiàn)有的多核平臺或者分布式平臺來加快檢測速度。本發(fā)明分為在線跟蹤和離線分析兩個部分。
[0030]在線跟蹤的目的在于監(jiān)控程序運行時發(fā)生的內(nèi)存訪問,把每個線程可能造成數(shù)據(jù)競爭的內(nèi)存訪問寫入到外部文件中。在線跟蹤包含過濾模塊和記錄模塊。由于現(xiàn)有的并行程序往往是內(nèi)存密集型應用,每個線程在其生命周期內(nèi)會進行大量訪存操作,全部記錄下這些訪存操作將會使得記錄文件極其龐大,因而會加大后期分析難度。通過觀察可以發(fā)現(xiàn)一個線程的大部分內(nèi)存訪問不可能造成數(shù)據(jù)競爭,因為這些訪問操作的是線程的私有變量。另外,程序執(zhí)行過程中同一條指令會反復以同樣的方式(讀或寫)訪問同一個內(nèi)存地址,每一個地址只需要記錄一次。過濾模塊的目的即在于解決這個問題,該模塊能夠過濾掉冗余的或者不可能造成數(shù)據(jù)競爭的內(nèi)存訪問。過濾后的訪存操作被發(fā)送到記錄模塊,以便進一步被寫到外部文件中。過濾規(guī)則和記錄的內(nèi)容既可以保證排除大多數(shù)冗余記錄,也能確保記錄足夠的運行時信息供離線分析所用。
[0031]離線分析包含向量時鐘計算模塊和并行檢測模塊,向量時鐘計算模塊用于計算線程事件的先后發(fā)生關系(即向量時鐘,定義見“【具體實施方式】” 一節(jié)),這些事件包括同步操作(加/解鎖,等待/喚醒操作等)和內(nèi)存訪存事件。向量時鐘可以用來決定兩個事件是否具有先后發(fā)生關系,并行檢測模塊將檢測任務劃分成較小任務并將其發(fā)送給不同的工作線程,工作線程根據(jù)向量時鐘來判斷是否存在沖突的內(nèi)存訪問。因為檢測任務具有內(nèi)在的可并行性,檢測模塊可以充分利用多核平臺和分布式平臺來提高檢測速度,也可以很容易的實現(xiàn)水平擴展。
[0032]本發(fā)明針對OpenMP程序,充分利用其并行結構降低檢測開銷;采用動態(tài)檢測方法,檢測出的數(shù)據(jù)競爭是程序執(zhí)行過程中實際發(fā)生的競爭;采用在線跟蹤加離線檢測的兩階段策略,在線跟蹤階段使用二進制插樁工具截獲并記錄并行程序的內(nèi)存訪問記錄和同步操作,離線檢測階段讀入第一階段的記錄結果并對其進行并行分析。
[0033]如圖1所示,本發(fā)明基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng)包括過濾模塊、記錄模塊、向量時鐘計算模塊和并行檢測模塊。前兩個模塊在PIN中實現(xiàn),后兩個在另外一個獨立的分析程序(以“分析器”指代)中實現(xiàn)。
[0034]過濾模塊的主要功能在于過濾掉線程中冗余的或者不可能造成數(shù)據(jù)競爭的訪存操作。兩次訪存操作的PC (Program Counter)、訪問地址、讀寫方式以及訪問寬度都相同時,只需要記錄其中一次就足夠。具體來說,過濾模塊會暫時保存已經(jīng)記錄過的訪存操作,在遇到一次新的訪存操作時,過濾模塊首先檢查該操作是否已被記錄,如果是則忽略,否則將其發(fā)送到記錄模塊。針對OpenMP程序的訪存模式,過濾模塊會忽略線程在當前活動記錄上的訪存操作,這一部分操作造成數(shù)據(jù)競爭的概率非常小,所以在實際檢測過程中因為效率問題可以忽略。因為程序的絕大部分訪存都是操作當前活動記錄中的局部變量,這種過濾規(guī)則會極大地降低記錄的數(shù)量,因而能夠將記錄文件的大小保持在可控的范圍之內(nèi),通??梢詫⑵淙孔x入到內(nèi)存中。過濾之后的訪存操作發(fā)送到記錄模塊。
[0035]記錄模塊的主要目的在于將過濾后的訪存操作寫入到外部文件,由于分析器設計及實現(xiàn)的復雜性與外部文件的組織以及文件中內(nèi)容的格式息息相關,記錄模塊必須規(guī)定一種簡單的文件組織結構和記錄格式。除此之外,記錄的內(nèi)容必須能夠準確描述程序的執(zhí)行過程以便保留完整的運行時信息。一種可行的文件組織方式是用一個目錄表示OpenMP中的一個并行區(qū),目錄下的文件對應并行區(qū)中的各個成員線程,文件可以以線程號命名,這樣的組織方式比較直觀且易于分析。每個被記錄的訪存操作以二進制的方式編碼,以實際發(fā)生順序寫入到各自對應的線程文件中,同步操作也以相同的方式處理。分析器讀取的時候只需要順序讀入各個線程文件就可以還原程序的運行場景。
[0036]向量時鐘計算模塊用于計算同步塊的向量時鐘,該模塊首先從外部文件中讀人同步塊,然后使用經(jīng)典的向量時鐘算法為每個同步塊計算向量時鐘值。通過比較向量時鐘可以得到任意兩個同步塊的先后發(fā)生關系,例如兩個同步塊A和B,它們的關系可能是A->B,B->A,或者AI B,其中-> 表示左邊先于右邊發(fā)生,I表示兩者同時發(fā)生。
[0037]并行檢測模塊利用上述向量時鐘,逐對比較兩個同步塊的向量時鐘,當兩個同步塊具有I關系時,數(shù)據(jù)競爭有可能發(fā)生,否則不可能發(fā)生。確定兩同步塊A,B可能發(fā)生數(shù)據(jù)競爭以后,檢測模塊嘗試在A和B中分別找出沖突的訪存操作,這可以通過區(qū)間重疊問題來實現(xiàn),因為內(nèi)存訪問本質上可以抽象成一個區(qū)間,起始地址為區(qū)間起點,訪問寬度為區(qū)間長度。值得注意的是任意兩對同步塊的檢測是可以并行的,并行檢測可以利用多核硬件或者分布式計算框架來實現(xiàn)。發(fā)現(xiàn)數(shù)據(jù)競爭后可以通過造成競爭的指令PC定位到源代碼的文件名和行數(shù),將其報告給用戶。
[0038]本領域的技術人員容易理解,以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。
【權利要求】
1.一種基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),其特征在于,包括過濾模塊、記錄模塊、向量時鐘計算模塊以及并行檢測模塊,其中: 所述過濾模塊用于監(jiān)控線程的執(zhí)行過程,截獲線程的內(nèi)存訪問,過濾掉重復和不可能造成數(shù)據(jù)競爭的訪問,對訪問區(qū)間進行壓縮合并,最后將過濾后的訪存信息發(fā)送到所述記錄模塊; 所述記錄模塊用于建立待檢測程序的訪存記錄到外部記錄文件的映射關系,即將每個線程過濾后的訪存信息寫入到與之對應的外部文件中,同時負責編碼和壓縮所記錄的信息; 所述向量時鐘計算模塊用于為監(jiān)控到的程序事件計算向量時鐘,計算方法采用經(jīng)典的向量時鐘算法,所述并行檢測模塊利用計算所得向量時鐘判斷兩個事件是否可能同時發(fā)生; 所述并行檢測模塊用于并行檢測程序執(zhí)行過程中是否實際發(fā)生了數(shù)據(jù)競爭,并在檢測到數(shù)據(jù)競爭后將結果匯總后報告給用戶。
2.根據(jù)權利要求1所述的基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),其特征在于,所述過濾模炔基于下述過濾策略進行過濾和壓縮:(I)所有發(fā)生在兩次同步操作之間的內(nèi)存訪問中,程序計算器、訪問地址、訪問寬度和訪問方式都相同的只被記錄一次;(2)對于每個線程,忽略其在當前活 動記錄上的內(nèi)存訪問;(3)將多個相互兼容的訪問區(qū)間合并成一個大的等價區(qū)間。
3.根據(jù)權利要求1或2所述的基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),其特征在于,所述記錄模塊將每個線程過濾后的訪存信息寫入到與之對應的記錄文件,每個線程與記錄文件有一一對應的關系,給定一個線程可以直接獲取其對應的記錄文件,反之給定一個記錄文件可以直接獲取其對應的線程號。
4.根據(jù)權利要求1至3任一項所述的基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),其特征在于,在所述記錄文件中,每個并行區(qū)對應一個目錄,目錄以“并行區(qū)號+創(chuàng)建并行區(qū)的線程號”命名,并行區(qū)內(nèi)的每個線程對應這個目錄下的一個文件,文件直接以線程號命名。
5.根據(jù)權利要求1至4任一項所述的基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),其特征在于,所述向量時鐘計算模塊從所述記錄文件中讀入每個線程的訪存記錄,并將其分割成同步塊;所述向量時鐘計算模塊采用經(jīng)典向量時鐘算法為每個同步塊計算向量時鐘值,同步塊中的所有內(nèi)存訪問具有同一向量時鐘;通過比較兩個同步塊的時鐘向量可以得到兩個同步塊A,B的先后發(fā)生關系,所述關系包括A->B,8->4,么|8,其中-> 表示左邊先于右邊發(fā)生,I表示兩者同時發(fā)生,只有兩個同步塊具有I關系時才可能發(fā)生數(shù)據(jù)競爭。
6.根據(jù)權利要求5所述的基于同步關系的并行動態(tài)數(shù)據(jù)競爭檢測系統(tǒng),其特征在于,所述并行檢測模塊逐個對比所有同步塊對A,B,如果AI B,那么A,B可能包含數(shù)據(jù)競爭,否則不可能有競爭;為進一步檢測A,B是否包含競爭,所述并行檢測模塊將問題抽象成區(qū)間重疊問題,即將每個訪存操作抽象成一個區(qū)間,區(qū)間起始地址為訪存地址,區(qū)間寬度為訪問寬度;如果存在區(qū)間SI e A,S2 e B, SI與S2重疊并且SI與S2至少有一個是寫操作,則可判定A,B之間有數(shù)據(jù)競爭;為利用多核硬件或者分布式計算系統(tǒng)加速檢測過程,每次上述檢測過程可由一個線程或分布式系統(tǒng)節(jié)點來完成,所有同步塊對的檢測可以并行進行;檢測到的數(shù)據(jù)競爭競爭可根據(jù)PC對應到源程序的文件名和行號。
【文檔編號】G06F11/36GK103729291SQ201310716720
【公開日】2014年4月16日 申請日期:2013年12月23日 優(yōu)先權日:2013年12月23日
【發(fā)明者】金海 , 邵志遠, 彭建, 黃能 申請人:華中科技大學