專利名稱:消除內(nèi)存訪問沖突的編譯裝置及其實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及的是一種計(jì)算機(jī)技術(shù)領(lǐng)域的裝置及方法,具體是一種消除內(nèi)存訪問沖 突的編譯裝置及其實(shí)現(xiàn)方法。
背景技術(shù):
編譯器是將高級語言轉(zhuǎn)換成機(jī)器可執(zhí)行語言的程序。編譯器在轉(zhuǎn)換過程中,需要 對程序中的變量在內(nèi)存的存放位置進(jìn)行分配,以避免內(nèi)存指令在執(zhí)行過程中因內(nèi)存沖突而 引發(fā)的流水線停頓,最終提高最終生成的機(jī)器可執(zhí)行程序的執(zhí)行效率。
在現(xiàn)有的處理器中,特別是DSP處理器,指令集通常會支持內(nèi)存操作數(shù)以及多樣 的尋址方式。由于在數(shù)據(jù)處理及其應(yīng)用中,內(nèi)存訪問操作是一個(gè)關(guān)鍵的環(huán)節(jié),因此,如何進(jìn) 行變量分配以最高效率地利用流水線是具有至關(guān)重要的意義的。另一方面,對于多數(shù)的DSP 架構(gòu),為了盡可能地提高內(nèi)存帶寬,通常支持多數(shù)據(jù)內(nèi)存架構(gòu)(一般是雙數(shù)據(jù)內(nèi)存架構(gòu)), 即指令可以在同一個(gè)時(shí)鐘周期并行訪問多個(gè)不同的數(shù)據(jù)內(nèi)存,但是不能在同一個(gè)時(shí)鐘周期 多次訪問一個(gè)數(shù)據(jù)內(nèi)存。
解決這種內(nèi)存沖突的方法有兩大類,一類是程序員手動(dòng)安排變量的存儲位置,特 別在嵌入式應(yīng)用中,手動(dòng)分配變量是一種非常有效的內(nèi)存分配方法,它使得程序在數(shù)據(jù)結(jié) 構(gòu)算法層面上消除了內(nèi)存沖突,但是當(dāng)程序結(jié)構(gòu)變得復(fù)雜時(shí),人為分配變量的方法經(jīng)常會 陷入局部最優(yōu)化的怪圈;另一類是通過編譯器進(jìn)行優(yōu)化,這種方法可以從全局角度進(jìn)行變 量存儲空間分配,但是現(xiàn)階段編譯器對于多數(shù)據(jù)存儲器架構(gòu)的變量分配策略仍然不完善。
經(jīng)對現(xiàn)有技術(shù)的文獻(xiàn)調(diào)查發(fā)現(xiàn),G. Grewal等在2006年IEEE Congress on Evolutionary Computation上采用遺傳算法并針對M56K這一類雙數(shù)據(jù)內(nèi)存的DSP結(jié)構(gòu)提 出了一種內(nèi)存分配策略。但是這種分配策略對于多于雙通道的內(nèi)存結(jié)構(gòu)無能為力,且當(dāng)內(nèi) 存訪問出現(xiàn)源操作數(shù)與目的操作數(shù)相同的情況,將不可避免地發(fā)生內(nèi)存沖突;同時(shí),這種分 配算法僅針對內(nèi)存變量為單一變量的情況有效,當(dāng)變量為數(shù)組等連續(xù)結(jié)構(gòu)時(shí),這種分配算 法將失效。發(fā)明內(nèi)容
本發(fā)明針對現(xiàn)有技術(shù)存在的上述不足,提供一種消除內(nèi)存訪問沖突的編譯裝置及 其實(shí)現(xiàn)方法,使得因內(nèi)存沖突而產(chǎn)生的額外開銷大大減小。
本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的
本發(fā)明涉及一種消除內(nèi)存訪問沖突的編譯裝置,包括前端語言分析單元、內(nèi)存變 量分析單元、內(nèi)存沖突消除單元和轉(zhuǎn)換輸出單元,其中前端語言分析單元與內(nèi)存變量分析 單元和內(nèi)存沖突消除單元相連接并傳輸由源程序轉(zhuǎn)換的中間語言序列、內(nèi)存模型與內(nèi)存操 作信息和源文件函數(shù)依賴樹,內(nèi)存變量分析單元與內(nèi)存沖突消除單元相連接并傳輸變量內(nèi) 存分配和內(nèi)存塊操作信息,內(nèi)存沖突消除單元與轉(zhuǎn)換輸出單元相連接并傳輸經(jīng)過內(nèi)存分配 優(yōu)化的中間語言信息,轉(zhuǎn)換輸出單元輸出最終的可執(zhí)行代碼。
所述的前端語言分析單元包括內(nèi)存配置組件、語言分析組件和文件函數(shù)關(guān)系組 件,其中內(nèi)存配置組件與內(nèi)存變量分析單元相連接并通過內(nèi)存操作信息表和內(nèi)存模型描 述表傳遞內(nèi)存操作信息和內(nèi)存模型,語言分析組件將源程序轉(zhuǎn)換為中間語言序列并分別傳 遞給內(nèi)存變量分析單元和內(nèi)存沖突消除單元,文件函數(shù)關(guān)系組件分析源程序中各文件的函 數(shù)依賴關(guān)系并以源文件函數(shù)依賴樹的形式傳遞給內(nèi)存沖突消除單元。
所述的內(nèi)存操作信息表包括數(shù)學(xué)運(yùn)算指令功能、操作數(shù)個(gè)數(shù)、操作數(shù)類型、尋址 模式、數(shù)據(jù)寬度以及執(zhí)行開銷;
所述的內(nèi)存模型描述表包括內(nèi)存的總大小、內(nèi)存分區(qū)的個(gè)數(shù)、各個(gè)內(nèi)存分區(qū)的起 始地址和大小。
所述的內(nèi)存變量分析單元讀取并分析記錄中間程序包含的所有的內(nèi)存變量及其 操作,該內(nèi)存變量分析單元包括內(nèi)存變量分配器和變量分析組件,其中內(nèi)存變量分配器 分析由前端語言分析單元生成的中間語言序列中的內(nèi)存變量信息并采用動(dòng)態(tài)分配或靜態(tài) 分配以變量內(nèi)存分配表的形式傳遞給變量分析組件,內(nèi)存變量分析單元通過變量內(nèi)存分配 表來分析每一個(gè)程序基本塊中的內(nèi)存操作信息并記錄到內(nèi)存塊操作表中。
所述的動(dòng)態(tài)分配是指內(nèi)存變量分配器通過唯一確定且記錄到變量內(nèi)存分配表中 的分配標(biāo)識以跟蹤記錄內(nèi)存變量的名稱以及生存周期信息;
所述的靜態(tài)分配是指內(nèi)存變量分配器標(biāo)識該變量生存周期為全局并記錄到變量 內(nèi)存分配表中;
所述的變量內(nèi)存分配表包括變量標(biāo)識、變量名、變量尺寸、變量生存周期、變量分 割以及內(nèi)存分配,其中變量標(biāo)識是區(qū)別不同變量的唯一標(biāo)識;變量尺寸記錄變量的大小 信息;變量生存周期記錄變量的生存周期,包括變量的分配時(shí)刻以及變量的釋放時(shí)刻,在初 始階段對于全局變量來說,分配時(shí)刻即程序開始,釋放時(shí)刻是程序終止;變量分割記錄變量 經(jīng)過變量分割變換模塊后的新信息,包括分割數(shù)量,每個(gè)分割的變量重命名,以及各分割的 內(nèi)存分配;
所述的內(nèi)存塊操作表中的每一個(gè)表項(xiàng)標(biāo)識基本塊中內(nèi)存操作的相關(guān)信息;相關(guān)信 息包含源內(nèi)存操作數(shù)的個(gè)數(shù),每個(gè)源內(nèi)存操作數(shù)的大小、變量類型和操作數(shù)更新方式,目 標(biāo)內(nèi)存操作數(shù)的個(gè)數(shù),每個(gè)目標(biāo)內(nèi)存操作數(shù)的大小、類型和操作數(shù)更新方式,內(nèi)存操作的類 型。
所述的內(nèi)存沖突消除單元包括變量分割組件、全局內(nèi)存分配組件和尋址模式選 擇組件,其中變量分割組件接收由前端語言單元傳遞的中間語言序列,通過分析中間程序 中存在的內(nèi)存沖突,對符合分割模型的變量進(jìn)行分割和重命名操作,同時(shí)更新變量內(nèi)存分 配表和內(nèi)存塊操作表信息并分別輸出至全局內(nèi)存分配組件和尋址模式選擇組件;全局內(nèi)存 分配組件讀取更新后的內(nèi)存分配表并根據(jù)其中的內(nèi)存變量的大小,生存周期采用優(yōu)化算法 對所有的內(nèi)存變量進(jìn)行分配并輸出至尋址模式選擇組件;尋址模式選擇組件根據(jù)內(nèi)存塊操 作表的信息,以基本塊為單位為數(shù)組形式的變量分配尋址模式。中間程序依次通過上述三 個(gè)組件的轉(zhuǎn)換后,內(nèi)存沖突消除單元輸出經(jīng)過內(nèi)存分配優(yōu)化的中間程序和一個(gè)變量鏈接文 件。
所述的變量鏈接文件包括每個(gè)內(nèi)存分區(qū)的標(biāo)識、內(nèi)存分區(qū)的起始地址、分配到該 內(nèi)存的變量信息;為了減小內(nèi)存的碎片,分配到各內(nèi)存分區(qū)的變量按照變量大小從大到小的順序依次進(jìn)行分配;變量信息包括變量名,變量的對齊模式、變量的大小。
所述的轉(zhuǎn)換輸出單元,輸入為變量鏈接表和中間程序,通過轉(zhuǎn)換最終輸出機(jī)器可 執(zhí)行的程序代碼。
本發(fā)明涉及上述裝置的實(shí)現(xiàn)方法,包括以下步驟
第一步用戶編譯源程序,對需要進(jìn)行內(nèi)存分配調(diào)度的變量結(jié)構(gòu)通過內(nèi)存變量分 配器進(jìn)行分配,使得編譯器能夠顯式識別所有需要內(nèi)存分配調(diào)度的變量;
第二步用戶使用本發(fā)明的一種簡潔、易行且直觀的內(nèi)存操作和內(nèi)存模型描述方 法對處理器支持的內(nèi)存操作、尋址模式以及內(nèi)存的模型進(jìn)行描述;用戶只需要按照規(guī)范填 入規(guī)范化的表格就可完成對內(nèi)存操作以及內(nèi)存模型的描述;
第三步將用戶對內(nèi)存操作以及內(nèi)存模型的描述信息提取出來,并分別組織成具 有良好接口、同時(shí)有利于編譯器解析的內(nèi)存操作信息結(jié)構(gòu)和特定內(nèi)存的內(nèi)存模型;
第四步用戶輸入需要編譯的源程序和源程序的文件依賴關(guān)系;根據(jù)用戶編譯的 文件依賴關(guān)系構(gòu)造一棵源文件函數(shù)依賴樹;
第五步源程序通過前端語言單元編譯轉(zhuǎn)換成編譯器通用的一種中間程序,在這 一步中,可以實(shí)施多種編譯優(yōu)化策略,包括對內(nèi)存操作的調(diào)度,以消除內(nèi)存操作之間存在的 因數(shù)據(jù)相關(guān)而產(chǎn)生的沖突;
第六步將由內(nèi)存變量分配器分配的內(nèi)存變量存放在變量內(nèi)存分配表中;
第七步結(jié)合第三步生成的內(nèi)存操作信息結(jié)構(gòu),以及第六步生成的變量內(nèi)存分配 表,分析中間程序中對應(yīng)內(nèi)存變量的操作行為,并以基本塊的形式構(gòu)建內(nèi)存塊操作表;
第八步根據(jù)第七步生成的內(nèi)存操作表中各個(gè)內(nèi)存變量的操作類型,通過變量分 割模塊檢測各個(gè)內(nèi)存塊操作表項(xiàng)是否匹配分割模型,對于符合模型的內(nèi)存變量進(jìn)行變量分 割和重命名;
第九步根據(jù)第四步生成的源文件函數(shù)依賴樹,找到發(fā)生分割重命名的基本塊與 變量,并找到依賴關(guān)系中該基本塊的所有后續(xù)基本塊中對此分割重命名變量的所有引用, 對它們也依次進(jìn)行更新;
第十步重復(fù)第八步和第九步,直到完成所有滿足模型的變量分割與重命名,同時(shí) 更新變量內(nèi)存分配表;
第十一步根據(jù)變量內(nèi)存分配表、內(nèi)存塊操作表通過全局優(yōu)化模塊進(jìn)行內(nèi)存變量 全局優(yōu)化分配;一種全局優(yōu)化的方法是采用遺傳算法計(jì)算出內(nèi)存分配的優(yōu)化解;根據(jù)算法 所找到的最優(yōu)解更新變量內(nèi)存分配表和內(nèi)存塊操作表;
第十二步根據(jù)內(nèi)存塊操作表的信息中各個(gè)內(nèi)存塊操作的源和目的操作數(shù)的更新 方式,結(jié)合第三步中的內(nèi)存操作結(jié)構(gòu)信息中描述的尋址模式,由尋址模式分配組件選擇合 適的尋址模式;
第十三步根據(jù)最終的變量內(nèi)存分配表生成變量鏈接文件;
第十四步根據(jù)變量鏈接文件將中間程序生成最終生成機(jī)器可執(zhí)行程序。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益的效果
本發(fā)明提供了通用的結(jié)構(gòu)化內(nèi)存指令描述和內(nèi)存結(jié)構(gòu)模型配置方法,僅需根據(jù)用 戶輸入的配置信息便能完成基于用戶內(nèi)存模型的內(nèi)存變量分配優(yōu)化。
1)相對于以往僅僅局限于雙數(shù)據(jù)內(nèi)存模型的內(nèi)存分配策略,本發(fā)明所提供的分配6算法不受該條件限制,可以支持多數(shù)據(jù)內(nèi)存模型,因此可以針對用戶自定義的內(nèi)存模型進(jìn) 行優(yōu)化分配。
2)本發(fā)明提出的編譯裝置不僅僅局限于現(xiàn)有技術(shù)對內(nèi)存操作的源操作數(shù)沖突分 析,而可以同時(shí)對內(nèi)存操作的源操作數(shù)之間、源和目的操作數(shù)之間進(jìn)行沖突分析,因此功能更加完善。
圖1是本發(fā)明系統(tǒng)示意圖。
圖2是本發(fā)明方法流程圖。
圖3是用于描述內(nèi)存操作的規(guī)范化的表格的結(jié)構(gòu)示意圖。
圖4是用于描述內(nèi)存模型的規(guī)范化的表格的結(jié)構(gòu)示意圖。
圖5是變量內(nèi)存分配表示意圖。
圖6是內(nèi)存塊操作表示意圖。
圖7是變量鏈接文件示意圖。
圖8是第三類分割模型的典型示例的分割示意圖。
圖9是第三類分割模型一般形式的分割示意圖。
圖10是第四類分割模型的典型示例的分割示意圖。
圖11是采用遺傳算法的內(nèi)存全局優(yōu)化流程圖。
圖12是實(shí)施例內(nèi)存分配解修復(fù)示意圖。
具體實(shí)施方式
下面對本發(fā)明的實(shí)施例作詳細(xì)說明,本實(shí)施例在以本發(fā)明技術(shù)方案為前提下進(jìn)行 實(shí)施,給出了詳細(xì)的實(shí)施方式和具體的操作過程,但本發(fā)明的保護(hù)范圍不限于下述的實(shí)施 例。
如圖1所示,本實(shí)施例包括前端語言分析單元、內(nèi)存變量分析單元、內(nèi)存沖突消 除單元和轉(zhuǎn)換輸出單元,其中前端語言分析單元與內(nèi)存變量分析單元和內(nèi)存沖突消除單 元相連接并傳輸由源程序轉(zhuǎn)換的中間語言序列、內(nèi)存模型與內(nèi)存操作信息和源文件函數(shù)依 賴樹,內(nèi)存變量分析單元與內(nèi)存沖突消除單元相連接并傳輸變量內(nèi)存分配和內(nèi)存塊操作信 息,內(nèi)存沖突消除單元與轉(zhuǎn)換輸出單元相連接并傳輸經(jīng)過內(nèi)存分配優(yōu)化的中間語言信息, 轉(zhuǎn)換輸出單元輸出最終的可執(zhí)行代碼。
所述的前端語言分析單元包括內(nèi)存配置組件、語言分析組件和文件函數(shù)關(guān)系組 件,其中內(nèi)存配置組件與內(nèi)存變量分析單元相連接并通過內(nèi)存操作信息表和內(nèi)存模型描 述表傳遞內(nèi)存操作信息和內(nèi)存模型,語言分析組件將源程序轉(zhuǎn)換為中間語言序列并分別傳 遞給內(nèi)存變量分析單元和內(nèi)存沖突消除單元,文件函數(shù)關(guān)系組件分析源程序中各文件的函 數(shù)依賴關(guān)系并以源文件函數(shù)依賴樹的形式傳遞給內(nèi)存沖突消除單元。
所述的內(nèi)存操作信息表包括數(shù)學(xué)運(yùn)算指令功能、操作數(shù)個(gè)數(shù)、操作數(shù)類型、尋址 模式、數(shù)據(jù)寬度以及執(zhí)行開銷。
所述的內(nèi)存模型描述表包括內(nèi)存的總大小、內(nèi)存分區(qū)的個(gè)數(shù)、各個(gè)內(nèi)存分區(qū)的起 始地址和大小。
所述的內(nèi)存變量分析單元讀取并分析記錄中間程序包含的所有的內(nèi)存變量及其操作,該內(nèi)存變量分析單元包括內(nèi)存變量分配器和變量分析組件,其中內(nèi)存變量分配器 分析由前端語言分析單元生成的中間語言序列中的內(nèi)存變量信息并采用動(dòng)態(tài)分配或靜態(tài) 分配以變量內(nèi)存分配表的形式傳遞給變量分析組件,內(nèi)存變量分析單元通過變量內(nèi)存分配 表來分析每一個(gè)程序基本塊中的內(nèi)存操作信息并記錄到內(nèi)存塊操作表中。所述的動(dòng)態(tài)分配是指內(nèi)存變量分配器通過唯一確定且記錄到變量內(nèi)存分配表中 的分配標(biāo)識以跟蹤記錄內(nèi)存變量的名稱以及生存周期信息。所述的靜態(tài)分配是指內(nèi)存變量分配器標(biāo)識該變量生存周期為全局并記錄到變量 內(nèi)存分配表中。所述的變量內(nèi)存分配表包括變量標(biāo)識、變量名、變量尺寸、變量生存周期、變量分 割以及內(nèi)存分配,其中變量標(biāo)識是區(qū)別不同變量的唯一標(biāo)識;變量尺寸記錄變量的大小 信息;變量生存周期記錄變量的生存周期,包括變量的分配時(shí)刻以及變量的釋放時(shí)刻,在初 始階段對于全局變量來說,分配時(shí)刻即程序開始,釋放時(shí)刻是程序終止;變量分割記錄變量 經(jīng)過變量分割變換模塊后的新信息,包括分割數(shù)量,每個(gè)分割的變量重命名,以及各分割的 內(nèi)存分配。所述的內(nèi)存塊操作表中的每一個(gè)表項(xiàng)標(biāo)識基本塊中內(nèi)存操作的相關(guān)信息;相關(guān)信 息包含源內(nèi)存操作數(shù)的個(gè)數(shù),每個(gè)源內(nèi)存操作數(shù)的大小、變量類型和操作數(shù)更新方式,目 標(biāo)內(nèi)存操作數(shù)的個(gè)數(shù),每個(gè)目標(biāo)內(nèi)存操作數(shù)的大小、類型和操作數(shù)更新方式,內(nèi)存操作的類 型。所述的內(nèi)存沖突消除單元包括變量分割組件、全局內(nèi)存分配組件和尋址模式選 擇組件,其中變量分割組件接收由前端語言單元傳遞的中間語言序列,通過分析中間程序 中存在的內(nèi)存沖突,對符合分割模型的變量進(jìn)行分割和重命名操作,同時(shí)更新變量內(nèi)存分 配表和內(nèi)存塊操作表信息并分別輸出至全局內(nèi)存分配組件和尋址模式選擇組件;全局內(nèi)存 分配組件讀取更新后的內(nèi)存分配表并根據(jù)其中的內(nèi)存變量的大小,生存周期采用優(yōu)化算法 對所有的內(nèi)存變量進(jìn)行分配并輸出至尋址模式選擇組件;尋址模式選擇組件根據(jù)內(nèi)存塊操 作表的信息,以基本塊為單位為數(shù)組形式的變量分配尋址模式。中間程序依次通過上述三 個(gè)組件的轉(zhuǎn)換后,內(nèi)存沖突消除單元輸出經(jīng)過內(nèi)存分配優(yōu)化的中間程序和一個(gè)變量鏈接文 件。所述的變量分割組件首先查找中間程序是否存在因源操作數(shù)和目標(biāo)操作數(shù)相同 (或者重疊)而存在的普通內(nèi)存分配無法解決的內(nèi)存沖突操作,分析這些內(nèi)存操作,并根據(jù) 分割模型將這些變量進(jìn)行特定分割以及重命名;分割完成后,根據(jù)源文件函數(shù)依賴樹更新 變量,同時(shí)更新內(nèi)存塊操作表和變量內(nèi)存分配表。所述的分割模型包括第一種模型源操作數(shù)是2個(gè)以上的內(nèi)存操作數(shù),分割該類 型的內(nèi)存操作模型首先引入一個(gè)臨時(shí)中間變量,原內(nèi)存操作會分裂成兩個(gè)2操作數(shù)的內(nèi)存 操作,第一個(gè)操作的目的操作數(shù)是臨時(shí)中間變量,第二個(gè)操作的一源操作數(shù)為此臨時(shí)變量; 第二種模型的兩源操作數(shù)是同一個(gè)變量,且內(nèi)存操作是加法、減法或除法,分割該類型的內(nèi) 存操作模型即將移位操作代替加法操、用0代替減法操作、當(dāng)內(nèi)存值不為0用1代替除法結(jié) 果;第三種模型的兩源操作數(shù)是一個(gè)數(shù)組的不同元素,分割該類型的內(nèi)存操作模型即以這 兩個(gè)元素的間隔為單位分割數(shù)組單元,并將相間隔的數(shù)組分割子塊拼接在一起,最終分割成兩個(gè)數(shù)組子塊;第四種模型內(nèi)存操作的一源操作數(shù)和目的操作數(shù)相同或則是一個(gè)數(shù)組的 不同元素,分割該類型的內(nèi)存操作模型即將目的操作數(shù)進(jìn)行重命名。所述的全局內(nèi)存分配組件,讀取變量內(nèi)存分配表的信息,根據(jù)變量分配代價(jià)通過 全局優(yōu)化算法計(jì)算出變量分配代價(jià)最小的值所對應(yīng)的變量分配策略,根據(jù)分配策略生成變 量鏈接文件。所述的變量分配代價(jià)是指由變量的大小、內(nèi)存操作的頻繁程度和內(nèi)存操作的執(zhí) 行代價(jià)三部分決定的,且變量分配代價(jià)與這三個(gè)部分成正比。所述的變量鏈接文件包括每個(gè)內(nèi)存分區(qū)的標(biāo)識、內(nèi)存分區(qū)的起始地址、分配到該 內(nèi)存的變量信息;為了減小內(nèi)存的碎片,分配到各內(nèi)存分區(qū)的變量按照變量大小從大到小 的順序依次進(jìn)行分配;變量信息包括變量名,變量的對齊模式、變量的大小。所述的尋址模式選擇組件,首先標(biāo)記內(nèi)存塊操作表中的各個(gè)內(nèi)存塊中源操作數(shù)和 目的操作數(shù)的更新方式,根據(jù)用戶輸入的內(nèi)存指令及尋址模式描述,分配給各個(gè)內(nèi)存塊合 適的尋址模式。所述的尋址模式支持正常自增減尋址模式、對稱尋址模式、比特反轉(zhuǎn)尋址模式和 循環(huán)尋址模式。所述的轉(zhuǎn)換輸出單元,輸入為變量鏈接表和中間程序,通過轉(zhuǎn)換最終輸出機(jī)器可 執(zhí)行的程序代碼。如圖2所示,上述編譯裝置具體通過以下方式實(shí)現(xiàn)編譯第一步用戶編譯源程序,對需要進(jìn)行內(nèi)存分配調(diào)度的變量結(jié)構(gòu)通過內(nèi)存變量分 配器進(jìn)行分配,使得編譯器能夠顯式識別所有需要內(nèi)存分配調(diào)度的變量;第二步用戶使用本實(shí)施例的一種簡潔、易行且直觀的內(nèi)存操作和內(nèi)存模型描述 方法對處理器支持的內(nèi)存操作、尋址模式以及內(nèi)存的模型進(jìn)行描述;用戶只需要按照規(guī)范 填入規(guī)范化的表格就可完成對內(nèi)存操作以及內(nèi)存模型的描述;第三步將用戶對內(nèi)存操作以及內(nèi)存模型的描述信息提取出來,并分別組織成具 有良好接口、同時(shí)有利于編譯器解析的內(nèi)存操作信息結(jié)構(gòu)和特定內(nèi)存的內(nèi)存模型;第四步用戶輸入需要編譯的源程序和源程序的文件依賴關(guān)系;根據(jù)用戶編譯的 文件依賴關(guān)系構(gòu)造一棵源文件函數(shù)依賴樹;第五步源程序通過前端語言單元編譯轉(zhuǎn)換成編譯器通用的一種中間程序,在這 一步中,可以實(shí)施多種編譯優(yōu)化策略,包括對內(nèi)存操作的調(diào)度,以消除內(nèi)存操作之間存在的 因數(shù)據(jù)相關(guān)而產(chǎn)生的沖突;第六步將由內(nèi)存變量分配器分配的內(nèi)存變量存放在變量內(nèi)存分配表中;第七步結(jié)合第三步生成的內(nèi)存操作信息結(jié)構(gòu),以及第六步生成的變量內(nèi)存分配 表,分析中間程序中對應(yīng)內(nèi)存變量的操作行為,并以基本塊的形式構(gòu)建內(nèi)存塊操作表;第八步根據(jù)第七步生成的內(nèi)存操作表中各個(gè)內(nèi)存變量的操作類型,通過變量分 割模塊檢測各個(gè)內(nèi)存塊操作表項(xiàng)是否匹配分割模型,對于符合模型的內(nèi)存變量進(jìn)行變量分 割和重命名; 第九步根據(jù)第四步生成的源文件函數(shù)依賴樹,找到發(fā)生分割重命名的基本塊與 變量,并找到依賴關(guān)系中該基本塊的所有后續(xù)基本塊中對此分割重命名變量的所有引用, 對它們也依次進(jìn)行更新;
第十步重復(fù)第八步和第九步,直到完成所有滿足模型的變量分割與重命名,同時(shí) 更新變量內(nèi)存分配表;第十一步根據(jù)變量內(nèi)存分配表、內(nèi)存塊操作表通過全局優(yōu)化模塊進(jìn)行內(nèi)存變量 全局優(yōu)化分配;一種全局優(yōu)化的方法是采用遺傳算法計(jì)算出內(nèi)存分配的優(yōu)化解;根據(jù)算法 所找到的最優(yōu)解更新變量內(nèi)存分配表和內(nèi)存塊操作表;第十二步根據(jù)內(nèi)存塊操作表的信息中各個(gè)內(nèi)存塊操作的源和目的操作數(shù)的更新 方式,結(jié)合第三步中的內(nèi)存操作結(jié)構(gòu)信息中描述的尋址模式,由尋址模式分配組件選擇合 適的尋址模式;第十三步根據(jù)最終的變量內(nèi)存分配表生成變量鏈接文件;第十四步根據(jù)變量鏈接文件將中間程序生成最終生成機(jī)器可執(zhí)行程序。如圖1所示為本實(shí)施例的方法流程圖,即用戶描述步驟,用戶通過本實(shí)施例提供 的內(nèi)存操作和內(nèi)存模型描述表進(jìn)行內(nèi)存操作和內(nèi)存模型的描述;前端語言轉(zhuǎn)換步驟,將源 程序轉(zhuǎn)換成統(tǒng)一的編譯器中間語言;內(nèi)存變量分析步驟,對中間程序進(jìn)行分析,記錄所有內(nèi) 存變量的信息,以及各個(gè)內(nèi)存塊的操作信息;內(nèi)存沖突消除步驟,搜索中間程序中的內(nèi)存操 作,根據(jù)分割模型分別進(jìn)行變量分割與重命名、全局內(nèi)存分配優(yōu)化并生成各個(gè)內(nèi)存變量的 鏈接信息以及分析內(nèi)存塊操作中源操作數(shù)和目標(biāo)操作數(shù)的更新方式選擇合適的尋址方式; 轉(zhuǎn)換輸出步驟,根據(jù)鏈接信息將中間程序轉(zhuǎn)換成機(jī)器可執(zhí)行的代碼。如圖3 圖14所示,本實(shí)例中,用戶對內(nèi)存操作和內(nèi)存模型配置的描述采用填空 和填寫表格的方式,其中內(nèi)存操作描述表與內(nèi)存模型描述表的示意圖分別如圖3和圖4所 示,本實(shí)例中用戶對配置的描述如下所示用戶的處理器支持32位的乘法指令,該指令有3個(gè)操作數(shù),且都為內(nèi)存操作數(shù),支持普通自加減尋址。內(nèi)存操作描述表如下
權(quán)利要求
1.一種消除內(nèi)存訪問沖突的編譯裝置,其特征在于,包括前端語言分析單元、內(nèi)存變 量分析單元、內(nèi)存沖突消除單元和轉(zhuǎn)換輸出單元,其中前端語言分析單元與內(nèi)存變量分析 單元和內(nèi)存沖突消除單元相連接并傳輸由源程序轉(zhuǎn)換的中間語言序列、內(nèi)存模型與內(nèi)存操 作信息和源文件函數(shù)依賴樹,內(nèi)存變量分析單元與內(nèi)存沖突消除單元相連接并傳輸變量內(nèi) 存分配和內(nèi)存塊操作信息,內(nèi)存沖突消除單元與轉(zhuǎn)換輸出單元相連接并傳輸經(jīng)過內(nèi)存分配 優(yōu)化的中間語言信息,轉(zhuǎn)換輸出單元輸出最終的可執(zhí)行代碼。
2.根據(jù)權(quán)利要求1所述的消除內(nèi)存訪問沖突的編譯裝置,其特征是,所述的前端語言 分析單元包括內(nèi)存配置組件、語言分析組件和文件函數(shù)關(guān)系組件,其中內(nèi)存配置組件與 內(nèi)存變量分析單元相連接并通過內(nèi)存操作信息表和內(nèi)存模型描述表傳遞內(nèi)存操作信息和 內(nèi)存模型,語言分析組件將源程序轉(zhuǎn)換為中間語言序列并分別傳遞給內(nèi)存變量分析單元和 內(nèi)存沖突消除單元,文件函數(shù)關(guān)系組件分析源程序中各文件的函數(shù)依賴關(guān)系并以源文件函 數(shù)依賴樹的形式傳遞給內(nèi)存沖突消除單元;所述的內(nèi)存操作信息表包括數(shù)學(xué)運(yùn)算指令功 能、操作數(shù)個(gè)數(shù)、操作數(shù)類型、尋址模式、數(shù)據(jù)寬度以及執(zhí)行開銷;所述的內(nèi)存模型描述表包 括內(nèi)存的總大小、內(nèi)存分區(qū)的個(gè)數(shù)、各個(gè)內(nèi)存分區(qū)的起始地址和大小。
3.根據(jù)權(quán)利要求1所述的消除內(nèi)存訪問沖突的編譯裝置,其特征是,所述的內(nèi)存變量 分析單元讀取并分析記錄中間程序包含的所有的內(nèi)存變量及其操作,該內(nèi)存變量分析單元 包括內(nèi)存變量分配器和變量分析組件,其中內(nèi)存變量分配器分析由前端語言分析單元 生成的中間語言序列中的內(nèi)存變量信息并采用動(dòng)態(tài)分配或靜態(tài)分配以變量內(nèi)存分配表的 形式傳遞給變量分析組件,內(nèi)存變量分析單元通過變量內(nèi)存分配表來分析每一個(gè)程序基本 塊中的內(nèi)存操作信息并記錄到內(nèi)存塊操作表中,其中動(dòng)態(tài)分配是指內(nèi)存變量分配器通 過唯一確定且記錄到變量內(nèi)存分配表中的分配標(biāo)識以跟蹤記錄內(nèi)存變量的名稱以及生存 周期信息;靜態(tài)分配是指內(nèi)存變量分配器標(biāo)識該變量生存周期為全局并記錄到變量內(nèi)存 分配表中;所述的變量內(nèi)存分配表包括變量標(biāo)識、變量名、變量尺寸、變量生存周期、變量 分割以及內(nèi)存分配,其中變量標(biāo)識是區(qū)別不同變量的唯一標(biāo)識;變量尺寸記錄變量的大 小信息;變量生存周期記錄變量的生存周期,包括變量的分配時(shí)刻以及變量的釋放時(shí)刻,在 初始階段對于全局變量來說,分配時(shí)刻即程序開始,釋放時(shí)刻是程序終止;變量分割記錄變 量經(jīng)過變量分割變換模塊后的新信息,包括分割數(shù)量,每個(gè)分割的變量重命名,以及各分割 的內(nèi)存分配;所述的內(nèi)存塊操作表中的每一個(gè)表項(xiàng)標(biāo)識基本塊中內(nèi)存操作的相關(guān)信息;相 關(guān)信息包含源內(nèi)存操作數(shù)的個(gè)數(shù),每個(gè)源內(nèi)存操作數(shù)的大小、變量類型和操作數(shù)更新方 式,目標(biāo)內(nèi)存操作數(shù)的個(gè)數(shù),每個(gè)目標(biāo)內(nèi)存操作數(shù)的大小、類型和操作數(shù)更新方式,內(nèi)存操 作的類型。
4.根據(jù)權(quán)利要求1所述的消除內(nèi)存訪問沖突的編譯裝置,其特征是,所述的內(nèi)存沖突 消除單元包括變量分割組件、全局內(nèi)存分配組件和尋址模式選擇組件,其中變量分割組 件接收由前端語言單元傳遞的中間語言序列,通過分析中間程序中存在的內(nèi)存沖突,對符 合分割模型的變量進(jìn)行分割和重命名操作,同時(shí)更新變量內(nèi)存分配表和內(nèi)存塊操作表信息 并分別輸出至全局內(nèi)存分配組件和尋址模式選擇組件;全局內(nèi)存分配組件讀取更新后的 內(nèi)存分配表并根據(jù)其中的內(nèi)存變量的大小,生存周期采用優(yōu)化算法對所有的內(nèi)存變量進(jìn)行 分配并輸出至尋址模式選擇組件;尋址模式選擇組件根據(jù)內(nèi)存塊操作表的信息,以基本塊 為單位為數(shù)組形式的變量分配尋址模式,中間程序依次通過上述三個(gè)組件的轉(zhuǎn)換后,內(nèi)存沖突消除單元輸出經(jīng)過內(nèi)存分配優(yōu)化的中間程序和一個(gè)變量鏈接文件,該變量鏈接文件包 括每個(gè)內(nèi)存分區(qū)的標(biāo)識、內(nèi)存分區(qū)的起始地址、分配到該內(nèi)存的變量信息;為了減小內(nèi)存 的碎片,分配到各內(nèi)存分區(qū)的變量按照變量大小從大到小的順序依次進(jìn)行分配;變量信息 包括變量名,變量的對齊模式、變量的大小。
5.根據(jù)權(quán)利要求1所述的消除內(nèi)存訪問沖突的編譯裝置,其特征是,所述的轉(zhuǎn)換輸出 單元,輸入為變量鏈接表和中間程序,通過轉(zhuǎn)換最終輸出機(jī)器可執(zhí)行的程序代碼。
6.一種根據(jù)上述任一權(quán)利要求所述裝置的實(shí)現(xiàn)方法,其特征在于,包括以下步驟 第一步用戶編譯源程序,對需要進(jìn)行內(nèi)存分配調(diào)度的變量結(jié)構(gòu)通過內(nèi)存變量分配器進(jìn)行分配,使得編譯器能夠顯式識別所有需要內(nèi)存分配調(diào)度的變量;第二步用戶使用本發(fā)明的一種簡潔、易行且直觀的內(nèi)存操作和內(nèi)存模型描述方法對 處理器支持的內(nèi)存操作、尋址模式以及內(nèi)存的模型進(jìn)行描述;用戶只需要按照規(guī)范填入規(guī) 范化的表格就可完成對內(nèi)存操作以及內(nèi)存模型的描述;第三步將用戶對內(nèi)存操作以及內(nèi)存模型的描述信息提取出來,并分別組織成具有良 好接口、同時(shí)有利于編譯器解析的內(nèi)存操作信息結(jié)構(gòu)和特定內(nèi)存的內(nèi)存模型;第四步用戶輸入需要編譯的源程序和源程序的文件依賴關(guān)系;根據(jù)用戶編譯的文件 依賴關(guān)系構(gòu)造一棵源文件函數(shù)依賴樹;第五步源程序通過前端語言單元編譯轉(zhuǎn)換成編譯器通用的一種中間程序,在這一步 中,可以實(shí)施多種編譯優(yōu)化策略,包括對內(nèi)存操作的調(diào)度,以消除內(nèi)存操作之間存在的因數(shù) 據(jù)相關(guān)而產(chǎn)生的沖突;第六步將由內(nèi)存變量分配器分配的內(nèi)存變量存放在變量內(nèi)存分配表中; 第七步結(jié)合第三步生成的內(nèi)存操作信息結(jié)構(gòu),以及第六步生成的變量內(nèi)存分配表,分 析中間程序中對應(yīng)內(nèi)存變量的操作行為,并以基本塊的形式構(gòu)建內(nèi)存塊操作表;第八步根據(jù)第七步生成的內(nèi)存操作表中各個(gè)內(nèi)存變量的操作類型,通過變量分割模 塊檢測各個(gè)內(nèi)存塊操作表項(xiàng)是否匹配分割模型,對于符合模型的內(nèi)存變量進(jìn)行變量分割和 重命名;第九步根據(jù)第四步生成的源文件函數(shù)依賴樹,找到發(fā)生分割重命名的基本塊與變量, 并找到依賴關(guān)系中該基本塊的所有后續(xù)基本塊中對此分割重命名變量的所有引用,對它們 也依次進(jìn)行更新;第十步重復(fù)第八步和第九步,直到完成所有滿足模型的變量分割與重命名,同時(shí)更新 變量內(nèi)存分配表;第十一步根據(jù)變量內(nèi)存分配表、內(nèi)存塊操作表通過全局優(yōu)化模塊進(jìn)行內(nèi)存變量全局 優(yōu)化分配;一種全局優(yōu)化的方法是采用遺傳算法計(jì)算出內(nèi)存分配的優(yōu)化解;根據(jù)算法所找 到的最優(yōu)解更新變量內(nèi)存分配表和內(nèi)存塊操作表;第十二步根據(jù)內(nèi)存塊操作表的信息中各個(gè)內(nèi)存塊操作的源和目的操作數(shù)的更新方 式,結(jié)合第三步中的內(nèi)存操作結(jié)構(gòu)信息中描述的尋址模式,由尋址模式分配組件選擇合適 的尋址模式;第十三步根據(jù)最終的變量內(nèi)存分配表生成變量鏈接文件;第十四步根據(jù)變量鏈接文件將中間程序生成最終生成機(jī)器可執(zhí)行程序。
全文摘要
一種計(jì)算機(jī)技術(shù)領(lǐng)域的消除內(nèi)存訪問沖突的編譯裝置及其實(shí)現(xiàn)方法,該裝置包括前端語言分析單元、內(nèi)存變量分析單元、內(nèi)存沖突消除單元和轉(zhuǎn)換輸出單元,前端語言分析單元與內(nèi)存變量分析單元和內(nèi)存沖突消除單元相連接并傳輸由源程序轉(zhuǎn)換的中間語言序列、內(nèi)存模型與內(nèi)存操作信息和源文件函數(shù)依賴樹,內(nèi)存變量分析單元與內(nèi)存沖突消除單元相連接并傳輸變量內(nèi)存分配和內(nèi)存塊操作信息,內(nèi)存沖突消除單元與轉(zhuǎn)換輸出單元相連接并傳輸經(jīng)過內(nèi)存分配優(yōu)化的中間語言信息,轉(zhuǎn)換輸出單元輸出最終的可執(zhí)行代碼。本發(fā)明使得因內(nèi)存沖突而產(chǎn)生的額外開銷大大減小。
文檔編號G06F9/50GK102043659SQ20101057731
公開日2011年5月4日 申請日期2010年12月8日 優(yōu)先權(quán)日2010年12月8日
發(fā)明者劉佩林, 孔吉, 肖賀 申請人:上海交通大學(xué)