專利名稱:通過雙色布石進(jìn)行寄存器分配和指定的制作方法
本發(fā)明涉及一種方法,在一個(gè)無向量或向量處理器中利用該方法,可以在源代碼到機(jī)器可執(zhí)行代碼的編譯期間分配及優(yōu)化寄存器指定。
在編譯程序構(gòu)造的標(biāo)準(zhǔn)著作中,艾迪生-韋斯利出版公司1977年版,由愛荷等人所寫的“編譯程序設(shè)計(jì)的原理”一書和斯普林格-弗萊格1984年版,由韋特等人所著的“編譯程序構(gòu)造”一書中都指出,計(jì)算機(jī)源語言,例如PASCAL或FORTRAN,到可由目標(biāo)機(jī)器執(zhí)行的代碼的轉(zhuǎn)換是通過一系列變換來完成的。首先對源符號串進(jìn)行詞法分析,為翻譯確定出原子單位或字,然后進(jìn)行句法分析,確定出這些字之間的語法關(guān)系。輸出是以“分析樹”的形式表示的。該分析樹被轉(zhuǎn)換為源代碼的中間語言表現(xiàn)形式。大多數(shù)編譯程序并不明顯地產(chǎn)生分析樹,而當(dāng)進(jìn)行句法分析時(shí)形成中間代碼。優(yōu)化施加于中間代碼,而后產(chǎn)生目標(biāo)機(jī)器可執(zhí)行代碼或目標(biāo)代碼。
編譯程序必須執(zhí)行的任務(wù)中包括計(jì)算資源的分配和指定,以便由源代碼指令流所確定的計(jì)算能夠高效率地完成。有效“資源”中包括計(jì)算設(shè)備,例如ALU,輸入/輸出,包括寄存器的存貯器,操作系統(tǒng)成份等等。編譯程序的優(yōu)化部分的任務(wù)是(a)縮短代碼長度,(b)在可能的地方增加執(zhí)行速度,(c)通過資源的高效率分配,將開銷降至最低程度。然后,資源使用或消耗程式一覽表被送入正在編譯的代碼中。
眾所周知,指令流可以被映成圖形結(jié)構(gòu),并可利用圖論特性的優(yōu)越性。代碼序列在局部優(yōu)化中可以用基本程序塊的圖形性質(zhì)進(jìn)行分析而在全程優(yōu)化中則可用程序塊的流程圖分析。
一個(gè)基本程序塊是一個(gè)連續(xù)語句序列。該序列只能從頭開始進(jìn)入,共且在進(jìn)入后語句是順序執(zhí)行的,除非到了結(jié)尾,否則不能停止或轉(zhuǎn)移。
流程圖描述了在基本程序塊之間的控制流。例如,流程圖將表示出基本程序塊之間迭代或遞歸計(jì)算所需的循環(huán),轉(zhuǎn)移和嵌套。
數(shù)據(jù)相關(guān)性的無回路有向圖(DAG)是一數(shù)據(jù)結(jié)構(gòu),用于分析基本程序塊。例如,a=S+C由作為起始節(jié)點(diǎn)的b+c表達(dá),每一節(jié)點(diǎn)通過各自的邊連接于公共節(jié)點(diǎn)c。這不是流程圖,雖然流程圖的每個(gè)節(jié)點(diǎn)(基本程序塊)可以由一個(gè)DAG表示。
“活變量分析”涉及一組技術(shù),該組技術(shù)用于確定一個(gè)變量名是否具有一個(gè)經(jīng)常在以后的計(jì)算中可能用到的值。如果一個(gè)變量名在基本程序塊中重新定義之前被使用,或者“活”著離開這一程序塊而未在程序塊中被重新定義,則該變量被認(rèn)為是“活”著進(jìn)入程序塊的。因此,一數(shù)值在寄存器中被計(jì)算之后,并假定在一基本程序塊中已被使用過,如果它在程序塊的結(jié)尾“死”了的話,則沒必要存貯該數(shù)值。也即如果全部寄存器都已裝滿,而還需要另一個(gè)寄存器,則可指定當(dāng)前含有“死”值的寄存器。
從概念上講,第一個(gè)編譯程序變換是將源代碼串映成流程圖,其流程圖的每一節(jié)點(diǎn)都是基本程序塊,其控制及數(shù)據(jù)路徑關(guān)系由流程圖的有向邊確定。資源分配和指定的優(yōu)化工作可以首先在局部或基本程序塊這級進(jìn)行,然后再在全程流程圖一級進(jìn)行。
在局部優(yōu)化中,每一基本程序塊被當(dāng)作一個(gè)獨(dú)立的單位,并在優(yōu)化中不考慮程序塊的內(nèi)容。為基本程序塊建立的數(shù)據(jù)相關(guān)圖被變換并用以產(chǎn)生最終機(jī)器代碼。然后被廢棄,再進(jìn)行下一個(gè)基本程序塊?!皵?shù)據(jù)相關(guān)圖”是一個(gè)基本程序塊中的一種圖論特征表示。由于一個(gè)基本程序塊不能包含循環(huán),因而所有“數(shù)據(jù)相關(guān)圖”的基本塊可以由DAG來表示。而DAG不必是樹。作為示例,如果一個(gè)基本程序塊由兩條計(jì)算語句x=u+v和y=u+w組成,雖然它是無回路的,DAG仍將不是樹。最后,全程優(yōu)化執(zhí)行一個(gè)流程圖的全程重排,并在基本程序塊之間提供上下文信息。
計(jì)算機(jī)包括主存貯器,其最快的形式是最昂貴的。若干有限的物理寄存器存貯操作數(shù),以備計(jì)算和控制的立即使用。從寄存器到寄存器操作的計(jì)算機(jī)指令是最快速執(zhí)行的。如果無法獲得一個(gè)寄存器,則中間結(jié)果必須被裝入主存貯器,大部分程序體及數(shù)據(jù)定位于該主存,或者當(dāng)一個(gè)寄存器可以得到時(shí),將中間結(jié)果從所述主存轉(zhuǎn)入該寄存器。從主存到寄存器的裝入及從寄存器到主存貯器的存貯需要更長一些的時(shí)間。因此,在評價(jià)一個(gè)流程圖或基本程序塊時(shí),目標(biāo)之一是在寄存器中保存盡可能多的計(jì)算名即變量,或保證在需要時(shí)可以獲得一個(gè)寄存器。
寄存器分配涉及到在軟件流中的名中,指定哪些應(yīng)當(dāng)位于寄存器中(即所需寄存器數(shù));同時(shí),而指定則是遵循一基礎(chǔ)模式,定則,或模型把寄存器指定給節(jié)點(diǎn)的步驟。在先有技術(shù)中使用的分配策略是把指定固定化;即,將目標(biāo)程序中的某些特定類型的量指定給確定的寄存器。例如,子程序連接可指定給第一組寄存器,基地址到第二組寄存器,算術(shù)計(jì)算到第三組寄存器,運(yùn)行時(shí)棧指針到一固定寄存器,等等。這種固定映象的缺陷是寄存器使用不能動(dòng)態(tài)地適合運(yùn)行的需求。這就是說,某些寄存器根本沒有用到,或使用過度,或使用不足。
全程寄存器分配與下述觀察結(jié)果有關(guān),即大多數(shù)程序?qū)⑺鼈兊拇蟛糠謺r(shí)間用在內(nèi)循環(huán)上。因此,一個(gè)指定方法是,在一固定的寄存器中,貫穿一個(gè)循環(huán)保存一個(gè)經(jīng)常使用的變量名。為此,其策略是可以指定一固定數(shù)量的寄存器來容納每個(gè)內(nèi)循環(huán)中的最活躍的名。所選擇的名在不同的循環(huán)中可以不同。其它非專用的寄存器可以用來容納一個(gè)程序塊的局部數(shù)值。這種分配和指定的缺點(diǎn)是無法確定作為全寄存器分配所能利用的寄存器的普遍適用的數(shù)量。
珀格蒙出版有限公司1981年版的《計(jì)算機(jī)語言》第6卷第47至57頁上蔡廷等的“通過著色進(jìn)行寄存器分配”(Register Allocation Via Coloring),以及SIGPLAN情報(bào)1982年版第98至105頁上的編譯程序構(gòu)造論文集,82年SIGPLAN科研報(bào)告匯編中蔡廷的“通過圖的著色進(jìn)行寄存器分配和轉(zhuǎn)貯(Register Allocation and Spilling Via Grap Coloring)”描述了一種在全過程范圍的全程寄存器分配方法。在蔡廷的文章中,全部寄存器除了一個(gè)以外,被看作是一均勻池中的一部分,并且所有計(jì)算在同一基礎(chǔ)上對寄存器進(jìn)行竟?fàn)?。確實(shí)不保留寄存器子集。
蔡廷指出,由于使用裝入和存貯指令的代價(jià)高于寄存器到寄存器的指令,因而應(yīng)在寄存器中保存盡可能多的計(jì)算,而不是將它們存入存貯器。蔡廷指出利用在中間語言中允許使用無限數(shù)量的寄存器這一優(yōu)越性(即將這些不定數(shù)量的寄存器看作是一個(gè)池),以使程序中的裝入及存貯數(shù)量降至最小是代碼產(chǎn)生及優(yōu)化的責(zé)任。
蔡廷文章中的關(guān)鍵性意見是,寄存器分配可以作為圖的著色問題進(jìn)行分析。圖的著色是對其每個(gè)節(jié)點(diǎn)指定一種顏色,方式是如果兩個(gè)節(jié)點(diǎn)是相鄰的(由圖的一個(gè)邊連接),它們的顏色就不同。圖的“色數(shù)”是任何著色中彩色的最小數(shù)。在蔡廷的文章中,寄存器分配利用了名為“寄存器干擾圖”的構(gòu)造。如果存于機(jī)器寄存器中的兩個(gè)計(jì)算或名在程序中的任何一點(diǎn)同時(shí)“活著”的話,則它們被稱為互相“干擾”。
蔡廷的圖著色方法包括步驟(a)根據(jù)代碼的一個(gè)特定文本順序?yàn)槠渲械拿⒁粋€(gè)干擾圖;(b)確定圖的色數(shù),如果色數(shù)不超過可用寄存器數(shù),則對圖著色(將寄存器指定給節(jié)點(diǎn)),否則,應(yīng)用棄置具有最高輸入/輸出度的節(jié)點(diǎn)的方法將圖簡化;(c)重復(fù)步驟(b),直至兩個(gè)數(shù)值達(dá)到一致;以及(d)通過在編譯生成的代碼流中加入適當(dāng)?shù)膶懭雰?nèi)存指令和裝入寄存器指令,說明并管理寄存器轉(zhuǎn)貯。
本發(fā)明的一個(gè)目的是在無向量或向量處理器中源程序到可執(zhí)行代碼的編譯期間優(yōu)化分配和指定寄存器,從而將轉(zhuǎn)儲量降至最小(進(jìn)出存貯器的引用次數(shù))。分配和指定寄存器以使轉(zhuǎn)儲代碼的數(shù)量在基本程序塊內(nèi)部的文本的各種排列中保持不變是一個(gè)相關(guān)的目的。
這些目的用下述方法來達(dá)到,即在一個(gè)無向量或向量處理器中將源代碼編譯成可執(zhí)行代碼的優(yōu)化階段,對不含稱為“基本程序塊”的分支的代碼區(qū)域進(jìn)行優(yōu)化。每個(gè)基本程序塊具有定義計(jì)算的語句。并且,每個(gè)處理器具有用于存貯可執(zhí)行代碼序列和數(shù)據(jù)的存貯器,和用于訪問所述存貯器并執(zhí)行任何被訪問代碼的裝置。在處理器中,存貯器被設(shè)計(jì)成兩級模式的,包括有限個(gè)數(shù)P的寄存器和一個(gè)相對說來無限的內(nèi)存貯器。寄存器的存取時(shí)間快于內(nèi)存貯器。
本發(fā)明方法包括處理器實(shí)現(xiàn)的步驟(a)確定一基本程序塊的數(shù)據(jù)相關(guān)圖特性,和(b)參照基本程序塊中的所有計(jì)算,在確定的數(shù)據(jù)相關(guān)圖上實(shí)行“兩色石子游戲”試探法來分配P個(gè)寄存器中的P個(gè)以充分利用這兩級存儲模型。
進(jìn)一步達(dá)到上述目的用于局部和全程寄存器優(yōu)化的方法,其步驟除了上述(a)和(b)以外,還包括(c)進(jìn)行活變量分析,并相應(yīng)地產(chǎn)生一個(gè)假定循環(huán)為最有效優(yōu)化實(shí)體的全程寄存器分配和指定。
與蔡廷的“寄存器干擾圖”不同,數(shù)據(jù)相關(guān)圖對于文本的排序是不變的。本發(fā)明的方法將分配處理劃分為兩步。第一步是獲得一個(gè)令人滿意的局部分配,第二步是利用這個(gè)局部分配得到一全程分配。在數(shù)據(jù)相關(guān)圖上進(jìn)行的“兩色石子游戲”試探法確?;境绦驂K中的轉(zhuǎn)儲降至最小。這一試探法包括在對應(yīng)于基本程序塊的圖上進(jìn)行紅蘭兩色石子游戲。對存貯器的訪問以在圖上放置藍(lán)色卵石表示,而對寄存器的訪問以在圖上放置紅色卵石表示。這種模型準(zhǔn)確地控制轉(zhuǎn)儲。相同的相關(guān)圖永遠(yuǎn)產(chǎn)生相同的分配。
有意義的是,在執(zhí)行局部分配時(shí),并不使用全部可用寄存器。實(shí)際上,某些寄存器被用來裝存全程信息。與其相關(guān),第二個(gè)主要步驟是利用這些寄存器執(zhí)行全程分配,進(jìn)一步減少對存貯器的訪問。為那些全程寄存器選擇的變量是為了最大限度地減少整個(gè)程序中的裝入及存貯操作量。
以本發(fā)明來說,石子游戲是一個(gè)利用DAG的單人游戲。玩者接受兩類卵石;紅的和藍(lán)的。藍(lán)石數(shù)是無限制的,而紅石的限制數(shù)為P。開始時(shí),DAG的全部源點(diǎn)都置為藍(lán)色。玩者可以走下列棋步的任何一步(1)放置一紅石與藍(lán)石相鄰;
(2)放置一藍(lán)石與紅石相鄰;
(3)放置一紅石在節(jié)點(diǎn)上,當(dāng)且僅當(dāng)全部先行節(jié)點(diǎn)都為紅石時(shí);
(4)從一個(gè)節(jié)點(diǎn)的先行節(jié)點(diǎn)之一取一紅石滑動(dòng)到該節(jié)點(diǎn),當(dāng)且當(dāng)在滑動(dòng)之前這些先行節(jié)點(diǎn)都為紅石;或(5)在任何時(shí)候除去一紅石。
這里,藍(lán)石是存貯單元,而紅石是寄存器。在這種情況下,規(guī)則(1)是從存貯器中取數(shù)送入寄存器,規(guī)則(2)是寫入存貯器,規(guī)則(3)是將一個(gè)計(jì)算的值送入一個(gè)新寄存器,規(guī)則(4)是將一個(gè)計(jì)算的值送入一個(gè)以前存放該計(jì)算所用的計(jì)算數(shù)的寄存器中。在寄存器分配的意義中,該游戲的目的是將轉(zhuǎn)儲量降至最小,其中轉(zhuǎn)儲是指規(guī)則(1)或(2)的應(yīng)用。
卵石游戲已經(jīng)在先有技術(shù)中描述過,例如1980年5月26日至28日在日本箱根召開的第5屆IBM“計(jì)算機(jī)科學(xué)的數(shù)學(xué)基礎(chǔ)(5th IBM Symposinm on the Mathenm tical Foundations of computer Science)”科研討論會上皮彭杰的《布石(Pebbling)》。皮彭杰指出,“布石”已找到了其應(yīng)用范圍,其中包括編譯程序,尤其是代碼生成及優(yōu)化。皮彭杰采用的游戲是一單色游戲,有時(shí)稱為“黑卵石游戲”。
無可否認(rèn),“黑卵石游戲”已被用于空間時(shí)間交換的研究?!翱臻g時(shí)間交換”涉及到由可資利用的寄存器數(shù)與完成計(jì)算所需的時(shí)間的乘積導(dǎo)致某些因素改變所造成的后果。該乘積是一個(gè)與數(shù)據(jù)相關(guān)圖中的節(jié)點(diǎn)數(shù)成正比的量。如果只用一種顏色表示寄存器,則對于任意給出的計(jì)算,皮彭杰問道“為了執(zhí)行所述計(jì)算,什么是所要求的最小寄存器數(shù)?”可是,皮彭杰的單色卵石游戲既沒有講授也沒有提出這種獨(dú)創(chuàng)的方法。具有重大意義的是,本發(fā)明通過在DAG上的兩色石子布設(shè)對寄存器的分配和指定來處理局部優(yōu)化,并以循環(huán)為基礎(chǔ)來處理全程優(yōu)化,與正流行的圖著色方法相比,綜合該兩項(xiàng)優(yōu)化可將轉(zhuǎn)儲降至最小。
圖1和圖2分別說明了三個(gè)基本程序塊組成的計(jì)算序列和圖1中程序塊的數(shù)據(jù)相關(guān)圖解釋,在第一個(gè)例子中利用這兩個(gè)圖解釋了根據(jù)本發(fā)明運(yùn)用石子試探法進(jìn)行局部寄存器分配。
圖3表示根據(jù)先有技術(shù)的圖1中序列的寄存器干擾圖。
圖4表示根據(jù)先有技術(shù),為了允許著色,將圖3中的節(jié)點(diǎn)減少了若干以后的干擾圖。
圖5和圖6表示根據(jù)本發(fā)明運(yùn)用試探法進(jìn)行局部寄存器分配的第二個(gè)例子中的計(jì)算序列,數(shù)據(jù)相關(guān)圖,和寄存器活動(dòng)序列。
圖7是根據(jù)本發(fā)明的全程分配步驟的描述設(shè)制的流程圖。
最佳實(shí)施例的描述將首先利用卵石游戲試探法算法的描述處理寄存器的分配和指定以達(dá)到局部優(yōu)化,隨后討論全程分配。
局部優(yōu)化應(yīng)用了“卵石游戲”試探法。就本發(fā)明的目的而言,“試探法”是一個(gè)以直覺為基礎(chǔ),以機(jī)器來實(shí)現(xiàn)的過程或算法,用于達(dá)到一個(gè)預(yù)期地接近最優(yōu)的結(jié)果。
參看圖1至5和6,這里展示了劃分成基本程序塊的計(jì)算序列,并由與其相配的DAG型數(shù)據(jù)相關(guān)圖表示。對第一次近似的試探如下1、檢驗(yàn)DAG,并標(biāo)識P個(gè)支配節(jié)點(diǎn),即具有最大后繼點(diǎn)的那些節(jié)點(diǎn),其中P是紅卵石數(shù)。與每個(gè)具有P個(gè)節(jié)點(diǎn)的集合有關(guān)的“費(fèi)用”是該集合中非紅色節(jié)點(diǎn)數(shù)。在這些集合中選擇一個(gè)集合,它具有費(fèi)用/支配節(jié)點(diǎn)數(shù)比的最小值。這就為計(jì)算定義了一個(gè)“期望”區(qū)域。
2、下一步,計(jì)算每個(gè)節(jié)點(diǎn)的覆蓋費(fèi)用,以找出一個(gè)“令人滿意”的計(jì)算,所述節(jié)點(diǎn)是上述所選集合的緊隨后繼節(jié)點(diǎn)。覆蓋費(fèi)用有兩個(gè)參數(shù)。其中包括(a)未被紅石布設(shè)的先行節(jié)點(diǎn)數(shù),以及(b)從緊隨先行節(jié)點(diǎn)到本節(jié)點(diǎn)的最小滑動(dòng)費(fèi)用。與其相關(guān),滑動(dòng)費(fèi)用是(a)中的先行點(diǎn)的最小出度。所謂“出度”,是指尚未計(jì)算過的后繼節(jié)點(diǎn)數(shù)。作為插句,每執(zhí)行一次計(jì)算,未被計(jì)算的后繼點(diǎn)數(shù)就改變一次。因此,舉例說,參照圖2中的基本程序塊1,節(jié)點(diǎn)塊具有(2,1)的覆蓋費(fèi)用。這里,先行節(jié)點(diǎn)數(shù)是2(節(jié)點(diǎn)x和y),而初始時(shí)的滑動(dòng)費(fèi)用(對未被計(jì)算的后繼節(jié)點(diǎn)的出度)對x是1,對y是3。選擇其中具有較小滑動(dòng)費(fèi)用的節(jié)點(diǎn)。一旦覆蓋費(fèi)用被算出,算法的下一步將要執(zhí)行的計(jì)算選擇具有最小覆蓋費(fèi)用的那一步。
3、一旦確定了一個(gè)“令人滿意”的計(jì)算,紅色石子從屬節(jié)點(diǎn)便采用滑動(dòng)卵石的規(guī)則。如果沒有紅卵石可以滑動(dòng),則使用一個(gè)當(dāng)前不在DAG上的紅卵石,如果有這樣一個(gè)紅卵石存在的話。
4、如果寄存器不可用,則中間結(jié)果必須寫到存貯器,并在需要時(shí)送數(shù)回到寄存器。
參看圖2,節(jié)點(diǎn)t1依賴于源節(jié)點(diǎn)x和y,同時(shí)節(jié)點(diǎn)q依賴于節(jié)點(diǎn)y和z。依次,結(jié)果v依賴于節(jié)點(diǎn)t1和y。假設(shè)有三個(gè)寄存器r0,r1,和r2是可用的,選擇一個(gè)由三個(gè)節(jié)點(diǎn)組成的支配者。支配者只可能是集合{x,y,z}。因此稱它為“期望”集。
節(jié)點(diǎn)t1和q是所選支配集合的后繼節(jié)點(diǎn)。對于每個(gè)節(jié)點(diǎn),算出它的覆蓋費(fèi)用。因?yàn)閠1的兩個(gè)先行節(jié)點(diǎn)未被卵石布設(shè),所以t1的覆蓋費(fèi)用是(2,1),且由于x只有一個(gè)未被計(jì)算的后繼點(diǎn),因而最小滑動(dòng)費(fèi)用是1。這種情況同樣用于q。由于t1和q的覆蓋費(fèi)用是相同的,因而可任意選擇一節(jié)點(diǎn),例如選t1。為了計(jì)算t1,紅卵石必須首先放在x和y處。下一步,將x上的紅石滑動(dòng)到t1,因?yàn)閤的滑動(dòng)費(fèi)用是1?,F(xiàn)在,用將t1上的紅石滑動(dòng)到v上的辦法計(jì)算節(jié)點(diǎn)v。在裝入z之后,將y上的卵石滑動(dòng)到q,從而計(jì)算出節(jié)點(diǎn)q。
以上分析表明,給出足量的寄存器,可以相當(dāng)順利地進(jìn)行調(diào)度。
現(xiàn)在參看圖3和4,其中展示了一個(gè)寄存器干擾圖,該圖根據(jù)先有技術(shù)中蔡廷所參照的圖1所示的計(jì)算序列。圖3中的圖在技術(shù)上是可著三色的??墒牵绻挥袃蓚€(gè)寄存器是可用的(r0,r1),則本質(zhì)上不可能將圖著色。除去并廢棄具有最高度數(shù)的節(jié)點(diǎn)是有必要的。在這方面,圖4是一個(gè)先有技術(shù)的例子,其中干擾圖的節(jié)點(diǎn)x和y被除去??墒牵瑸榱顺蔀橹p色的圖,節(jié)點(diǎn)z也將被除去。這三個(gè)節(jié)點(diǎn)的廢棄意味著可觀的轉(zhuǎn)儲代碼量。反之,如果只有兩個(gè)寄存器可用,并根據(jù)圖2中的數(shù)據(jù)相關(guān)圖將它們指定,則只要求三個(gè)裝入和一個(gè)存貯即可。
現(xiàn)在參看圖5和6,再一次假定有三個(gè)寄存器和三個(gè)紅卵石是可用的。根據(jù)算法,節(jié)點(diǎn)u,v和w將被選作為支配節(jié)點(diǎn)。覆蓋費(fèi)用(x)=(2,1),而覆蓋費(fèi)用(y)=(2,2)。因此,算法選擇計(jì)算節(jié)點(diǎn)x的值。由于覆蓋費(fèi)用=(c1,c2),則對于c1=2,算法對當(dāng)前前沿計(jì)算轉(zhuǎn)儲節(jié)點(diǎn)(x)。前沿是這樣的節(jié)點(diǎn)集合,即集合中的每個(gè)節(jié)點(diǎn)v上都有一卵石,并且至少有一個(gè)v的后繼點(diǎn)未被計(jì)算過。這就稱為前沿。
由于沒有在DAG上放置紅卵石,因而它是空的。由于該方法可以將自由紅卵石置于節(jié)點(diǎn)u和v。并且,由于c2=1,節(jié)點(diǎn)u處的寄存器被滑動(dòng)到節(jié)點(diǎn)x,從而完成了一次計(jì)算。再選擇另一個(gè)支配集。這次節(jié)點(diǎn)P被作為計(jì)算的目標(biāo),因?yàn)楦采w費(fèi)用(P)=(0,1)。如前所示,c2=1。意即節(jié)點(diǎn)x上的寄存器可滑動(dòng)到節(jié)點(diǎn)P。
現(xiàn)在可以清楚地看到,使用該方法將必須計(jì)算節(jié)點(diǎn)y,然后是節(jié)點(diǎn)z,因?yàn)闆]有其它選擇可用。參看圖5??勺⒁獾街粓?zhí)行了三個(gè)裝入,并且P和z已經(jīng)在寄存器中。這就是說如果其中之一在以后被使用,則不需要任何從存貯器到寄存器的裝入。
重要的是,代碼在序列中無論怎樣排列,數(shù)據(jù)相關(guān)圖是保持不變的。由這種方法所產(chǎn)生的結(jié)果是不依賴文本順序的。
還可以看到,如果著色的先有技術(shù)已經(jīng)應(yīng)用于圖6所示的代碼,則裝入數(shù)應(yīng)該是4,而本發(fā)明方法的裝入數(shù)只有3,這是最小的可能數(shù)。
在本發(fā)明中,全程優(yōu)化首先涉及到對每個(gè)基本程序塊的局部分配,利用可用寄存器總數(shù)的一部分,并按基本程序塊在流程圖中出現(xiàn)的順序執(zhí)行該分配。然后,假定循環(huán)是最關(guān)鍵的實(shí)體,利用剩余的寄存器存放全程信息。
參看圖7,其中的流程圖從一起始節(jié)點(diǎn)開始,在一結(jié)束節(jié)點(diǎn)終結(jié)。
假設(shè)已經(jīng)完成了局部分配,全程步驟檢驗(yàn)在每一局部分配中裝入寄存器和存入器存的那些變量。對于這些變量,計(jì)算它們每一個(gè)的裝入寄存器和存入內(nèi)存的次數(shù)。這一計(jì)數(shù)用所謂的嵌套深度加權(quán),嵌套深度是指流程圖中圍繞該變量的循環(huán)的次數(shù)而言的。從這個(gè)表中選擇具有最高值的變量保存于全程寄存器。重復(fù)這項(xiàng)處理,直至沒有寄存器可用了,或是表已空時(shí)為止。
全程分配的這一模式和步驟有一些變型。例如,輸入全程寄存器的變量是那些在表示對應(yīng)局部分配的流程圖中具有最大生命期的變量。即,局部分配代替了輸入程序中相應(yīng)的基本程序塊。然后,對于全部那些對基本程序塊不是局部的變量計(jì)算它們的生命期。根據(jù)使用次數(shù)和嵌套深度斷路關(guān)系(nesting level-breaking ties),生命期被用來確定將哪個(gè)變量分配給全程寄存器。
當(dāng)出現(xiàn)這樣的情況時(shí),即變量在循環(huán)的底部在不同寄存器中被轉(zhuǎn)儲而在循環(huán)的頂部卻要用著這些變量時(shí),可將循環(huán)展開直至不需要傳送或傳送次數(shù)低于預(yù)定的界限。
算法Local-Alloc(DAG,num-registers)Current-frontier=sources(D)(置前沿于DAG的源點(diǎn))current-configuration=(empty,current-frontier);while(number of uncomputed nodes not zero)doFind a set S,of P nodes,in the currentfrontier,such that move-eost(s)/(number of nodes that S dominates)in minimized。
(找出一個(gè)令人滿意的計(jì)算去作)compute the cover covt of every node in FS(S);
Let u be the node in FS(S) with the smalle tcover cost,where cover-cost(u)=(c1,c2);
(為計(jì)算找出可能的轉(zhuǎn)儲節(jié)點(diǎn))ifc1>0 then for each node v in spill-nodes(u,s),if v is not pebbled blue then place a blue pebble on V.Remove the red pebble from V.
while not all predecessors of u are pebbled red doput a free red pebble on a pvedecessors of unot pebbled red.
(布石計(jì)算)ifc2=1then slide the node with slide-cost=1to u elseif any free red pebbles,then put free pebble on uelse begin
let v be the pcedceessor of u with thesmallest slide costif slide-cost(v)>0,put a blue pebble on v;
slide v to u;
end;
od;
本發(fā)明的這一方法可用于IBM/370系統(tǒng)的無向量處理器,或用于像IBM3090這樣的向量機(jī)。在向量處理器中,最好以高速運(yùn)行計(jì)算。這就是說,運(yùn)算訪問存貯器應(yīng)該越少越好,因?yàn)榇尜A器訪問與對向量寄存器的訪問相比要慢得多。上述卵石游戲試探法可以用于確定向量寄存器數(shù),其步驟如下。首先,選擇一個(gè)初始向量寄存器數(shù),然后對應(yīng)欲被執(zhí)行的向量計(jì)算的數(shù)據(jù)相關(guān)圖DAG,施行所述試探法。下一步,對這一固定的寄存器數(shù)計(jì)算所執(zhí)行的裝入/存貯總數(shù)。此后,將該數(shù)與需要的訪問次數(shù)的下界相比較;即,源點(diǎn)數(shù)加上收點(diǎn)數(shù)。如果執(zhí)行了太多的訪問,則將寄存器數(shù)增加一倍,并再次應(yīng)用本算法。如果達(dá)到了下界,則將寄存器數(shù)減半,并重復(fù)本算法,直到確定了最佳寄存器數(shù)。這與在向量寄存器數(shù)上執(zhí)行一個(gè)折半查找是等效的,并利用卵石游戲試探法確定查找參數(shù)。
本發(fā)明的另一個(gè)擴(kuò)充是其在某些機(jī)器中的應(yīng)用,在這些機(jī)器中,計(jì)算可以與裝入和對存貯器的存貯重疊。由于本試探法試圖在當(dāng)前存于寄存器中的數(shù)據(jù)基礎(chǔ)上作盡可能多的計(jì)算,它就必定會在計(jì)算和存貯器訪問之間提供一個(gè)良好的重疊方式。
將本發(fā)明嵌入一個(gè)高級語言編譯程序的優(yōu)化部分中可以很便利地運(yùn)行,例如嵌入PL/I,F(xiàn)ORTRAN,COBOL,等等,并在諸如BM/370系統(tǒng)中運(yùn)行,這已在1968年9月3日發(fā)表的美國專利申請?zhí)?,400,371上阿姆代爾符的“數(shù)據(jù)處理系統(tǒng)”,以及IBM出版物GA22-7000-6號上的“IBM/370系統(tǒng)操作規(guī)則”中進(jìn)行過描述。
權(quán)利要求
1.一種用于分配寄存器并優(yōu)化所述分配的方法,是在一個(gè)無向量或向量處理器中將源代碼編譯成可執(zhí)行代碼的優(yōu)化階段里,對不含“基本程序塊”的分支的代碼區(qū)域進(jìn)行優(yōu)化,每個(gè)基本程序塊具有定義計(jì)算的語句,每個(gè)處理器包括用于存貯可執(zhí)行代碼序列和數(shù)據(jù)的存貯器,以及用于訪問所述存貯器并執(zhí)行任何被訪問代碼的裝置;存貯器被設(shè)計(jì)為兩級模式,包括有限數(shù)量P的寄存器和一個(gè)相對無限的內(nèi)存貯器,所述寄存器的訪問時(shí)間快于內(nèi)存貯器,這些步驟的特征在于(a)確定一個(gè)基本程序塊的數(shù)據(jù)相關(guān)圖特性;(b)根據(jù)該基本程序塊中的全部計(jì)算產(chǎn)生對p個(gè)寄存器中的q個(gè)的分配和指定,其步驟為(b1)沿葉-根節(jié)點(diǎn)方向,選擇具有最大后繼節(jié)點(diǎn)數(shù)(支配者)的圖的節(jié)點(diǎn)集合;(b2)確定上述所選集合的每個(gè)緊隨后繼點(diǎn)的覆蓋費(fèi)用,為該集合中覆蓋費(fèi)用最小的緊隨后繼點(diǎn)指定一個(gè)寄存器;以及(b3)在缺少任何可用可分配寄存器的情況下,將由計(jì)算在該節(jié)點(diǎn)產(chǎn)生的中間或最后結(jié)果寫到內(nèi)存貯器,以后根據(jù)需要將其裝回可用寄存器。
2.一種在無向量或向量處理器中將源代碼編譯成可執(zhí)行代碼期間分配并優(yōu)化寄存器分配的方法,源代碼包括不具分支的稱為“基本程序塊”的代碼區(qū)域,每個(gè)基本程序塊具有定義計(jì)算的語句,每個(gè)處理器包括用于存貯可執(zhí)行代碼序列和數(shù)據(jù)的存貯器,以及用于訪問所述存貯器并執(zhí)行任何被訪問代碼的裝置;存貯器被設(shè)計(jì)為兩級模式,包括有限數(shù)量P的寄存器和一個(gè)相對無限的內(nèi)存貯器,所述寄存器的訪問時(shí)間快于對內(nèi)存貯器的訪問。其步驟的特征在于(a)確定每個(gè)基本程序塊的數(shù)據(jù)相關(guān)圖特性;(b)根據(jù)每個(gè)基本程序塊中的全部計(jì)算,對P個(gè)寄存器中的q個(gè)產(chǎn)生局部寄存器分配和指定,其步驟為(b1)沿葉-根的節(jié)點(diǎn)方向,選擇具有最大后繼節(jié)點(diǎn)數(shù)(支配者)的圖的節(jié)點(diǎn)集合;(b2)確定上述所選集合的每個(gè)緊隨后繼節(jié)點(diǎn)的覆蓋費(fèi)用,并為該集合中覆蓋費(fèi)用最小的緊隨后繼點(diǎn)指定一寄存器;以及(b3)在缺少任何可用可分配寄存器的情況下,將由計(jì)算在該節(jié)點(diǎn)產(chǎn)生的中間或最后結(jié)果寫到內(nèi)存貯器,以后根據(jù)需要將其裝回一可用寄存器。(c)在基本程序塊的流程圖式表示上進(jìn)行活變量分析,并在(p-q)個(gè)剩余寄存器中相應(yīng)產(chǎn)生全程寄存器分配和指定,假定在基本程序塊的流程圖中所表示的循環(huán)是最有意義的優(yōu)化實(shí)體。
專利摘要
在一個(gè)無向量或向量處理器中將源代碼編譯成可執(zhí)行代碼期間,分配并優(yōu)化寄存器指定的方法,在局部優(yōu)化中使用了在每一基本程序塊相關(guān)圖上進(jìn)行卵石游戲試探法,而在全程優(yōu)化中使用活變量分析與循環(huán)展開方法。
文檔編號G06F9/45GK86107764SQ86107764
公開日1987年7月1日 申請日期1986年11月14日
發(fā)明者阿施法·阿布杜里曼·穆施, 卡爾·馬克斯·施姆普福 申請人:國際商用機(jī)器公司導(dǎo)出引文BiBTeX, EndNote, RefMan