本發(fā)明涉及并行程序調(diào)試領(lǐng)域,并且更具體地,涉及一種基于訪存依賴對的并行重放方法和裝置。
背景技術(shù):
隨著多核處理器的流行,并行編程成為多核平臺上最有效的編程方式,是未來軟件開發(fā)的主流趨勢。然而,由于并行程序本身具有不確定性,很難在調(diào)試過程中重現(xiàn)程序中的并發(fā)錯誤。據(jù)調(diào)查,調(diào)試一個并行程序的錯誤,平均需要73天,這給程序設(shè)計(jì)者帶來了巨大的困難與挑戰(zhàn)。為了緩解程序員開發(fā)與調(diào)試并行程序的負(fù)擔(dān),LeBlanc等人首次提出了確定性重放技術(shù):程序在運(yùn)行過程中,在日志文件中記錄導(dǎo)致程序不確定的因素,包括結(jié)果不確定的系統(tǒng)調(diào)用和特殊指令,信號,共享內(nèi)存的訪問等。當(dāng)需要進(jìn)行調(diào)試時,強(qiáng)制程序按照所記錄的日志執(zhí)行,這樣程序就能夠反復(fù)重現(xiàn)之前的執(zhí)行,方便調(diào)試人員調(diào)試。目前,有關(guān)確定性重放技術(shù)的研究工作主要集中在如何低開銷地記錄并行程序的不確定性因素:軟件實(shí)現(xiàn)的確定性重放方法盡量引入較小的運(yùn)行時開銷,硬件實(shí)現(xiàn)的確定性重放方法盡量不影響目前的處理器架構(gòu),且生成的日志文件盡量小。相反地,并行程序在重放執(zhí)行階段的性能往往沒有引起研究者足夠的重視。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述問題,本發(fā)明通過靜態(tài)分析具有全局邏輯序的原日志文件,從中識別出所有具有依賴關(guān)系的訪存日志項(xiàng),并將原日志文件分離為多個線程獨(dú)立的日志文件,各個獨(dú)立日志文件中繼續(xù)維持所有訪存日志項(xiàng)間的依賴關(guān)系。因此,并行程序重放執(zhí)行時各線程僅串行執(zhí)行這些日志項(xiàng),進(jìn)而提高并行程序在重放執(zhí)行階段的性能。
根據(jù)本發(fā)明的一個方面,提出一種基于訪存依賴對的并行重放方法,包括:
靜態(tài)掃描原日志文件,并基于拓?fù)鋱D識別所有訪存依賴對;
根據(jù)所述識別出的訪存依賴對的類型,在拓?fù)鋱D中的合適位置添加條件變量集合;
將原日志文件分散為多個線程獨(dú)立日志文件,當(dāng)并行程序在重放執(zhí)行時,每個線程各自讀取自己的獨(dú)立日志文件來指導(dǎo)重放。
優(yōu)選地,對所述內(nèi)存地址執(zhí)行連續(xù)兩次不同類型的訪問的兩個或多個線程稱為所述訪存依賴對。
優(yōu)選地,訪存依賴對的類型包括讀后寫類型WAR、寫后讀類型RAW以及寫后寫類型WAW。
優(yōu)選地,所述基于拓?fù)鋱D識別所有訪存依賴對為:
步驟1,線性掃描原日志文件,選取與訪存操作相關(guān)的日志項(xiàng)x;若x為空,掃描結(jié)束;否則,執(zhí)行步驟2;
步驟2,遍歷工作隊(duì)列中的日志項(xiàng)α,如果α中的內(nèi)存地址與x中的內(nèi)存地址不一致,則將x添加至工作隊(duì)列隊(duì)尾,并執(zhí)行步驟1;否則,執(zhí)行步驟3;
步驟3,如果α的訪存類型為讀,且x的訪存類型也為讀,則為α與x建立并行關(guān)系,并執(zhí)行步驟1;否則,執(zhí)行步驟4;
步驟4,如果α的訪存類型為讀,且x訪存類型為寫,則標(biāo)識α以及和α具有并行關(guān)系的日志項(xiàng)與x為WAR類型的訪存依賴對,并將α從工作隊(duì)列中移除,將x添加至工作隊(duì)列隊(duì)尾,執(zhí)行步驟1;否則,執(zhí)行步驟5;
步驟5,如果α的訪存類型為寫,且x的訪存類型為讀,則首先判斷α是否與其他日志項(xiàng)建立依賴關(guān)系,如果α已經(jīng)與日志項(xiàng)y存在依賴關(guān)系,則僅為x與y建立并行關(guān)系;如果α沒有與其他日志項(xiàng)建立依賴關(guān)系,則標(biāo)識α與x為RAW類型的訪存依賴對,并將x添加至工作隊(duì)列隊(duì)尾,并執(zhí)行步驟1;否則,執(zhí)行步驟6;以及
步驟6,如果α和x的訪存類型均為寫,將α從工作隊(duì)列中移除,將x添加至工作隊(duì)列隊(duì)尾,并判斷α是否與其他日志項(xiàng)建立依賴關(guān)系,如果α與其他日志項(xiàng)z建立依賴關(guān)系,則標(biāo)識α與z為RAW類型的訪存依賴對,標(biāo)識z與x為WAR類型的訪存依賴對,并將α、z從工作隊(duì)列中移除;否則,標(biāo)識α與x為類型為WAW的訪存依賴對,并執(zhí)行步驟1。
優(yōu)選地,所述工作隊(duì)列暫存每個訪存依賴對中首個執(zhí)行訪存操作的日志項(xiàng)。
優(yōu)選地,根據(jù)所述識別出的訪存依賴對類型,在拓?fù)鋱D中添加條件變量集合包括:當(dāng)所述訪存依賴對類型為WAW時,在所述訪存依賴對的前驅(qū)所對應(yīng)的日志項(xiàng)后添加條件變量的單個喚醒操作,在所述訪存依賴對的后繼所對應(yīng)的日志項(xiàng)之前添加條件變量的單個等待操作。
優(yōu)選地,根據(jù)所述識別出的訪存依賴對類型,在拓?fù)鋱D中添加條件變量集合包括:當(dāng)所述訪存依賴對類型為RAW時,在所述訪存依賴對的前驅(qū)所對應(yīng)的日志項(xiàng)后添加條件變量的廣播式喚醒操作,在訪存依賴對的后繼所對應(yīng)的日志項(xiàng)之前添加條件變量的單個等待操作。
優(yōu)選地,根據(jù)所述識別出的訪存依賴對類型,在拓?fù)鋱D中添加條件變量集合包括:當(dāng)所述訪存依賴對類型為WAR時,在每個訪存依賴對的前驅(qū)所對應(yīng)的日志項(xiàng)后添加多個條件變量的單個喚醒操作,在訪存依賴對的后繼所對應(yīng)的日志項(xiàng)之前添加多個條件變量的單個等待操作。
根據(jù)本發(fā)明的另一方面,提供一種基于訪存依賴對的并行重放裝置,包括:
掃描識別單元,用于靜態(tài)掃描原日志文件,并基于拓?fù)鋱D識別所有訪存依賴對;
程序邏輯重構(gòu)單元,用于在拓?fù)鋱D中的合適位置添加條件變量集合;以及
日志分散單元,用于將所述原日志文件分散為多個線程獨(dú)立日志文件,當(dāng)并行程序在重放執(zhí)行時,每個線程各自讀取自己的日志文件來指導(dǎo)重放。
附圖說明
通過參考下面的附圖,可以更為完整地理解本發(fā)明的示例性實(shí)施方式:
圖1為根據(jù)本發(fā)明優(yōu)選實(shí)施例的基于訪存依賴對的并行重放方法的流程圖;
圖2為根據(jù)本發(fā)明優(yōu)選實(shí)施例的原日志文件和基于拓?fù)鋱D的訪存依賴對識別;
圖3為根據(jù)本發(fā)明優(yōu)選實(shí)施例的添加條件變量集合示意圖和生成線程獨(dú)立日志文件;以及
圖4為根據(jù)本發(fā)明優(yōu)選實(shí)施例的基于訪存依賴對的并行重放裝置的結(jié)構(gòu)圖。
具體實(shí)施方式
現(xiàn)在參考附圖介紹本發(fā)明的示例性實(shí)施方式,然而,本發(fā)明可以用許多不同的形式來實(shí)施,并且不局限于此處描述的實(shí)施例,提供這些實(shí)施例是為了詳盡地且完全地公開本發(fā)明,并且向所屬技術(shù)領(lǐng)域的技術(shù)人員充分傳達(dá)本發(fā)明的范圍。對于表示在附圖中的示例性實(shí)施方式中的術(shù)語并不是對本發(fā)明的限定。在附圖中,相同的單元/元件使用相同的附圖標(biāo)記。
除非另有說明,此處使用的術(shù)語包括科技術(shù)語對所屬技術(shù)領(lǐng)域的技術(shù)人員具有通常的理解含義。另外,可以理解的是,以通常使用的詞典限定的術(shù)語,應(yīng)當(dāng)被理解為與其相關(guān)領(lǐng)域的語境具有一致的含義,而不應(yīng)該被理解為理想化的或過于正式的意義。
圖1為根據(jù)本發(fā)明優(yōu)選實(shí)施例的基于訪存依賴對的并行重放方法的流程圖。如圖1所示,基于訪存依賴對的并行重放方法100從步驟101開始。在步驟101中,先靜態(tài)掃描原日志文件,并基于拓?fù)鋱D識別出所有訪存依賴對。應(yīng)當(dāng)了解的是,對于某個內(nèi)存地址,對所述內(nèi)存地址執(zhí)行連續(xù)兩次不同類型的訪問的兩個或多個線程稱為所述訪存依賴對。訪存依賴對的類型分為讀后寫類型WAR、寫后讀類型RAW以及寫后寫類型WAW。其中,W表示W(wǎng)rite,即寫操作;A表示After;R表示Read,即讀操作,例如WAR表示為Write After Read,即先讀后寫。
優(yōu)選地,所述基于拓?fù)鋱D識別所有訪存依賴對為:
步驟1,線性掃描原日志文件,選取與訪存操作相關(guān)的日志項(xiàng)x,如果x為空,則說明日志文件掃描結(jié)束,返回;否則,執(zhí)行步驟2;
步驟2,遍歷工作隊(duì)列中的元素α,其中所述工作隊(duì)列暫存每個訪存依賴對的首個執(zhí)行訪存操作的日志項(xiàng),如果α中的內(nèi)存地址與x中的內(nèi)存地址不一致,則將x添加至工作隊(duì)列,并再次執(zhí)行步驟1重新掃描日志文件獲得新的日志項(xiàng);否則,繼續(xù)執(zhí)行步驟3;
步驟3,如果α的訪存類型為讀,且x的訪存類型也為讀,則說明α所在的訪存依賴對類型為WAR,因此α和x兩個讀線程之間是并行關(guān)系,則為α與x建立并行關(guān)系,并再次執(zhí)行步驟1重新掃描日志文件獲得新的日志項(xiàng)x;否則,執(zhí)行步驟4;
步驟4:如果α的訪存類型為讀,且x訪存類型為寫,則標(biāo)識α以及其他與α具有并行關(guān)系的日志項(xiàng)與x為WAR類型的依賴對,將α從工作隊(duì)列中移除,將x添加至工作隊(duì)列,并再次執(zhí)行步驟1重新掃描日志文件獲得新的日志項(xiàng)x;否則,執(zhí)行步驟5;
步驟5,如果α的訪存類型為寫,且x的訪存類型為讀,則說明α所在的依賴對類型為RAW。首先判斷α是否與其他日志項(xiàng)建立依賴關(guān)系,如果已經(jīng)與日志項(xiàng)y建立依賴關(guān)系,則表示x也是多個讀線程中的一員,因此僅為x與α的依賴關(guān)系對象y建立并行關(guān)系;否則為α與x建立RAW依賴關(guān)系,并將x添加至工作隊(duì)列,并再次執(zhí)行步驟1重新掃描日志文件獲得新的日志項(xiàng)x;否則,執(zhí)行步驟6;
步驟6,如果α的訪存類型為寫,且x的訪存類型為寫,首先將α從工作隊(duì)列中移除,將x添加至工作隊(duì)列,并判斷α是否與其他日志項(xiàng)建立依賴關(guān)系,如果已經(jīng)與日志項(xiàng)z建立依賴關(guān)系,則標(biāo)識α與z為RAW類型的訪存依賴對,標(biāo)識z與x為WAR類型的訪存依賴對,并將α、z均從工作隊(duì)列中刪除;否則,標(biāo)識α與x為WAW類型的訪存依賴對,并執(zhí)行步驟1。
基于上述步驟,為原日志文件建立拓?fù)鋱D,并識別出所有的訪存依賴對,如圖2(a)中顯示的是原日志文件的片段,根據(jù)上述步驟得到拓?fù)鋱D如圖2(b)所示。應(yīng)當(dāng)了解的是,基于拓?fù)鋱D識別所有訪存依賴對時,步驟3至步驟6的順序不固定,所述4個步驟實(shí)質(zhì)上是對α和x的可能出現(xiàn)的四種訪存類型進(jìn)行描述。在實(shí)際應(yīng)用中,不必一定按照從步驟3依次至步驟6的順序。
優(yōu)選地,所述訪存依賴對為對于某個內(nèi)存地址執(zhí)行連續(xù)兩次不同類型的訪問的兩個或多個線程。
在上述圖2(b)中添加條件變量集合來重構(gòu)程序邏輯,應(yīng)當(dāng)了解的是,訪存依賴對的后繼必須在訪存依賴對的前驅(qū)執(zhí)行之后才能執(zhí)行,以此來維持原訪存日志項(xiàng)間的必需依賴關(guān)系。根據(jù)所述識別的三種不同類型的訪存依賴對,分別添加條件變量集合。
優(yōu)選地,當(dāng)所述訪存依賴對類型為WAW時,所述訪存依賴對只存在一個前驅(qū)和一個后繼。所以對于同一個內(nèi)存地址P,當(dāng)某個線程執(zhí)行完寫操作后,其他線程才能寫訪問該地址。如圖3(a)中實(shí)線箭頭④所表示的關(guān)系,采用單個一對一的等待-喚醒模式。在訪存依賴對前驅(qū)所對應(yīng)的日志項(xiàng)后添加條件變量單個喚醒操作,例如cond_signal,在圖3(b)中表示為Cwake_S,在訪存依賴對后繼所對應(yīng)的日志項(xiàng)之前添加條件變量單個等待操作,例如cond_wait,在圖3(b)中表示為Cwait。
優(yōu)選地,當(dāng)所述訪存依賴對類型為RAW時,所述訪存依賴對存在一個前驅(qū)和多個后繼,且各個后繼之間并沒有任何依賴關(guān)系。對于同一個共享內(nèi)存地址P,當(dāng)某個線程執(zhí)行完寫操作后,其他多個線程才能并行地讀訪問該地址,如圖3(a)中實(shí)線箭頭⑤、⑥所表示的關(guān)系。因此采用單個一對多的廣播式等待-喚醒模式。在訪存依賴對前驅(qū)所對應(yīng)的日志項(xiàng)后添加條件變量廣播式喚醒操作,例如cond_broadcast,在圖3(b)中表示為Cwake_B,在訪存依賴對后繼所對應(yīng)的日志項(xiàng)之前添加條件變量單個等待操作,例如cond_wait,在圖3(b)中表示為Cwait。
優(yōu)選地,當(dāng)所述訪存依賴對類型為WAR時,所述訪存依賴對存在多個前驅(qū)和一個后繼,并且各個前驅(qū)之間并沒有任何依賴關(guān)系。對于同一個共享內(nèi)存地址P,當(dāng)多個線程執(zhí)行完讀操作以后,其他線程才能寫訪問該地址。如圖3(a)中箭頭①、②、③所表示的關(guān)系。因此采用多個一對一的等待-喚醒模式。在每個訪存依賴對前驅(qū)所對應(yīng)的日志項(xiàng)后均添加條件變量單個喚醒操作,例如cond_signal,在圖3(b)中表示為Cwake_S,在訪存依賴對后繼所對應(yīng)的日志項(xiàng)之前添加多個條件變量單個等待操作,例如cond_wait,在圖3(b)中表示為Cwait。
優(yōu)選地,根據(jù)添加條件變量集合后的拓?fù)鋱D,生成線程獨(dú)立日志文件。每個線程均有對應(yīng)的獨(dú)立日志文件。在重放執(zhí)行階段,所述線程獨(dú)立日志文件指導(dǎo)對應(yīng)的線程進(jìn)行重放。
圖4為根據(jù)本發(fā)明優(yōu)選實(shí)施例的基于訪存依賴對的并行重放裝置的結(jié)構(gòu)圖。如圖4所示,基于訪存依賴對的并行重放裝置400包括掃描識別單元401、程序邏輯重構(gòu)單元402、日志分散單元403。
優(yōu)選地,所述掃描識別單元401用于靜態(tài)掃描原日志文件,并基于拓?fù)鋱D識別所有訪存依賴對。
優(yōu)選地,所述程序邏輯重構(gòu)單元402用于在拓?fù)鋱D中合適的位置處添加條件變量集合。
優(yōu)選地,所述日志分散單元403用于將所述原日志文件分散為多個線程獨(dú)立日志文件,當(dāng)并行程序重放執(zhí)行時,每個線程各自讀取自己的獨(dú)立日志文件來指導(dǎo)重放。
已經(jīng)通過參考少量實(shí)施方式描述了本發(fā)明。然而,本領(lǐng)域技術(shù)人員所公知的,正如附帶的專利權(quán)利要求所限定的,除了本發(fā)明以上公開的其他的實(shí)施例等同地落在本發(fā)明的范圍內(nèi)。
通常地,在權(quán)利要求中使用的所有術(shù)語都根據(jù)他們在技術(shù)領(lǐng)域的通常含義被解釋,除非在其中被另外明確地定義。所有的參考“一個/所述/該[裝置、組件等]”都被開放地解釋為所述裝置、組件等中的至少一個實(shí)例,除非另外明確地說明。這里公開的任何方法的步驟都沒必要以公開的準(zhǔn)確的順序運(yùn)行,除非明確地說明。