本發(fā)明涉及一種用于構(gòu)造具有基于圖形的中間表示的源程序的向量化版本的方法和裝置。
背景技術(shù):
根據(jù)本發(fā)明的方法和裝置涉及計算機軟件工程領(lǐng)域,且具體地說,涉及通過使用中間代碼表示對源代碼進行編譯。對計算機程序進行編譯涉及將高級語言代碼,即源代碼轉(zhuǎn)換成計算機系統(tǒng)的處理器的指令。編譯器是一種采用源程序的源代碼并產(chǎn)生可執(zhí)行機器代碼的計算機程序。由處理器執(zhí)行所產(chǎn)生的機器代碼指令序列以執(zhí)行給定任務(wù)。
編譯器執(zhí)行程序變換從而優(yōu)化源程序以供快速執(zhí)行。編譯器執(zhí)行的這些所應(yīng)用優(yōu)化中的一個是向量化。
圖1示出了說明在由常規(guī)編譯器進行編譯的過程期間的向量化的圖式。源代碼的中間表示ir由向量器進行處理以提供源代碼的向量化中間表示。在向量化期間,一系列標(biāo)量運算用單個向量運算替換,如圖2中所說明。如可見,多個標(biāo)量運算用單個向量運算替換。執(zhí)行此向量化是因為計算硬件支持向量運算且向量化程序最適于并行執(zhí)行。因此,向量化是將計算機程序從每次處理一對運算元的標(biāo)量實施方案轉(zhuǎn)換到一次在多對運算元上處理一個運算的向量實施方案的過程。術(shù)語“向量化”最初來自于將運算元放置到向量或陣列中的慣例。自動向量化允許編譯器自動地將標(biāo)量程序轉(zhuǎn)換成向量化程序。編譯器可根據(jù)單個源代碼描述自動生成函數(shù)的標(biāo)量版本和向量版本兩者。這允許編譯器從向量化循環(huán)內(nèi)進行向量函數(shù)調(diào)用,而不是從向量化循環(huán)內(nèi)進行多個序列化標(biāo)量函數(shù)調(diào)用。
程序的并行執(zhí)行允許實現(xiàn)最大性能,但是人類編寫這種并行的可執(zhí)行程序常常較為繁瑣。因此,編譯器自動執(zhí)行部分向量化。向量化還可用于用向量運算替換順序循環(huán),如相對于圖3所說明。關(guān)于此任務(wù),向量化可用于構(gòu)造源程序的向量化版本/p/。源程序p到向量化形式/p/的變換還可被稱為復(fù)制。
因此,需要一種用于構(gòu)造程序的向量化版本的任務(wù)的簡單但通用的方法。
技術(shù)實現(xiàn)要素:
根據(jù)本發(fā)明的第一方面,提供一種用于構(gòu)造由基于圖形的中間表示ir表示的源程序p的向量化版本/p/的方法,所述方法包括:
向圖形解釋器供應(yīng)所述基于圖形的中間表示ir,所述圖形解釋器遍歷所述基于圖形的中間表示的節(jié)點以檢索每一節(jié)點的當(dāng)前運算并維持和更新當(dāng)前背景,所述當(dāng)前背景連同所述當(dāng)前運算一起在圖形遍歷期間表示圖形解釋器的狀態(tài);
針對每一遍歷節(jié)點由所述圖形解釋器調(diào)用分級評估器,并通過使用當(dāng)前運算和當(dāng)前背景的符號向分級評估器供應(yīng)當(dāng)前運算,以及
在當(dāng)前背景中由分級評估器對當(dāng)前運算進行向量化,以向圖形解釋器提供由分級評估器傳回的向量化片段,所述圖形解釋器用當(dāng)前運算的符號和向量化片段的符號之間的關(guān)聯(lián)來更新圖形解釋器的當(dāng)前背景,以生成源程序的向量化版本的基于圖形的中間表示。
根據(jù)按照本發(fā)明的第一方面的方法的第一實施方案,基于圖形的中間表示由數(shù)據(jù)結(jié)構(gòu)形成,其中圖形節(jié)點表示源程序的運算且圖形邊緣表示運算之間的信息數(shù)據(jù)流。
根據(jù)按照第一方面的方法的第一實施方案的第二實施方案或根據(jù)按照第一方面本身的方法,基于圖形的信息表示作為查找表存儲在存儲器中,所述查找表包括基于圖形的中間表示中的所有節(jié)點的條目列表。
根據(jù)按照本發(fā)明的第一方面的方法的第二實施方案的第三實施方案,列表中的每一條目對應(yīng)于基于圖形的中間表示的節(jié)點,并且包括作為密鑰的相應(yīng)節(jié)點的節(jié)點id,所述節(jié)點id由符號和從節(jié)點類導(dǎo)出的運算類實例形成。
根據(jù)按照本發(fā)明的第一方面的方法的第三實施方案的第四實施方案,運算類實例包括運算的運算標(biāo)識符和由基于圖形的中間表示的節(jié)點的符號形成的運算自變量。
根據(jù)按照本發(fā)明的第一方面的方法的第一到第四實施方案的第五實施方案,基于圖形的中間表示的圖形節(jié)點表示編程語言的基元運算。
在根據(jù)本發(fā)明的第一方面的方法的第一到第四實施方案的另一可能的第六實施方案中,基于圖形的中間表示的圖形節(jié)點表示由與對應(yīng)節(jié)點類相關(guān)聯(lián)的對應(yīng)子例程處理的用戶自定義函數(shù)。
在根據(jù)本發(fā)明的第一方面的方法的第三到第六實施方案的另一可能的第七實施方案中,通過將相應(yīng)節(jié)點的符號用作所存儲查找表的密鑰以得到當(dāng)前運算以及其運算自變量,分級評估器檢索由所述圖形解釋器遍歷的相應(yīng)節(jié)點。
在根據(jù)本發(fā)明的第一方面的方法的第七實施方案的另一可能的第八實施方案中,通過使用由圖形解釋器供應(yīng)的當(dāng)前背景,分級評估器將當(dāng)前運算的運算自變量的符號映射到向量化自變量的對應(yīng)符號。
在根據(jù)本發(fā)明的第一方面的方法的第八實施方案的另一可能的第九實施方案中,分級評估器選擇用于對當(dāng)前運算進行向量化的向量化規(guī)則,所述向量化規(guī)則用于相應(yīng)運算,并且將作為分級函數(shù)的選定向量化規(guī)則應(yīng)用到當(dāng)前運算的向量化自變量。
在根據(jù)本發(fā)明的第一方面的方法的第九實施方案的另一第十實施方案中,通過將選定向量化規(guī)則應(yīng)用到當(dāng)前運算的向量化自變量,提供表示向量化片段的符號。
在根據(jù)本發(fā)明的第一方面的方法的第十實施方案的第十一實施方案中,將相應(yīng)節(jié)點的符號和表示向量化片段的符號之間的關(guān)聯(lián)添加到當(dāng)前背景中。
在根據(jù)本發(fā)明的第一方面的方法的第一到第十一實施方案的第十二實施方案中或根據(jù)第一方面本身的方法,針對基于圖形的中間表示的每一基元運算,使用向量化規(guī)則模板指定向量化規(guī)則。
在根據(jù)本發(fā)明的第一方面的方法的第十到第十二實施方案的第十三實施方案中,在執(zhí)行選定向量化規(guī)則期間,分級評估器應(yīng)用優(yōu)化規(guī)則以將源程序的原始基于圖形的中間表示變換成源程序的向量化版本的所得基于圖形的中間表示。
在根據(jù)本發(fā)明的第一方面的方法的第十三實施方案的第十四實施方案中,通過應(yīng)用優(yōu)化規(guī)則,源程序的基于圖形的中間表示的子圖形用另一子圖形替換。
在根據(jù)本發(fā)明的第一方面的方法的第一到第十四實施方案的另一可能的第十五實施方案中或根據(jù)第一方面本身的方法,圖形解釋器的背景維持輸入到所述圖形解釋器的源程序的基于圖形的中間表示的符號和由圖形解釋器輸出的源程序的向量化版本的所得基于圖形的中間表示的符號之間的映射。
根據(jù)本發(fā)明的第二方面,提供一種編譯器,所述編譯器包括用于執(zhí)行根據(jù)本發(fā)明的第一方面的方法的向量器。
根據(jù)本發(fā)明的第三方面,提供一種用于提供源程序的向量化版本的向量化裝置,所述裝置包括:
圖形解釋器,所述圖形解釋器用于遍歷源程序的基于圖形的中間表示的節(jié)點,以檢索每一節(jié)點的當(dāng)前運算并維持和更新當(dāng)前背景,所述當(dāng)前背景連同當(dāng)前運算一起在圖形遍歷期間表示圖形解釋器的狀態(tài),以及
分級評估器,所述分級評估器用于在當(dāng)前背景中對當(dāng)前運算進行向量化,以向所述圖形解釋器提供由分級評估器傳回的向量化片段,所述圖形解釋器用當(dāng)前運算的符號和向量化片段的符號之間的關(guān)聯(lián)來更新當(dāng)前背景,以生成源程序的向量化版本的基于圖形的中間表示。
根據(jù)按照本發(fā)明的第三方面的向量化裝置的第一可能實施方案,向量化裝置形成用于從所述源程序的源代碼產(chǎn)生可執(zhí)行機器代碼的編譯器的級。
附圖說明
在下文中,參考附圖更詳細(xì)地描述本發(fā)明的不同方面的不同實施方案。
圖1示出了用于說明編譯的常規(guī)過程中的向量化的圖式;
圖2示出了用于說明根據(jù)現(xiàn)有技術(shù)水平的用向量運算替換標(biāo)量運算的圖式;
圖3說明用不具有循環(huán)的向量化程序替換具有循環(huán)的原始程序;
圖4示出了用于說明根據(jù)本發(fā)明的方面的向量化裝置的可能布置的圖式;
圖5a、5b、5c示出了示例性源程序和此源程序的對應(yīng)的基于圖形的中間表示;
圖6a、6b示出了用于說明根據(jù)本發(fā)明的裝置和方法的操作的示例性程序的基于圖形的中間表示;
圖7示出了用于說明可能的解釋器設(shè)計圖案的圖式;
圖8說明如通過根據(jù)本發(fā)明的方法和裝置執(zhí)行的從圖形解釋器接收的單個圖形節(jié)點向量化;
圖9示出了如通過根據(jù)本發(fā)明的方法和裝置采用的向量化規(guī)則模板和對應(yīng)的示例性規(guī)范;
圖10示出了如通過根據(jù)本發(fā)明的方法和裝置采用的優(yōu)化規(guī)則模板和對應(yīng)的示例性規(guī)范;
圖11示出了如根據(jù)本發(fā)明的方法和裝置采用的具有對應(yīng)優(yōu)化的分級評估過程的擴展;
圖12示出了根據(jù)本發(fā)明的方面的用于說明用于構(gòu)造源程序的向量化版本的方法的流程圖。
具體實施方式
如圖4中所說明,根據(jù)本發(fā)明的方面的向量化裝置1用于提供源程序p的向量化版本。向量化裝置1包括圖形解釋器2和分級評估器3。圖形解釋器2用于遍歷源程序p的基于圖形的中間表示ir的節(jié)點,以檢索每一節(jié)點的當(dāng)前運算并維持和更新當(dāng)前背景,所述當(dāng)前背景連同當(dāng)前運算一起在圖形遍歷期間表示圖形解釋器2的狀態(tài)。
向量化裝置1的分級評估器3用于在當(dāng)前背景中對當(dāng)前運算進行向量化,以向圖形解釋器2提供由分級評估器3傳回的向量化片段vf,如圖4中所說明。圖形解釋器2將當(dāng)前背景ctx更新為當(dāng)前運算的符號和向量化片段vf的符號之間的關(guān)聯(lián),以生成源程序p的向量化版本的基于圖形的中間表示ir'。
圖4中所說明的向量化裝置1可形成用于從源程序p的源代碼產(chǎn)生可執(zhí)行機器代碼的編譯器的級。
源程序p的基于圖形的中間表示ir是可供向量化裝置1使用且允許在輸出可執(zhí)行機器代碼之前進行分析和變換的數(shù)據(jù)結(jié)構(gòu)。每一中間表示是包括節(jié)點內(nèi)部的特定信息數(shù)據(jù)的圖形或樹數(shù)據(jù)結(jié)構(gòu)。中間表示ir含有評估源程序p需要的所有信息。將源程序表示為存儲器中的數(shù)據(jù)結(jié)構(gòu)具有不同的方式。中間表示ir具有是基于圖形的第一屬性,即所述中間表示是具有存儲在圖形節(jié)點內(nèi)部的特定信息數(shù)據(jù)的圖形數(shù)據(jù)結(jié)構(gòu),并且具有其可以用面向?qū)ο蟮恼Z言實施的第二屬性。大部分基于圖形的中間表示對應(yīng)于源程序p的運算?;趫D形的中間表示ir的邊緣對應(yīng)于運算之間的數(shù)據(jù)流。執(zhí)行運算的次序未由基于圖形的中間表示ir明確指定,但通過節(jié)點之間的依賴性指示?;趫D形的信息表示ir可作為查找表存儲在存儲器中,所述查找表包括基于圖形的中間表示ir的所有節(jié)點的條目列表。列表中的每一條目可對應(yīng)于基于圖形的中間表示ir的節(jié)點,并且包括作為密鑰的相應(yīng)節(jié)點的節(jié)點id,所述節(jié)點id由符號和從節(jié)點類導(dǎo)出的運算類實例形成。運算類實例可包括運算的運算標(biāo)識符和由基于圖形的中間表示ir的節(jié)點的符號形成的運算自變量?;趫D形的中間表示ir的圖形節(jié)點表示編程語言的基元運算或由與對應(yīng)節(jié)點類相關(guān)聯(lián)的對應(yīng)子例程處理的用戶自定義函數(shù)。
在可能實施例中,中間表示的圖形數(shù)據(jù)結(jié)構(gòu)的每一圖形節(jié)點可由對(s,n)表示,其中
s是全局唯一標(biāo)識符,并且還可稱為符號且通常由數(shù)字形成。所有符號由類別sym的實例表示。每一符號指代其識別的節(jié)點并且可用于存取所述節(jié)點。n是從節(jié)點類導(dǎo)出的類別實例。節(jié)點的具體類別表示為運算。不同的運算可由不同的類別表示。運算類可形成類別分層結(jié)構(gòu)。分層結(jié)構(gòu)中的抽象類別可表示運算的子集。
圖5a示出了可由中間表示ir表示的示例性源程序p。在進行編譯之后,所示的示例性源程序p在執(zhí)行時計算陣列中的所有值的平均值。
arr是函數(shù)的自變量。當(dāng)調(diào)用函數(shù)時,參數(shù)arr提供對類別array<float>的實例的參考,array<float>表示值的陣列或索引集合。浮點數(shù)的陣列可由函數(shù)的調(diào)用程序供應(yīng)并且由函數(shù)處理。逐步依次執(zhí)行圖5a中所示的函數(shù)的值。在程序的行2中,使用實例arr執(zhí)行對類array的方法總和的調(diào)用。所述方法計算陣列中的所有元素的總和。在示例性源程序的行3中,使用實例arr執(zhí)行對類別array的方法長度的調(diào)用。所述方法計算陣列中的元素的數(shù)目。
最后,計算平均值并將其傳回作為函數(shù)的結(jié)果。
圖5a中所說明的示例性源程序p的基于圖形的中間表示ir在圖5b中示出。圖5b的程序圖形的內(nèi)存表示在圖5c中說明。圖5c示出了圖5b中所示的程序圖形的內(nèi)存中間表示ir。
源程序p的中間表示ir可以用面向?qū)ο蟮恼Z言實施。面向?qū)ο蟮恼Z言是一種支持面向?qū)ο蟮木幊蘯op的計算機編程語言。面向?qū)ο蟮木幊淌且环N使用通常為類別實例的對象的編程范例,其由數(shù)據(jù)字段和方法以及其與設(shè)計應(yīng)用和計算機程序的交互構(gòu)成。所使用的編程技術(shù)可包含數(shù)據(jù)抽象、包封、消息傳遞、模塊性、多態(tài)性和遺傳性。在面向?qū)ο蟮木幊讨校椒ㄊ桥c類別相關(guān)聯(lián)的子例程或程序。方法限定在程序運行時間將由相關(guān)聯(lián)類別的實例顯現(xiàn)的行為。用于面向?qū)ο蟮木幊痰姆椒ň哂幸韵聦傩裕涸谶\行時間,所述方法能夠存取存儲在與其相關(guān)聯(lián)的類別實例中的數(shù)據(jù)并且由此能夠控制實例的狀態(tài)。
如圖4中可見,圖形解釋器2遍歷圖形的運算(節(jié)點),以檢索每一節(jié)點的當(dāng)前運算并維持和更新當(dāng)前背景,所述當(dāng)前背景連同當(dāng)前運算一起在圖形遍歷期間表示圖形解釋器2的狀態(tài)。將由圖形解釋器2提供的當(dāng)前運算和當(dāng)前背景ctx供應(yīng)到分級評估器3,所述分級評估器3在給定背景ctx中執(zhí)行運算的向量化,以向圖形解釋器2提供由分級評估器3傳回的向量化片段vf。圖形解釋器2用當(dāng)前運算的符號和向量化片段vf的符號之間的關(guān)聯(lián)來更新當(dāng)前背景ctx,以生成源程序p的向量化版本/p/的基于圖形的中間表示ir'。
如圖4中所示,基于圖形的中間表示ir由例如文本文件的某一其它表示創(chuàng)建,或由先前編譯階段創(chuàng)建。形成程序圖形的基于圖形的中間表示ir被供應(yīng)到向量化裝置1的圖形解釋器2。圖形解釋器2可最初創(chuàng)建空的背景,并開始關(guān)于圖形的節(jié)點之間的依賴性的圖形遍歷。針對圖形的每一節(jié)點,圖形解釋器2調(diào)用分級評估器3并向其供應(yīng)當(dāng)前運算和背景。
通過將相應(yīng)節(jié)點的符號用作所存儲查找表的密鑰以得到當(dāng)前運算和其運算自變量,分級評估器3檢索由所述圖形解釋器2遍歷的相應(yīng)節(jié)點。在可能實施例中,通過使用由圖形解釋器2供應(yīng)的當(dāng)前背景,分級評估器3可映射當(dāng)前運算(opnode)的運算自變量的符號和向量化自變量的對應(yīng)符號。分級評估器3可選擇用于對當(dāng)前運算(opnode)進行向量化的向量化規(guī)則vr,所述向量化規(guī)則vr用于相應(yīng)的運算,并且可將作為分級函數(shù)的選定向量化規(guī)則vr應(yīng)用到當(dāng)前運算(opnode)的向量化自變量。通過將選定向量化規(guī)則vr應(yīng)用到當(dāng)前運算(opnode)的向量化自變量,提供表示向量化片段vf的符號(sym')。將相應(yīng)節(jié)點的符號(sym)和表示向量化片段vf的符號(sym')之間的關(guān)聯(lián)添加到當(dāng)前背景ctx中。在可能實施例中,針對基于圖形的中間表示ir的每一基元運算,使用向量化規(guī)則模板vrt指定向量化規(guī)則vr。
在可能實施例中,在執(zhí)行選定向量化規(guī)則vr期間,分級評估器3應(yīng)用優(yōu)化規(guī)則or以將源程序p的原始基于圖形的中間表示ir變換成原始源程序p的向量化版本/p/的所得基于圖形的中間表示ir'。通過應(yīng)用運算規(guī)則or,源程序p的基于圖形的中間表示ir的子圖形由另一通常更簡單的子圖形替換。
因此,分級評估器3使用向量化規(guī)則vr和優(yōu)化規(guī)則or來在當(dāng)前背景中執(zhí)行當(dāng)前運算的向量化。在針對給定運算由分級評估器3執(zhí)行向量化之后,表示向量化片段vf的符號傳回到圖形解釋器2,所述圖形解釋器2用新對(operation→/operation/)更新背景ctx,并繼續(xù)遍歷圖形。
在圖形解釋器2已經(jīng)完成遍歷之后,輸入程序p的向量化版本/p/的所得圖形準(zhǔn)備待用。
在圖4中說明輸入程序p的簡單例子,其中輸入程序p執(zhí)行針對輸入運算元a、b、c的簡單數(shù)學(xué)計算。在給定例子中,輸入程序p是:
p(a,b,c)=a+(b*c)。
還在圖6a中示出源程序p的對應(yīng)的基于圖形的中間表示ir。此基于圖形的中間表示ir形成到向量化裝置1的輸入數(shù)據(jù),并且向量化的結(jié)果還由基于圖形的中間表示ir'形成,如圖6b中所示。
圖形的中間表示ir節(jié)點對應(yīng)于源程序p的運算,并且邊緣對應(yīng)于運算之間的數(shù)據(jù)流。圖6a說明示例性源程序p的基于圖形的中間表示ir。執(zhí)行次序通過節(jié)點之間的依賴性指示,但未明確指定。在可能實施例中,基于圖形的中間表示ir作為從符號到節(jié)點的查找表存儲在機器存儲器中,如同樣在圖6b中所說明。圖形數(shù)據(jù)結(jié)構(gòu)中的每一對(s,n)表示符號定義:
s-符號(唯一id)
n-從節(jié)點類導(dǎo)出的類別實例。
圖形的邊緣由存儲在節(jié)點中的符號表示。通過將相應(yīng)節(jié)點的符號用作圖6b中所示的所存儲查找表的密鑰以得到當(dāng)前運算(opnode)以及其運算自變量,分級評估器3檢索由圖形解釋器2遍歷的相應(yīng)節(jié)點。
為了遍歷示例性源程序p的基于圖形的中間表示,圖形解釋器2可例如使用例如圖7中所說明的解釋器。圖7說明解釋器設(shè)計圖案。這可適應(yīng)典型的解釋器軟件設(shè)計圖案的行為,例如add、mul是從節(jié)點抽象類別導(dǎo)出的類別。圖形的邊緣由存儲在節(jié)點中的符號表示。程序圖形的抽象節(jié)點類別可被視為abstractexpression。從節(jié)點類導(dǎo)出的類別實例可被視為terminalexpression或nonterminalexpression:
表示語言(例如java)的基元運算的程序圖形節(jié)點被視為終端,并且表示用戶自定義函數(shù)的程序圖形節(jié)點被視為非終端。
用戶自定義函數(shù)可被稱為“λ”,其中每一λ的特征在于:
在基于圖形的中間表示ir中不具有定義的參數(shù)符號,和
λ主體,即取決于函數(shù)參數(shù)符號的一系列基于圖形的中間表示定義,以及
表示函數(shù)執(zhí)行的結(jié)果的結(jié)果符號。
終端節(jié)點n的方法解釋()可調(diào)用提供節(jié)點n的符號s作為(operation,context)對的第一自變量的分級評估器3。所述分級評估器還可將當(dāng)前背景用作所述對的第二分量。作為輸入的符號和所得圖形之間的映射的背景在圖6a中說明。對(/operation/,ctx')由分級評估器3傳回。當(dāng)前背景ctx用背景ctx'替換,所述背景ctx'意味著其用作下一定義的當(dāng)前背景。所得圖形由分級評估器3更新。
λ節(jié)點l的方法解釋()進行以下操作:
首先,方法解釋()創(chuàng)建用于此λ的向量化版本的新λ節(jié)點/l/。針對λl的每一參數(shù)符號,方法解釋()將新的參數(shù)符號添加到/l/,并在當(dāng)前背景ctx中記住這一對應(yīng)關(guān)系。另外,通過構(gòu)建取決于參數(shù)符號的定義列表,方法解釋()計算λl的主體。來自λ的主體的定義相對于由圖形的邊緣表示的依賴性以拓?fù)浞绞竭M行分類。這意味著每一定義在其所根據(jù)的所有定義之后進行解釋。另外,針對λ的每一定義主體,圖形解釋器2調(diào)用解釋()方法并更新當(dāng)前背景ctx。所得圖形由分級評估器3更新。此外,在已經(jīng)完成λ主體的遍歷之后,圖形解釋器2從背景中檢索/l/的結(jié)果符號。結(jié)果符號是來自對應(yīng)于λl的結(jié)果符號的所得圖形的符號。畢竟,已經(jīng)計算出/l/的組成(參數(shù)、主體和結(jié)果符號),/l/被添加到所得圖形中,并且l→/l/對被添加到背景ctx中。
分級評估器3形成向量化裝置1的組件。分級評估器3由圖形解釋器2調(diào)用以處理原始圖形的單個圖形節(jié)點。所述分級評估器可通過使用分級評估方法以及向量化規(guī)則vr和優(yōu)化規(guī)則or來實施,以將源程序p的原始圖形變換成源程序p的向量化形式的所得圖形ir'。
給定來自原始圖形和當(dāng)前背景(sym,ctx)的符號,分級評估器3可執(zhí)行向量化規(guī)則vr,并應(yīng)用優(yōu)化規(guī)則or,并且產(chǎn)生新對(sym',ctx'),其中sym'是來自對應(yīng)于符號sym的所得圖形的符號。向量化裝置1的分級評估器3的行為在圖8中說明。
圖8在左側(cè)示出了具有以下含義的偽代碼:
行1:原始圖形的每一節(jié)點由其符號(sym)給出,并且當(dāng)前背景ctx由第二自變量給出。
行2:通過原始圖形的符號檢索原始圖形的節(jié)點。結(jié)果是運算和表示圖形的進入邊緣的自變量符號列表。
行3:通過使用背景將自變量映射到其向量。
行4:選擇用于當(dāng)前運算(opnode)的向量化規(guī)則vr。規(guī)則vr是使用分級評估方法實施的分級函數(shù)。規(guī)則vr可為符號到符號的函數(shù)。
行5:選定規(guī)則vr用作函數(shù)并應(yīng)用到向量化自變量。結(jié)果(sym')是表示給定運算的向量化的結(jié)果的符號。
行6:對sym→sym'被添加到背景中。
每一向量化規(guī)則vr在給定背景中變換特定類型的單個圖形節(jié)點(基元運算)。完整的規(guī)則集合含有用于每一基元運算的一個規(guī)則規(guī)范。這些規(guī)范可用于配置分級評估器3以對源程序p的節(jié)點進行向量化,如圖4中所說明。
在可能實施例中,針對基于圖形的中間表示ir的每一基元運算,使用向量化規(guī)則模板vrt指定向量化規(guī)則vr。圖9示出了向量化規(guī)則模板vrt和示例性規(guī)范。
使用當(dāng)前背景指定向量化的結(jié)果。這意味著針對原始運算的每一自變量,背景介紹(聲明)用于這些自變量的向量化的名稱。這些名稱(在圖9中見v1、……vn)可用于輸出項(或規(guī)則的右手側(cè)),如在實例中所示。
此處用于限定向量化規(guī)則模板的<output-term>分量的語言與用于原始程序的語言相同。為了執(zhí)行向量化規(guī)則,此<output-term>部分應(yīng)該通過使用分級評估方法進行分級。這是實施的要點。
當(dāng)通過使用規(guī)則規(guī)范用一組規(guī)則配置分級評估器時,每一規(guī)則規(guī)范進行分級并保持為某一持久的存儲物以供稍后重復(fù)使用。分級的結(jié)果是針對每一規(guī)則規(guī)范創(chuàng)建的分級函數(shù)。分級函數(shù)存儲在查找表中,其中運算類型作為密鑰。圖9中來自偽代碼的行4從查找表中檢索分級函數(shù)。
在可能實施例中,在執(zhí)行選定向量化規(guī)則vr期間,分級評估器3應(yīng)用優(yōu)化規(guī)則or以將源程序p的原始基于圖形的中間表示ir變換成源程序p的向量化版本/p/的所得基于圖形的中間表示ir'。
優(yōu)化規(guī)則or用于簡化由分級評估器3產(chǎn)生的圖形。每一優(yōu)化規(guī)則or可辨識圖形節(jié)點(子圖形)的具體組合,并且可指定這個子圖形可如何用另一更簡單的子圖形替換。
圖10示出了優(yōu)化規(guī)則模板ort和對應(yīng)的示例性規(guī)范。
優(yōu)化規(guī)則or的<pattern>分量指定應(yīng)該辨識此優(yōu)化規(guī)則的哪一子圖形。所述<pattern>分量還引入或結(jié)合可用于<output-term>分量的一些變量。圖案分量可使用圖案編譯的現(xiàn)有方法來實施。此類子圖形由結(jié)合到子圖形的符號的圖案變量辨識。每一變量可保存節(jié)點的符號。
<output-term>分量類似于向量化規(guī)則vr的輸出項。當(dāng)此<output-term>進行分級時,<output-term>變成分級函數(shù)。當(dāng)調(diào)用函數(shù)時,在<pattern>中結(jié)合的變量用作自變量。當(dāng)執(zhí)行函數(shù)時,函數(shù)產(chǎn)生被添加到所得圖形中的新的圖形節(jié)點。
為了在分級評估器3中實施優(yōu)化規(guī)則or,可擴展分級評估的方法??筛淖兎旨壴u估的實施方案中的一個位置。有可能在所調(diào)用的方法中添加重寫步驟,以將每個新的節(jié)點添加到圖形。此類擴展在圖11中說明。
提供函數(shù)重寫以將優(yōu)化規(guī)則應(yīng)用到由newsym表示的子圖形。如果不存在匹配規(guī)則,重寫傳回newsym,否則執(zhí)行規(guī)則(作為分級函數(shù))從而產(chǎn)生新的子圖形和新的符號。
圖12示出了根據(jù)本發(fā)明的第一方面的用于構(gòu)造源程序p的向量化版本/p/的方法的可能實施例的流程圖。
在第一步驟s1中,將基于圖形的中間表示ir供應(yīng)到如圖4中所說明的圖形解釋器2,所述圖形解釋器2遍歷所述基于圖形的中間表示ir的節(jié)點,以檢索每一節(jié)點的當(dāng)前運算并維持和更新當(dāng)前背景,所述當(dāng)前背景連同當(dāng)前運算一起在圖形遍歷期間表示圖形解釋器2的狀態(tài)。
在另一步驟s2中,針對每一遍歷節(jié)點由圖形解釋器2調(diào)用分級評估器3,并且通過使用當(dāng)前運算和當(dāng)前背景的符號向分級評估器3供應(yīng)當(dāng)前運算。
在另一步驟s3中,分級評估器3在當(dāng)前背景中對當(dāng)前運算進行向量化,以向圖形解釋器2提供由分級評估器3傳回的向量化片段vf。圖形解釋器2將圖形解釋器2的當(dāng)前背景更新為當(dāng)前運算的符號和向量化片段vf的符號之間的關(guān)聯(lián),以生成源程序p的向量化版本/p/的基于圖形的中間表示ir'。
為了實施如圖4中所說明的向量器或向量化裝置1或如圖12中所說明的方法,可繼續(xù)進行如下操作:
首先,提供基于圖形的中間表示ir。接著,使用解釋器設(shè)計圖案實施圖形解釋器3。另外,使用分級評估的方法實施向量化裝置1的分級評估器3,如“用于使用呈面向?qū)ο蟮恼Z言的程序的分級評估來構(gòu)造程序的中間表示的方法(themethodforconstructingintermediaterepresentationofaprogramusingstagedevaluationoftheprograminanobject-orientedlanguage)”(83706387pct01)中所描述。
另外,可使用例如向量化規(guī)則模板vrt指定用于基于圖形的ir的基元運算的向量化規(guī)則vr??墒褂梅旨壴u估方法實施向量化規(guī)則vr,并且向量化裝置1的分級評估器3用于在向量化的過程中使用特定規(guī)則。另外,使用分級評估方法并通過配置向量化裝置1的分級評估器3以在向量化的過程中使用指定規(guī)則來實施優(yōu)化規(guī)則or。最后,向量化裝置1被內(nèi)嵌為編譯器的單獨級或現(xiàn)有級的變換中的一個。
根據(jù)本發(fā)明的方法和裝置提供可由基于圖形的中間表示ir表示的任何源程序p的向量化版本的自動構(gòu)造,由此允許直接使用源程序p的基于圖形的中間表示ir和所得向量化版本/p/。通過融合編譯器的向量化和優(yōu)化階段同時保持向量化規(guī)則vr和優(yōu)化規(guī)則or彼此獨立來避免涂層膨脹。
向量化方法獨立于或抽象于基元運算的特定集合,所述基元運算用于源程序p并用于表示源程序p的程序圖形的節(jié)點。這通過根據(jù)向量化規(guī)則vr執(zhí)行向量化來實現(xiàn)。通過使用分級評估方法來簡化圖形構(gòu)造和變換。
方法和裝置可提供不同效果。
一個效果是直接操作基于圖形的中間表示ir以供更深優(yōu)化。向量化方法和裝置可直接應(yīng)用于由基于圖形的中間表示ir表示的程序。圖形的選擇可通過以下事實來指示:在許多情況下,基于圖形的中間表示ir更適于優(yōu)化并且產(chǎn)生所生成程序的更高性能。
根據(jù)本發(fā)明的方法和裝置的另一效果是獨立于包含dsl和基元運算的語言。向量化方法和裝置抽象于,即獨立于用于中間表示ir的具體基元運算,這使得其可適用于許多不同背景和不同編程語言以及dsl。這通過允許使用向量化規(guī)則vr和優(yōu)化規(guī)則or配置向量化方法和裝置來實現(xiàn)。
根據(jù)本發(fā)明的方法和裝置的另一效果是其配置和內(nèi)嵌到編譯器中的簡單性。圖形變換通常比較難以實施。根據(jù)本發(fā)明的方法和裝置是基于分級評估的方法,這通過支持向量化規(guī)則vr和優(yōu)化規(guī)則or的緊湊和陳述性規(guī)范來大大簡化圖形的構(gòu)造和變換。
方法和裝置1具有更快編譯和所得程序代碼的另一效果。向量化和優(yōu)化級的融合具有增加編譯速度的效果。所得向量化代碼通常更為緊湊并因此更快。
另外,可在沒有優(yōu)化規(guī)則or,即,優(yōu)化規(guī)則or集合還可為空的情況下執(zhí)行向量化。根據(jù)本發(fā)明的向量化方法可獨立于全函數(shù)向量化方法使用。并且,所述方法可用于實施嵌套數(shù)據(jù)并行性的復(fù)制過程,且不限于這個域。通過選擇基元運算和向量化規(guī)則vr的不同基礎(chǔ),所述方法可應(yīng)用于其它域。用于構(gòu)造由基于圖形的中間表示ir表示的源程序p的向量化版本/p/的方法包含使用基于圖形的中間表示ir來表示源程序p,其中圖形節(jié)點表示運算,并且圖形邊緣表示信息流。執(zhí)行向量化方法的向量化裝置1可用向量化規(guī)則vr和優(yōu)化規(guī)則or配置??墒褂美缦蛄炕?guī)則模板vrt來獨立地指定用于基于圖形的中間表示中每一基元運算的向量化規(guī)則vr。另外,可獨立于向量化規(guī)則vr指定優(yōu)化規(guī)則or。
例如圖4中所說明的圖形解釋器2的圖形解釋器可用于遍歷圖形的節(jié)點以產(chǎn)生包括用于每一圖形節(jié)點的運算背景的對。在圖形遍歷期間,針對每一節(jié)點產(chǎn)生對(operation,context),并且將此對提交到分級評估器3。在分級評估器3中處理每個對(operation,context)期間,針對給定運算可選擇所配置的向量化規(guī)則vr中的一個,并且接著在給定背景中對指定運算進行向量化以產(chǎn)生對:(/operation/,context')。在執(zhí)行選定向量化規(guī)則vr期間,針對所得向量化圖形的每一新節(jié)點使用分級評估的方法,有可能應(yīng)用優(yōu)化規(guī)則or。在由圖形解釋器2遍歷圖形期間,可使用背景數(shù)據(jù)結(jié)構(gòu)來維持輸入的符號和所得圖形之間的映射以匯編所得圖形。
由根據(jù)本發(fā)明的方法和裝置1執(zhí)行的向量化任務(wù)可形成如下:
針對呈基于圖形的中間表示ir形式的給定源程序p,此程序p變換成呈相同基于圖形的中間表示形式的向量化版本/p/,以使得以下成立:
如果p采用類型t的值作為其輸入并產(chǎn)生類型r的值作為其輸出(即p:t→r),程序p的向量化版本是程序/p/:array[t]→array[r],使得如果ys=/p/(xs),對于所有i=0,……,長度(xs)-1,ys[i]=p(xs[i]),
其中t和r是中間表示ir所支持的任意類型,并且其中array[t]和array[r]分別是類型t和r的元素的陣列。
這兩個程序,即原始源程序p和程序p的向量化版本/p/可由相同的基于圖形的中間表示ir表示。