專利名稱:編譯裝置、編譯程序及循環(huán)并列化方法
技術(shù)領(lǐng)域:
本發(fā)明涉及從逐次形式的源程序生成被并列化的目標(biāo)程序的編譯技術(shù)及循環(huán)并列化方法。
背景技術(shù):
并列處理對在多處理器中執(zhí)行目標(biāo)程序后有效運用各個處理器來提高執(zhí)行性能發(fā)揮著重要作用。作為生成被并列化的目標(biāo)程序的方法,已經(jīng)知道有將循環(huán)處理按照被反復(fù)的處理的單位(下面稱為迭代(Iteration))分割為多個子循環(huán)處理使并列化的方法。在過去的循環(huán)并列化方法中,也有以不存在數(shù)據(jù)依存的循環(huán)為對象進(jìn)行并列化(下面稱為DOALL型變換)的方法(例如參照非專利文獻(xiàn)I)。其中,數(shù)據(jù)依存是指某個命令B在另一個命令A(yù)未完成之前不能執(zhí)行的關(guān)系,其原因在于變量a (例如,命令A(yù)代入變量a,命令B參照變量a),將該情況表現(xiàn)為“對于變量a存在數(shù)據(jù)依存”。DOALL型變換例如是指如圖9(a)所示的以不存在數(shù)據(jù)依存的循環(huán)為對象的變換。當(dāng)在存在于循環(huán)內(nèi)的數(shù)據(jù)依存中上述的命令A(yù)和命令B屬于不同的迭代的情況下,在命令A(yù)所屬的迭代與命令B所屬的迭代之間存在依存關(guān)系。這樣當(dāng)在兩個以上的迭代之間存在數(shù)據(jù)依存的情況·下,將不能直接適用DOALL型變換,因而循環(huán)處理的并列化比較困難。存在于迭代之間的數(shù)據(jù)依存包括:在于被實施值的代入的迭代之后執(zhí)行的另一個迭代中進(jìn)行值的參照的數(shù)據(jù)依存(下面,稱為循環(huán)搬運依存);在于參照值的迭代之后執(zhí)行的另一個迭代中代入值的數(shù)據(jù)依存(下面,稱為參照先行依存);以及在于代入值的迭代之后執(zhí)行的另一個迭代中代入值的數(shù)據(jù)依存(下面,稱為輸出依存)。使用圖9說明存在于迭代之間的數(shù)據(jù)依存的具體示例和并列化時的問題。圖9
(b)所示的變量a存在循環(huán)搬運依存。在循環(huán)被逐次執(zhí)行的情況下,在執(zhí)行i = k+1的迭代時,變量a參照i = k的迭代的執(zhí)行結(jié)果即a = x[k]。另一方面,在以迭代單位將循環(huán)分割并進(jìn)行并列化的情況下,各個迭代的執(zhí)行順序與逐次處理循環(huán)時不同,因而不能說在執(zhí)行y[k+l] = a*b時變量a的值是x[k]。因此,產(chǎn)生變量y [k+1]的值不能與逐次處理循環(huán)后的結(jié)果相同的問題。另外,圖9 (C)所示的數(shù)組c是參照先行依存的示例,在執(zhí)行循環(huán)之前值被代入c[2] c[101]。在以迭代單位將循環(huán)分割并進(jìn)行并列化的情況下,各個迭代的執(zhí)行順序與逐次處理循環(huán)時不同,因而有時會先于i = k的迭代而執(zhí)行i = k+1的迭代。此時,在執(zhí)行i =k的迭代時,i =k+l的迭代的結(jié)果被代入c [k+1],因而產(chǎn)生z [k]的值不能與逐次處理循環(huán)時相同的問題。另外,圖9 Cd)所示的數(shù)組g表示輸出依存變量。在以迭代單位將循環(huán)分割并進(jìn)行并列化的情況下,各個迭代的執(zhí)行順序與逐次處理循環(huán)時不同,因而有時會先于i = k的迭代而執(zhí)行i = k+1的迭代。此時,i = k的迭代將g[k+l]的值覆蓋,因而產(chǎn)生g[k+l]的值不能與逐次處理循環(huán)時相同的問題。
在專利文獻(xiàn)I中公開了將存在數(shù)據(jù)依存的循環(huán)并列化的現(xiàn)行方法。圖10表示在專利文獻(xiàn)I中記載的編譯裝置。編譯裝置800是將FORTRAN語言等的逐次型的源程序700作為輸入,并輸出并列型的目標(biāo)程序900的裝置,循環(huán)并列化變換部820對于能夠進(jìn)行DOALL型變換的循環(huán),由DOALL型變換部821進(jìn)行并列化,對于能夠進(jìn)行流水線(pipeline)型的并列化的循環(huán),由D0ACR0SS型變換部822進(jìn)行流水線化(下面稱為D0ACR0SS型變換),該流水線化是通過插入使在多重循環(huán)中執(zhí)行處理器之間的同步的語句而實現(xiàn)的。另外,在專利文獻(xiàn)2中公開了其它的現(xiàn)行示例。在專利文獻(xiàn)2的編譯裝置中,在循環(huán)存在參照先行依存的情況下,對于參照先行依存變量,以在該變量被使用之前不會將值代入并使得值變化的方式,預(yù)先將參照先行依存變量的值存儲為臨時變量,對于參照先行依存變量被參照的式子,將參照先行依存變量置換為臨時變量,由此解決參照先行依存來進(jìn)行循環(huán)的并列化處理。現(xiàn)有技術(shù)文獻(xiàn)專利文獻(xiàn)專利文獻(xiàn)1:日本特開2005 - 327320號公報專利文獻(xiàn)2:日本特開2010 - 191506號公報非專利文獻(xiàn)非專利文獻(xiàn)1:A.V.工 、M.S.9 A、R.七 '> 4、J.D.^ > 共著原田賢一訳「- > 9「第2版」-原理 技法 一卟一」寸4工> 5社出版、2009年5月25日(P790-P793)
發(fā)明概要
發(fā)明要解決的問題但是,在專利文獻(xiàn)I的編譯裝置中,當(dāng)判定為在循環(huán)處理中存在循環(huán)搬運依存時,不能實現(xiàn)基于DOALL型變換的并列化,如果不進(jìn)行D0ACR0SS型變換就不能實現(xiàn)并列化。并且,在通過D0ACR0SS型變換來進(jìn)行并列化的情況下,對于存在循環(huán)搬運依存的迭代,使用同步命令來維持各個迭代的執(zhí)行順序,因而不能并列地執(zhí)行處于循環(huán)搬運依存的關(guān)系的依存源迭代和依存者迭代。另一方面,在專利文獻(xiàn)2的編譯裝置中,在存在表示在于參照值的迭代之后執(zhí)行的另一個迭代中代入值的參照先行依存的循環(huán)中,預(yù)先將參照先行依存變量的值復(fù)制為臨時變量的值,將參照值的迭代中的參照先行依存變量置換為該臨時變量,由此即使是通過代入值的迭代使得參照先行依存變量的值被覆蓋時,參照值的迭代也能夠從臨時變量得到循環(huán)執(zhí)行前的參照先行依存變量的值。但是,在存在循環(huán)搬運依存的循環(huán)中,參照值的迭代所需要的循環(huán)搬運依存變量的值,是代入值的迭代存儲于該循環(huán)搬運依存變量中的值,不是循環(huán)開始以前的循環(huán)搬運依存變量的值,因而在專利文獻(xiàn)2的技術(shù)中不能解決循環(huán)搬運依存。
發(fā)明內(nèi)容
本發(fā)明正是為了解決上述問題而提出的,其目的在于,提供對于存在循環(huán)搬運依存的循環(huán)能夠?qū)崿F(xiàn)并列化的編譯裝置、編譯程序、以及循環(huán)并列化方法。 用于解決問題的手段
為了解決上述過去的問題,本發(fā)明的編譯裝置從逐次型的源程序生成并列型的目標(biāo)程序,其特征在于,該編譯裝置具有:數(shù)據(jù)依存分析部,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量;循環(huán)并列化判定部,對于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及初始值計算代碼追加部,對于所述循環(huán)并列化判定部判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行。并且,本發(fā)明的編譯程序用于從逐次型的源程序生成并列型的目標(biāo)程序,其特征在于,該編譯程序具有:數(shù)據(jù)依存分析步驟,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量;循環(huán)并列化判定步驟,對于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及初始值計算代碼追加步驟,對于所述循環(huán)并列化判定步驟判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行。并且,本發(fā)明的計算機可讀的記錄介質(zhì)記錄了編譯程序,用于從逐次型的源程序生成并列型的目標(biāo)程序,其特征在于,該記錄介質(zhì)記錄了使以下步驟執(zhí)行的程序:數(shù)據(jù)依存分析步驟,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量;循環(huán)并列化判定步驟,對 于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及初始值計算代碼追加步驟,對于所述循環(huán)并列化判定步驟判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行。并且,本發(fā)明的循環(huán)并列化方法用于從逐次型的源程序生成并列型的目標(biāo)程序,其特征在于,該循環(huán)并列化方法包括:數(shù)據(jù)依存分析步驟,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量;循環(huán)并列化判定步驟,對于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及初始值計算代碼追加步驟,對于所述循環(huán)并列化判定步驟判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行。發(fā)明效果根據(jù)上述的這些結(jié)構(gòu),在不需從第一個開始逐次處理循環(huán)即可計算所有迭代中的循環(huán)搬運依存變量的值的情況下,將循環(huán)分割為多個子循環(huán),并追加用于計算子循環(huán)的第一個迭代中的循環(huán)搬運依存變量的值的初始值計算代碼,由此能夠?qū)⒀h(huán)進(jìn)行分割來并列執(zhí)行,而且不會對運算結(jié)果產(chǎn)生影響。
圖1是本發(fā)明的實施方式的編譯裝置的結(jié)構(gòu)圖。圖2是表示本發(fā)明的實施方式的循環(huán)并列化變換部的流程的圖。圖3是表示本發(fā)明的實施方式的循環(huán)并列化變換部的循環(huán)并列化判定的流程的圖。圖4是表示本發(fā)明的實施方式的初始值計算代碼追加型變換的流程的圖。圖5是表示本發(fā)明的實施方式的源程序和目標(biāo)程序的圖。圖6是表示本發(fā)明的實施方式的循環(huán)并列化判定的執(zhí)行示例的圖。圖7是表示本發(fā)明的實施方式的初始值計算代碼追加型變換的實施例的圖。圖8是表示本發(fā)明的實施方式的循環(huán)并列化判定的實施例的圖。圖9是表示數(shù)據(jù) 依存關(guān)系的圖。圖10是過去的編譯裝置的結(jié)構(gòu)圖。
具體實施例方式下面,參照
本發(fā)明的實施方式I。< 結(jié)構(gòu) >圖1是表示執(zhí)行本發(fā)明的實施方式的循環(huán)并列化方法的編譯裝置200的結(jié)構(gòu)圖。編譯裝置200輸入C語言等的逐次型的源程序100,以O(shè)penMPC語言等的并列型的目標(biāo)程序300為輸出。編譯裝置200具有數(shù)據(jù)依存分析部210和循環(huán)并列化變換部220。數(shù)據(jù)依存分析部210對于包含于源程序100中的循環(huán)分析是否存在循環(huán)搬運依存變量。循環(huán)搬運依存變量如前面所述,是指在于代入值的迭代之后執(zhí)行的另一個迭代中所代入的值被參照的變量。在此,著眼于包含循環(huán)搬運依存變量的循環(huán)中的一個迭代,循環(huán)搬運依存變量也可以說是在于同一迭代中值被參照之后實施值的代入的變量,因而通過判定是否是這種變量,能夠分析是否是循環(huán)搬運依存變量。這是因為被代入的值在下一個迭代中進(jìn)行值的代入之前不會被更新,其值將在下一個迭代中被參照,而不是在該迭代中。循環(huán)并列化變換部220按照每個循環(huán)從數(shù)據(jù)依存分析部210接收是否包含循環(huán)搬運依存變量的分析結(jié)果,針對包含于源程序100中的所有循環(huán),判定循環(huán)是否能夠以迭代單位進(jìn)行并列化,對于被判定為能夠并列化的循環(huán),按照可并列化方法進(jìn)行循環(huán)的變換,并生成目標(biāo)程序300。該循環(huán)并列化變換部220具有DOALL型變換部221、初始值計算代碼追加部222、D0ACR0SS型變換部223,這些各個部分進(jìn)行循環(huán)的變換。
DOALL型變換部221具有與專利文獻(xiàn)2的DOALL型變換部821相同的功能,循環(huán)并列化變換部220對于判定為能夠進(jìn)行基于DOALL型變換的并列化的循環(huán),按照過去的并列化方法進(jìn)行循環(huán)的并列化。初始值計算代碼追加部222對于由循環(huán)并列化變換部220判定為能夠進(jìn)行基于初始值計算代碼追加型變換的并列化的循環(huán),通過初始值計算代碼追加型變換進(jìn)行循環(huán)的并列化。關(guān)于初始值計算代碼追加型變換的詳細(xì)情況將在后面進(jìn)行說明。D0ACR0SS型變換部223具有與D0ACR0SS型變換部822相同的功能,循環(huán)并列化變換部220進(jìn)行被判定為能夠進(jìn)行基于D0ACR0SS型變換的并列化的循環(huán)的流水線化。〈動作〉根據(jù)以上的結(jié)構(gòu)來說明本發(fā)明的實施方式的編譯裝置200的動作。( I)循環(huán)并列化變換的概況圖2是表示本發(fā)明的實施方式的循環(huán)并列化變換部220的流程的圖。參照圖2所示的流程來說明循環(huán)并列化變換部220的處理動作。循環(huán)并列化·變換部220對于源程序100內(nèi)的所有循環(huán)進(jìn)行如下的循環(huán)并列化判定:是否是能夠進(jìn)行DOALL型變換的循環(huán)、是否能夠進(jìn)行初始值計算代碼追加型變換、是否是能夠進(jìn)行D0ACR0SS型變換的循環(huán)。循環(huán)并列化變換部220按照每個循環(huán)從數(shù)據(jù)依存分析部210接收是否包含循環(huán)搬運依存變量的分析結(jié)果,并判定是否能夠適用DOALL型變換(S10),在能夠適用DOALL型變換的情況下,DOALL型變換部221執(zhí)行DOALL型變換(SII)。另外,SlO中的循環(huán)并列化變換部220的動作與循環(huán)并列化變換部820相同,Sll中的DOALL型變換部221的動作與DOALL型變換部821相同。在判定為不能適用DOALL型變換的情況下(S10:否),循環(huán)并列化變換部220判定是否能夠適用初始值計算代碼追加型變換(S20),在能夠適用初始值計算代碼追加型變換的情況下,由初始值計算代碼追加部222執(zhí)行初始值計算代碼追加型變換(S21)。在此,能夠進(jìn)行初始值計算代碼追加型變換的循環(huán),是指不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán)。關(guān)于能否進(jìn)行初始值計算代碼追加型變換的判定(S20 )及變換(S21)的詳細(xì)情況將在后面進(jìn)行說明。在判定為不能適用初始值計算代碼追加型變換的情況下(S20:否),循環(huán)并列化變換部220判定是否能夠適用D0ACR0SS型變換(S30),在能夠適用D0ACR0SS型變換的情況下,由D0ACR0SS型變換部223執(zhí)行D0ACR0SS型變換(S31)。另外,S30中的循環(huán)并列化變換部220的動作與循環(huán)并列化變換部820相同,S31中的D0ACR0SS型變換部223的動作與D0ACR0SS型變換部822相同。在S30,在判定為不能適用D0ACR0SS型變換的情況下,不進(jìn)行并列化,而在SlO對源程序100內(nèi)的下一個循環(huán)進(jìn)行處理。另外,不能并列化的循環(huán)將被逐次執(zhí)行。(2)循環(huán)并列化判定圖3是表示本發(fā)明的實施方式的步驟S20的循環(huán)并列化變換部220的流程的圖。參照圖3所示的流程來說明S20的關(guān)于初始值計算代碼追加型變換的適用判定的處理動作。循環(huán)并列化變換部220從數(shù)據(jù)依存分析部210接收是否存在循環(huán)搬運依存的分析結(jié)果,并生成包含于循環(huán)中的變量中、不是循環(huán)搬運依存變量的變量的列表(S110)。這些變量不是循環(huán)搬運依存變量,因而不依存于循環(huán)內(nèi)的各個迭代的執(zhí)行結(jié)果,即使不逐次執(zhí)行循環(huán),也能夠計算出各個迭代中的值。下面,將這樣能夠計算出所有迭代中的值的變量稱為可計算變量,其列表是可計算變量的列表。循環(huán)并列化變換部220將左邊值具有列表中沒有的變量的式子中、右邊值中所包含的變量全部位于列表中的式子的左邊值追加在列表中(S120)。所追加的循環(huán)搬運依存變量是僅依存于可計算變量的變量,因而屬于能夠根據(jù)僅包含可計算變量的導(dǎo)出式在所有迭代中計算出值的可計算變量。然后,循環(huán)并列化變換部220確認(rèn)在S120是否存在被追加在列表中的變量(S130)。在不存在所追加的變量的情況下,判定為不能適用初始值計算代碼追加型變換(S140),通過S140確定S20的判定為否。關(guān)于詳細(xì)說明將在后面敘述。循環(huán)并列化變換部220對于該循環(huán)進(jìn)行是否能夠適用D0ACR0SS型變換的判定(S30)。在S120,當(dāng)存在被追加在列表中的變量的情況下,循環(huán)并列化變換部220確認(rèn)在列表中是否全部列舉了循環(huán)內(nèi)的循環(huán)搬運依存變量(S150)。當(dāng)在列表中列舉了全部循環(huán)搬運依存變量的情況下,循環(huán)并列化變換部220判定為能夠適用初始值計算代碼追加型變換(S150),通過S150確定S20的判定為是。在這種情況下,由于全部循環(huán)搬運依存變量是可計算變量,因而即使不逐次執(zhí)行循環(huán),也能夠在所有的迭代中計算出循環(huán)搬運依存變量的值。由此,初始值計算代碼追加部222進(jìn)行該循環(huán)的變換(S21)。在S150,當(dāng)在列表中沒有列舉出全部循環(huán)搬運依存變量的情況下,再次從S120開始執(zhí)行流程,以便判定未被列舉的循環(huán)搬運依存變量是否是依存于被新追加在列表中的可計算變量的變量。當(dāng)在循環(huán)中包含不屬于可計算變量的循環(huán)搬運依存變量的情況下,在可計算變量被全部列舉在列表中的時刻,由于不屬于可計算變量的循環(huán)搬運依存變量未被列舉在列表中,因而在S150判定為 是,然后在再次實施的S120,由于不存在被新追加在列表中的可計算變量,因而在S130判定為否,如上所述判定為不能適用初始值計算代碼追加型變換。(3)初始值計算代碼追加型變換圖4是表示本發(fā)明的實施方式的初始值計算代碼追加部222的動作S21的流程的圖。參照圖4所示的流程來說明S21的初始值計算代碼追加型變換的處理動作。初始值計算代碼追加部222將分割前的循環(huán)的歸納變量(induction variable)的初始值記錄為變量P,將在迭代結(jié)束后執(zhí)行下一個迭代時的循環(huán)歸納變量的變化值記錄為變量s (S210)。初始值計算代碼追加部222在將由M個迭代構(gòu)成的循環(huán)分配給N個處理器的情況下,按照(M/N)個迭代分別進(jìn)行分割,并分配給各個處理器。針對分割后的所有子循環(huán),使用循環(huán)搬運依存變量因每個子循環(huán)而不同的變量進(jìn)行私有化(privatized),并變換為對于每個處理器使用獨立的區(qū)域的變量,輸出給目標(biāo)程序300 (S220)。初始值計算代碼追加部222對于在S220進(jìn)行分割得到的所有子循環(huán)執(zhí)行S231 S237。初始值計算代碼追加部222將分割后的子循環(huán)的歸納變量的初始值記錄為變量q(S231)。
初始值計算代碼追加部222基于來自數(shù)據(jù)依存分析部210的信息生成循環(huán)搬運依存變量的列表(S232)。該列表成為沒有計算出子循環(huán)的第一個迭代中的值的循環(huán)搬運依存變量的列表。 初始值計算代碼追加部222將變量p與變量q及變量s之和進(jìn)行比較(S233),在q小于P + s的情況下,將代入在對位于列表中的變量進(jìn)行私有化之前的變量的值的導(dǎo)出式,作為初始值計算代碼,追加在目標(biāo)程序300中(S237)。這是因為歸納變量q的迭代中的循環(huán)搬運依存變量不依存于分割前的循環(huán)中的歸納變量q — s的迭代(這種歸納變量的值小于P的迭代不在原來的循環(huán)中),而是依存于歸納變量P的迭代執(zhí)行前的值即循環(huán)執(zhí)行前的初始值。另外,在將初始值計算代碼追加在目標(biāo)程序300中時,以在對應(yīng)的子循環(huán)之前來執(zhí)行的方式進(jìn)行追加。并且,在與相同子循環(huán)對應(yīng)的初始值計算代碼已經(jīng)被追加在目標(biāo)程序300中的情況下,以先于已有的初始值計算代碼來執(zhí)行的方式進(jìn)行追加。但是,以在對被私有化之前的變量代入值的代碼之后執(zhí)行初始值計算代碼的方式來構(gòu)成目標(biāo)程序300。在S233,在q為p + s以上的情況下,初始值計算代碼追加部222對變量q代入q - s,將以列表中的變量為左邊值的循環(huán)內(nèi)的式子作為初始值計算代碼進(jìn)行追加(S234)。此時,在追加的式子中使用的歸納變量的值采用變量q的值。初始值計算代碼追加部222生成在S234所追加的初始值計算代碼的式子的右邊值的變量中、循環(huán)搬運依存變量的列表,并用新生成的列表覆蓋在S232或者前次的S235生成的列表(S235)。初始值計算代碼追加部222確認(rèn)在通過S235所生成的列表中是否存在變量,在存在變量的情況下,從S233開始再次執(zhí)行流程。在列表中不存在變量的情況下,結(jié)束該子循環(huán)的變換,針對在S220生成的沒有追加初始值計算代碼的其它的分割子循環(huán),從S231開始進(jìn)行初始值計算代碼追加型變換(S236 )。<程序的變換示例>圖5是表示本發(fā)明的實施方式的進(jìn)行初始值計算代碼追加型變換前后的程序示例的圖。參照圖5所示的程序來說明本發(fā)明的編譯裝置200的動作。程序400是表示在源程序100中記述的循環(huán)的示例,是用C語言記述的for循環(huán)。該for循環(huán)由100個迭代構(gòu)成,關(guān)于變量a和變量b存在循環(huán)搬運依存,對于成為變量b的導(dǎo)出式的右邊值的變量X不存在循環(huán)搬運依存。在本實施方式中,假設(shè)使用兩個處理器并列執(zhí)行程序400所表示的循環(huán)。數(shù)據(jù)依存分析部210檢測到變量a和變量b是循環(huán)搬運依存變量。由于變量a和變量b是循環(huán)搬運依存變量,因而循環(huán)并列化變換部220判定不能對程序400的循環(huán)進(jìn)行DOALL 型變換(SlO)。然后,循環(huán)并列化變換部220判定是否能夠?qū)Τ绦?00的循環(huán)適用初始值計算代碼追加型變換(S20)。下面示出其詳細(xì)情況。(I)循環(huán)并列化判定圖6是表示針對程序400的循環(huán)并列化判定的執(zhí)行示例的圖。
程序500是利用箭頭來表示程序400中的循環(huán)搬運依存的程序。循環(huán)并列化變換部220生成以程序400的循環(huán)中不存在循環(huán)搬運依存的變量x為要素的列表501 (SllO)0循環(huán)并列化變換部220將左邊值具有列表中沒有的變量的式子L403和式子L404中、右邊值中所包含的變量全部位于列表501中的式子L404的左邊值即變量b追加在列表中,并生成列表511 (S120)。由于變量b在SllO被追加在列表511中,因而循環(huán)并列化變換部220在S130判定為是,并執(zhí)行S150。循環(huán)并列化變換部220判定在程序400中是否存在列表511中未列舉出的循環(huán)搬運依存變量(S150)。如程序510所示,在程序400中針對式子L403到式子L402存在基于變量a的循環(huán)搬運依存(變量a是循環(huán)搬運依存變量),循環(huán)并列化變換部220再次執(zhí)行S120。另外,基于被追加在列表中的變量的循環(huán)搬運依存用虛線箭頭示出。由于左邊值具有列表中沒有的變量的式子L403的右邊值中所包含的變量全部位于列表501中,因而循環(huán)并列化變換部220將L403的左邊值即變量a追加在列表中,并生成列表 521 (S120)。由于變量a在S120被追加在列表521中,因而循環(huán)并列化變換部220在S130判定為是,并執(zhí)行S150。在S150,由于在程序400中不存在列表521中沒有的循環(huán)搬運依存變量,因而循環(huán)并列化變換部220在S160判定為能夠適用初始值計算代碼追加型變換。通過以上動作,程序400的循環(huán)被判定為能夠適用初始值計算代碼追加型變換(S20),因而初始值計算代碼追加部222對該循環(huán)進(jìn)行變換使并列化(S21)。詳細(xì)情況如下所示。(2)初始值計算代碼追加型變換
圖7是表示程序400的循環(huán)的初始值計算代碼追加型變換的執(zhí)行示例的圖。初始值計算代碼追加部222將程序400的循環(huán)的歸納變量i的初始值I代入變量P,將循環(huán)的歸納變量i的變化值I (執(zhí)行I次i ++后的i的變化量)代入變量s (S210)。初始值計算代碼追加部222使用兩個處理器來執(zhí)行程序400,因而將循環(huán)分割為兩個,對循環(huán)搬運依存變量a和b進(jìn)行私有化(S220 )。將其結(jié)果表示為程序600和程序650。在程序600中,將變量a、b分別變更為變量a_l、b_l,在程序650中,將變量a、b分別變更為變量a_2、b_2。針對程序600和程序650雙方執(zhí)行S231 S237。首先,說明關(guān)于程序600的變換。初始值計算代碼追加部222將子循環(huán)的歸納變量i的初始值I代入變量q(S231)。初始值計算代碼追加部222生成以循環(huán)搬運依存變量a_l和b_l為要素的列表601 (S232)。初始值計算代碼追加部222將變量p與變量q及變量s之和進(jìn)行比較(S233)。此時,9=1、? = 1、8=1,9 小于 p + s,因而執(zhí)行 S237。初始值計算代碼追加部222針對位于列表601中的已被私有化的循環(huán)搬運依存變量a_l和b_l,將代入被私有化之前的變量a和b的式子L591和L592追加在程序600的前頭(S227)。變換后的程序如程序610所示。下面,說明關(guān)于程序650的變換。
初始值計算代碼追加部222將子循環(huán)的歸納變量i的初始值51代入變量q(S231)。初始值計算代碼追加部222生成以循環(huán)搬運依存變量a_2和b_2為要素的列表651 (S232)。初始值計算代碼追加部222將變量p與變量q及變量s之和進(jìn)行比較(S233)。此時,q = 51、p = 1、S = l,q為p + s以上,因而執(zhí)行S234。初始值計算代碼追加部222對變量q代入q — s的值即50,將以列表611中的變量a_2和變量b_2為左邊值的式子L703和式子L704作為式子L691和式子L692追加在程序610的前頭(S234)。此時,對歸納變量i代入變量q的值(q = 50)。追加了初始值計算代碼的程序如程序660所示。初始值計算代碼追加部222生成以所追加的式子691和式子692的右邊值中所包含的循環(huán)搬運依存變量1^_2為要素的列表661,并覆蓋列表651 (S235)。在S236,由于列表661不是空的列表,因而初始值計算代碼追加部222執(zhí)行S233。在S233,q = 50、p = l、s = 1,q為p + s以上,因而初始值計算代碼追加部222執(zhí)行S234。初始值計算代·碼追加部222對變量q代入49,針對以列表631中的變量b_2為左邊值的式子L704,將對歸納變量i代入變量q的值(q = 49)后的式子681追加在程序630的初始值計算代碼的前頭(S234)。在初始值計算代碼的前頭追加了式子L681的程序如程序670所示。由于所追加的式子681的右邊值中沒有循環(huán)搬運依存變量,因而初始值計算代碼追加部222生成空的列表671,并覆蓋列表661 (S235)。由于列表671是空的,因而初始值計算代碼追加部222結(jié)束初始值計算代碼追加型變換(S236)。通過以上動作,循環(huán)并列化變換部220生成如圖5所示的子循環(huán)412和422。子循環(huán)412和子循環(huán)422是將程序400所示的循環(huán)進(jìn)行分割得到的子循環(huán),將由100個迭代構(gòu)成的for循環(huán)分割為第I次 第50次的迭代和第51次 第100次的迭代。編譯裝置200生成將子循環(huán)412和子循環(huán)422分別分配給不同的處理器的目標(biāo)程序300。初始值計算代碼411和初始值計算代碼421是初始值計算代碼。通過對程序410追加初始值計算代碼411、對程序420追加初始值計算代碼421,能夠生成消除了位于程序400中的第51次的迭代對第50次的迭代的依存關(guān)系的程序410和程序410,能夠并列處理程序400。<被判定為不能進(jìn)行初始值計算代碼追加型變換的程序的示例>下面,對于被判定為不能適用初始值計算代碼追加型變換的情況,使用圖8進(jìn)行說明。程序550是不能適用初始值計算代碼追加型變換的循環(huán)的示例,利用箭頭示出了循環(huán)搬運依存。循環(huán)并列化變換部220生成以程序550的循環(huán)中不存在循環(huán)搬運依存的變量X為要素的列表551 (SllO)0循環(huán)并列化變換部220將左邊值具有列表中沒有的變量的式子L503和式子L504之中、右邊值中所包含的變量全部位于列表501中的式子L504的左邊值即變量b追加在列表中,并生成列表561 (S120)。由于變量b在SllO被追加在列表561中,因而循環(huán)并列化變換部220在S130判定為是,并執(zhí)行S150。循環(huán)并列化變換部220判定在程序400中是否存在列表561中沒有列舉的循環(huán)搬運依存變量(S150)。如程序510所示,在程序400中,對于式子L503 式子L502存在基于變量a的循環(huán)搬運依存(變量a是循環(huán)搬運依存變量),循環(huán)并列化變換部220再次執(zhí)行S120。另外,基于被追加在列表中的變量的循環(huán)搬運依存用虛線箭頭示出。由于不存在以列表中所包含的變量b、X為右邊值、以列表中沒有的變量為左邊值的式子,因而循環(huán)并列化變換部220不進(jìn)行列表的更新(S120)。由于在S120沒有被追加在列表中的變量,因而循環(huán)并列化變換部220在S130判定為否,并判定為不能適用初始值計算代碼追加型變換。<本實施方式的其它變形例>(I)在本實施方式中,說明了源程序100是用C語g、目標(biāo)程序300是用OpenMP C語言記述的情況,但本發(fā)明不限于這種情況。例如,源程序100也可以用FORTAN等其它語言進(jìn)行記述,目標(biāo)程序300只要是能夠進(jìn)行并列化的語言,則也可以采用其它語言?;蛘?,目標(biāo)程序300也可以是多處理器能夠執(zhí)行的目標(biāo)文件(object file)。(2)在本實施方式中,說明了變量a、b是標(biāo)量變量、變量X是數(shù)組的情況,但本發(fā)明不限于這種情況。各個變量也可以是向量變量或多維數(shù)組等任意的數(shù)據(jù)構(gòu)造。(3)在本實施方式中,說明了針對包含于源程序中的循環(huán),確認(rèn)是否能夠在S10、S20、S30的各個步驟中適 用變換,并在能夠適用時在SI 1、S21、S31的各個步驟執(zhí)行變換的情況,但本發(fā)明不限于這種情況。例如,也可以在對包含于源程序中的循環(huán)處理全部進(jìn)行變換可否判定之后,使用判定結(jié)果一并進(jìn)行變換處理。(4)在本實施方式中,說明了確認(rèn)在S10、S30的各個步驟中是否能夠分別適用DOALL型變換、D0ACR0SS型變換,并在能夠適用時在Sll、S31的各個步驟進(jìn)行變換的情況,但本發(fā)明不限于這種情況。例如也可以是,不具有DOALL型變換部221,不判定可否進(jìn)行DOALL型變換,而是判定是否能夠進(jìn)行初始值計算代碼追加型變換?;蛘撸缫部梢允?,不具有D0ACR0SS型變換部223,針對被判定為不能進(jìn)行初始值計算代碼追加型變換的循環(huán),不判定是否能夠適用D0ACR0SS型變換,而是直接進(jìn)行逐次處理,如果有實現(xiàn)并列化或提高執(zhí)行效率的其它技術(shù),則也可以嘗試適用這些技術(shù)。由此,能夠?qū)崿F(xiàn)這樣的編譯裝置,其具有對于能夠進(jìn)行初始值計算代碼追加型變換的循環(huán)進(jìn)行初始值計算代碼追加型變換的特征,而且具有各種結(jié)構(gòu)。(5)在本實施方式中,在S120 S150反復(fù)判定處理,直到列表的變量與循環(huán)搬運依存變量一致,但本發(fā)明不限于這種情況。例如也可以是,通過設(shè)定實施S120 S150的次數(shù)的上限,在具有依存于在對被分割后的子循環(huán)的第一個迭代執(zhí)行固定次數(shù)以上的次數(shù)之前執(zhí)行的迭代的循環(huán)搬運依存變量的情況下,不適用初始值計算代碼追加型的變換。由此,能夠僅在基于循環(huán)的并列化的處理速度的提高超過基于所追加的初始值計算代碼的系統(tǒng)開銷(over head)的情況下進(jìn)行并列化。(6)在本實施方式中,對于由M個迭代構(gòu)成的循環(huán),由N個處理器實施并列執(zhí)行,因而將由連續(xù)的(M/N)個迭代構(gòu)成的子循環(huán)分配給各個處理器,但本發(fā)明不限于這種情況。例如也可以是,包含于子循環(huán)中的迭代的數(shù)量因每個處理器而不同。(7)在本實施方式中,說明了歸納變量i的變化量s為I (歸納變量i的變更語句為i +十)的情況,但本發(fā)明不限于這種情況。例如也可以是,設(shè)歸納變量i的變更語句為i=i + 2,歸納變量i的變化量s為2?;蛘?,也可以是,設(shè)歸納變量i的變更語句為i一一,歸納變量i的變化量s為一 1,將S223中的判定式q蘭p + s置換為q蘭p + S。由此,能夠?qū)Ω鞣N條件的循環(huán)處理實施本發(fā)明。(8)在本實施方式中,說明了在歸納變量i的變更語句為i + +時對歸納變量i的變化量s代入I的情況,但本發(fā)明不限于這種情況。例如也可以是,預(yù)先設(shè)s的初始值為I,在歸納變量i的變更語句不是i + +時變更s的值。由此,在歸納變量i的變更語句為i++的大多數(shù)循環(huán)中能夠簡化變換處理。產(chǎn)業(yè)上的可利用性根據(jù)本發(fā)明,能夠?qū)⒁灾鸫涡蜕傻脑闯绦蛸Y產(chǎn)變換為面向多芯處理器的被并列化的目標(biāo)程序,能夠廣泛應(yīng)用于安裝了多芯處理器的家電產(chǎn)品等。標(biāo)號說明200編譯裝置;210數(shù)據(jù)依存分析部;220循環(huán)并列化部;221循環(huán)并列化判定部;230循環(huán)變換部;231D0ALL型變換部;232初始值計算代碼追加型變換部;233D0ACR0SS型變換部;300目標(biāo) 程序
權(quán)利要求
1.一種從逐次型的源程序生成并列型的目標(biāo)程序的編譯裝置,其特征在于,該編譯裝置具有: 數(shù)據(jù)依存分析部,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量; 循環(huán)并列化判定部,對于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及 初始值計算代碼追加部,對于所述循環(huán)并列化判定部判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行。
2.根據(jù)權(quán)利要求1所述的編譯裝置,其特征在于,所述循環(huán)并列化判定部對于包含所述循環(huán)搬運依存變量的循環(huán)中所包含的變量,將不是所述循環(huán)搬運依存變量的變量判別為不需逐次執(zhí)行循環(huán)即可計算出在所有迭代中的值的可計算變量, 每當(dāng)被判別為可計算變量的變量增加時,所述循環(huán)并列化判定部對于包含在包含所述循環(huán)搬運依存變量的循環(huán)中、而且沒被判別為可計算變量的循環(huán)搬運依存變量,反復(fù)如下處理:在計算所述循環(huán)搬運依存變量的值所需要的變量全部是可計算變量的情況下,將所述循環(huán)搬運依存變量判別為可計算變量, 如果包含所述循環(huán)搬運依存變量的循環(huán)中所包含的變量全部是可計算變量,所述循環(huán)并列化判定部將包含所述循環(huán)搬運依存變量的循環(huán)判定為可并列化循環(huán)。
3.根據(jù)權(quán)利要求2所述的編譯裝置,其特征在于,所述循環(huán)并列化判定部生成是包含所述循環(huán)搬運依存變量的循環(huán)中所包含的變量、但不是循環(huán)搬運依存變量的所述可計算變量的列表, 所述循環(huán)并列化判定部對于包含所述循環(huán)搬運依存變量的循環(huán)中所包含的循環(huán)搬運依存變量,反復(fù)如下處理:如果在所述循環(huán)搬運依存變量為左邊值的式子中右邊值的變量全部包含于所述列表中,則將所述左邊值的循環(huán)搬運依存變量作為所述可計算變量追加在所述列表中,所述循環(huán)并列化判定部反復(fù)該處理直到要被追加在所述列表中的變量消失, 如果包含所述循環(huán)搬運依存變量的循環(huán)中所包含的變量全部包含于所述列表中,所述循環(huán)并列化判定部將包含所述循環(huán)搬運依存變量的循環(huán)判定為可并列化循環(huán)。
4.根據(jù)權(quán)利要求2所述的編譯裝置,其特征在于,所述初始值計算代碼追加部在所述循環(huán)中確定成為所述子循環(huán)的第一個迭代的迭代, 所述初始值計算代碼追加部將所述循環(huán)搬運依存變量置換為因每個所述子循環(huán)而不同的局部變量, 所述初始值計算代碼追加部生成如下初始值計算代碼,該初始值計算代碼使用不是循環(huán)搬運依存變量的變量計算所述確定出的迭代中的所述循環(huán)搬運依存變量的值,并將該值代入所述局部變量, 所述初始值計算代碼追加部將所述生成的初始值計算代碼追加在所述子循環(huán)的前面。
5.根據(jù)權(quán)利要求4所述的編譯裝置,其特征在于,所述初始值計算代碼追加部生成循環(huán)搬運依存變量的列表即初始值追加列表, 所述初始值計算代碼追加部對于所述初始值追加列表的變量,從所述循環(huán)中生成以在所述子循環(huán)的第一個迭代中被參照的值為左邊值的導(dǎo)出式,并作為初始值計算代碼追加在所述子循環(huán)的前面, 所述初始值計算代碼追加部對于之前剛剛追加的初始值計算代碼,生成右邊值中所包含的循環(huán)搬運依存變量的列表即第2追加列表,如果所述第2追加列表中有變量則反復(fù)如下處理:對于所述第2追加列表的變量,從所述循環(huán)中生成以所述變量為左邊值的導(dǎo)出式,并作為初始值計算代碼追加在已經(jīng)被追加的初始值計算代碼的前面。
6.一種從逐次型的源程序生成并列型的目標(biāo)程序的程序,其特征在于,該程序包括: 數(shù)據(jù)依存分析步驟,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量; 循環(huán)并列化判定步驟,對于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及 初始值計算代碼追加步驟,對于所述循環(huán)并列化判定步驟判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行。
7.—種記錄了編譯程序的計算機可讀的記錄介質(zhì),該編譯程序用于從逐次型的源程序生成并列型的目標(biāo)程序,其特征在于,該記錄介質(zhì)記錄了使以下步驟執(zhí)行的程序: 數(shù)據(jù)依存分析步驟,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量; 循環(huán)并列化判定步驟,對于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及 初始值計算代碼追加步驟,對于所述循環(huán)并列化判定步驟判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行。
8.—種從逐次型的源程序生成并列型的目標(biāo)程序的循環(huán)并列化方法,其特征在于,該循環(huán)并列化方法包括: 數(shù)據(jù)依存分析步驟,對于包含于所述源程序中的循環(huán),分析是否存在循環(huán)搬運依存變量,該循環(huán)搬運依存變量是在于代入值的迭代之后執(zhí)行的另一個迭代中參照所述代入的值的變量;循環(huán)并列化判定步驟,對于包含所述循環(huán)搬運依存變量的循環(huán),判定是否是可并列化循環(huán),該可并列化循環(huán)是不需逐次執(zhí)行循環(huán)即可計算所有迭代中的所述循環(huán)搬運依存變量的值的循環(huán);以及 初始值計算代碼追加步驟,對于所述循環(huán)并列化判定步驟判定為可并列化循環(huán)的循環(huán),確定用于分割為多個子循環(huán)的所述子循環(huán)的開始位置,生成用于計算各個所述開始位置中的所述循環(huán)搬運依存變量的值的初始值計算代碼,按照所述開始位置將所述循環(huán)分割為所述子循環(huán),并生成目標(biāo)程序,以使所述初始值計算代碼在各自對應(yīng)的所述子循環(huán)之前執(zhí)行 。
全文摘要
在過去的循環(huán)并列化方法中存在如下的課題,在對于所包含的循環(huán)搬運依存變量不需從第一個開始逐次執(zhí)行循環(huán)即可計算所有迭代中的值的循環(huán)中,由于包含循環(huán)搬運依存變量而被判定為不能進(jìn)行DOALL型的并列化變換,因而逐次執(zhí)行,或者適應(yīng)逐次執(zhí)行包含循環(huán)搬運依存變量的循環(huán)的DOACROSS型的循環(huán)變換,循環(huán)搬運依存所在的式子不能并列化,在多處理器中不能實現(xiàn)高效處理。本發(fā)明通過生成初始值計算代碼(411、421),能夠解決并列化以前的源代碼(400)的循環(huán)搬運依存,通過將源代碼(400)中的循環(huán)進(jìn)行分割并變換為能夠?qū)崿F(xiàn)并列執(zhí)行的子循環(huán)(410、420),在多處理器中能夠?qū)崿F(xiàn)高效處理。
文檔編號G06F9/45GK103250135SQ20118001675
公開日2013年8月14日 申請日期2011年12月13日 優(yōu)先權(quán)日2010年12月21日
發(fā)明者馬場大介 申請人:松下電器產(chǎn)業(yè)株式會社