用跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包填充空閑節(jié)拍的指令調(diào)度方法
【專利摘要】用跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包填充空閑節(jié)拍的指令調(diào)度方法,包括如下步驟:步驟一,在代碼流圖中找出與進(jìn)行跨基本塊選擇執(zhí)行包填充空閑節(jié)拍操作有關(guān)的目標(biāo)基本塊對(duì);步驟二,對(duì)跳轉(zhuǎn)目標(biāo)基本塊內(nèi)的指令執(zhí)行包進(jìn)行前驅(qū)執(zhí)行包判定,即判定該執(zhí)行包內(nèi)各指令所依賴的其他指令,即被依賴指令所在的執(zhí)行包及其位置,并根據(jù)指令之間的依賴關(guān)系確定該執(zhí)行包的可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍;步驟三,根據(jù)各個(gè)指令執(zhí)行包可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍與基本塊內(nèi)空閑節(jié)拍的位置關(guān)系,計(jì)算出各指令執(zhí)行包各自對(duì)應(yīng)的可填充最早時(shí)間,移動(dòng)這些執(zhí)行包到對(duì)應(yīng)的空閑節(jié)拍處,完成填充。
【專利說明】
用跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包填充空閑節(jié)拍的指令調(diào)度方法
技術(shù)領(lǐng)域
[0001] 本發(fā)明設(shè)及代碼的編譯優(yōu)化方法,面向化IW處理器硬件底層的無條件跳轉(zhuǎn)指令延 遲槽W及基本塊內(nèi)空閑節(jié)拍的填充技術(shù)領(lǐng)域,特別設(shè)及一種用跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包填 充空閑節(jié)拍的指令調(diào)度方法。
【背景技術(shù)】
[0002] 在編譯過程中,在完成了基本塊調(diào)度之后,基本塊內(nèi)仍然可能存在一些空閑節(jié)拍, 運(yùn)些空閑節(jié)拍包括兩部分:1)指令與指令之間的數(shù)據(jù)依賴關(guān)系和指令執(zhí)行延時(shí)所造成的空 閑節(jié)拍;2)分支指令后未被有效指令填充的延遲槽。
[0003] 分支調(diào)度指的是兩件事:1)用有用的指令填充分支指令之后的延遲槽;2)隱藏處 于比較指令和根據(jù)比較結(jié)果進(jìn)行分支的指令之間的延遲。由于本發(fā)明針對(duì)的是無條件跳轉(zhuǎn) 指令延遲槽W及在基本塊調(diào)度之后的空閑節(jié)拍的填充問題,所W不設(shè)及比較指令和依賴比 較結(jié)果的條件分支指令之間的延遲W及條件分支指令本身的調(diào)度優(yōu)化問題。
[0004] 對(duì)于不同的體系結(jié)構(gòu),分支的實(shí)現(xiàn)有很大的區(qū)別,但大多帶有多個(gè)延遲槽。如何有 效地填充運(yùn)些延遲槽是提高代碼的并行度要考慮的重要問題之一。延遲槽可用有用的指令 或nop指令來填充,但后者實(shí)際是空轉(zhuǎn)。填充分支延遲槽時(shí)可W使用W該分支指令結(jié)束的基 本塊內(nèi)部的指令。首先檢查該基本塊的依賴DAG中是否有任何葉子結(jié)點(diǎn)能夠放到它最后一 條分支指令的延遲槽中。運(yùn)種指令必須滿足如下條件:1)它必須是與分支指令可置換的,即 它不能是決定分支條件的指令,也不能是改變分支地址計(jì)算使用的寄存器之值或分支所使 用的任何其他資源(如條件代碼域)的指令;2)它本身不是分支指令。如果在W該分支指令 結(jié)束的基本塊內(nèi)部存在若干指令能夠填充該分支指令的延遲槽,選擇那種延遲時(shí)間為一拍 的指令;但是如果沒有只需一拍的指令,選擇延遲最小的指令。
[0005] 在處理一條分支指令時(shí),可W同時(shí)關(guān)注該分支的目標(biāo)基本塊和緊接著它的后繼基 本塊。如果當(dāng)前基本塊沒有可W放置在分支延遲槽中的指令,下一步是構(gòu)造分支目標(biāo)基本 塊和它下面運(yùn)個(gè)基本塊的MG,并嘗試找出那種同時(shí)作為DAG的根而出現(xiàn)的指令;如果找不 到運(yùn)種指令,接下來就在目標(biāo)基本塊中尋找滿足條件的指令。
[0006] 上述的延遲槽填充方法只適用于具有單個(gè)分支延遲槽的超標(biāo)量體系結(jié)構(gòu)。對(duì)于具 有多個(gè)分支延遲槽的化IW處理器來說,不能較好地填充分支指令的每一個(gè)延遲槽W及其他 的空閑節(jié)拍。因此,運(yùn)種方法不能較好地對(duì)運(yùn)類處理器提高W無條件分支指令結(jié)束的基本 塊內(nèi)指令的執(zhí)行效率,難W充分發(fā)揮硬件的性能。
【發(fā)明內(nèi)容】
[0007] 為解決上述現(xiàn)有技術(shù)存在的問題,本發(fā)明的目的在于提供用跳轉(zhuǎn)目標(biāo)基本塊的執(zhí) 行包填充空閑節(jié)拍的指令調(diào)度方法,針對(duì)基本塊調(diào)度得到的執(zhí)行包序列,進(jìn)一步使用無條 件跳轉(zhuǎn)目標(biāo)基本塊內(nèi)的執(zhí)行包來填充該序列內(nèi)的空閑節(jié)拍。本發(fā)明的方法通過合理地從目 標(biāo)基本塊內(nèi)選擇具有有效指令的執(zhí)行包來填充當(dāng)前基本塊的無條件跳轉(zhuǎn)指令延遲槽W及 基本塊內(nèi)的空閑節(jié)拍,使得執(zhí)行基本塊指令過程中的空轉(zhuǎn)時(shí)間減少,同時(shí)減少分支目標(biāo)基 本塊的執(zhí)行時(shí)間,達(dá)到提高代碼執(zhí)行效率的目的。
[000引為達(dá)到上述目的,本發(fā)明的技術(shù)方案為:
[0009] 用跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包填充空閑節(jié)拍的指令調(diào)度方法,包括如下步驟:
[0010] 步驟一,在代碼流圖中找出與進(jìn)行跨基本塊選擇執(zhí)行包填充空閑節(jié)拍操作有關(guān)的 目標(biāo)基本塊對(duì);
[0011] 步驟二,對(duì)跳轉(zhuǎn)目標(biāo)基本塊內(nèi)的指令執(zhí)行包進(jìn)行前驅(qū)執(zhí)行包判定,即判定該執(zhí)行 包內(nèi)各指令所依賴的其他指令,即被依賴指令所在的執(zhí)行包及其位置,并根據(jù)指令之間的 依賴關(guān)系確定該執(zhí)行包的可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍;
[0012] 步驟=,根據(jù)各個(gè)指令執(zhí)行包可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍與基本塊內(nèi)空閑節(jié)拍的 位置關(guān)系,計(jì)算出各指令執(zhí)行包各自對(duì)應(yīng)的可填充最早時(shí)間,移動(dòng)運(yùn)些執(zhí)行包到對(duì)應(yīng)的空 閑節(jié)拍處,完成填充。
[0013] 進(jìn)一步的,所述步驟一中,本方法對(duì)應(yīng)的處理是在已經(jīng)完成了基本塊調(diào)度并形成 了各基本塊的執(zhí)行包序列的基礎(chǔ)上進(jìn)行的;因此,在初始時(shí)刻,基本塊內(nèi)的指令已經(jīng)被分派 到執(zhí)行包序列中的各個(gè)執(zhí)行包內(nèi);
[0014] 進(jìn)一步的,確定步驟一中基本塊對(duì)的處理包括W下基本流程:
[0015] 1)找到含有無條件跳轉(zhuǎn)指令的基本塊BI,且Bl中有空閑節(jié)拍;
[0016] 2)找到Bl中的跳轉(zhuǎn)指令的跳轉(zhuǎn)目標(biāo)基本塊B2,并要求B2內(nèi)第一個(gè)執(zhí)行包中不包含 跳轉(zhuǎn)指令;
[0017] 3)判斷Bl是否是B2的唯一前驅(qū)基本塊,B2是否是Bl的唯一后繼基本塊;若條件滿 足,則表示發(fā)現(xiàn)了可進(jìn)行跨基本塊填充空閑節(jié)拍的一對(duì)基本塊;
[0018] 進(jìn)一步的,步驟二中目標(biāo)基本塊內(nèi)執(zhí)行包的前驅(qū)執(zhí)行包判定具體為:
[0019] 如果指令12必須在指令I(lǐng)l執(zhí)行完之后才能執(zhí)行,則稱Il為12的前驅(qū)指令。如果12 在執(zhí)行包E2內(nèi),Il在執(zhí)行包El內(nèi),則稱El為E2的前驅(qū)執(zhí)行包,即E2必須在El之后執(zhí)行。運(yùn)種 判定處理的主要方法是:
[0020] 1)判斷目標(biāo)基本塊內(nèi)的各指令執(zhí)行包是否有前驅(qū)執(zhí)行包;
[0021] 2)若存在前驅(qū)執(zhí)行包,則通過該執(zhí)行包與前驅(qū)執(zhí)行包中各指令之間的數(shù)據(jù)依賴關(guān) 系,計(jì)算該執(zhí)行包的可執(zhí)行最早時(shí)間,然后根據(jù)執(zhí)行包的可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍與Bl 內(nèi)空閑節(jié)拍的位置關(guān)系確定當(dāng)前執(zhí)行包的可填充最早時(shí)間;
[0022] 3)若不存在前驅(qū)執(zhí)行包,則該執(zhí)行包可插入到Bl內(nèi)的第一個(gè)空閑節(jié)拍。
[0023] 進(jìn)一步的,所述步驟=中,執(zhí)行包的可填充最早時(shí)間確定方法包括W下內(nèi)容:
[0024] 1)確定Bl中所有空閑節(jié)拍在基本塊中的位置;
[0025] 2)對(duì)于跳轉(zhuǎn)目標(biāo)基本塊中的某個(gè)執(zhí)行包,在完成其前驅(qū)執(zhí)行包判定、得到其可執(zhí) 行最早時(shí)間W后,判斷其可填充最早時(shí)間對(duì)應(yīng)的節(jié)拍時(shí)分=種情況處理:若其可執(zhí)行最早 時(shí)間在基本塊內(nèi)第一個(gè)空閑節(jié)拍之前,則可填充最早時(shí)間為第一個(gè)空閑節(jié)拍;若其可執(zhí)行 最早時(shí)間在基本塊內(nèi)第一個(gè)空閑節(jié)拍和最后一個(gè)空閑節(jié)拍之間,則可填充最早時(shí)間為該執(zhí) 行包可執(zhí)行最早時(shí)間之后的第一個(gè)空閑節(jié)拍;若其可執(zhí)行最早時(shí)間在基本塊內(nèi)最后一個(gè)空 閑節(jié)拍之后,則當(dāng)前執(zhí)行包不可W用來填充。
[0026] 相對(duì)于現(xiàn)有技術(shù),本發(fā)明的有益效果為:
[0027] 本發(fā)明的使用無條件跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包填充基本塊內(nèi)空閑節(jié)拍的方法考 慮了代碼在進(jìn)行了基本塊調(diào)度之后仍然可能存在部分可填充空閑節(jié)拍的問題。通過本方法 可W使用無條件跳轉(zhuǎn)目標(biāo)基本塊內(nèi)的執(zhí)行包同時(shí)對(duì)無條件跳轉(zhuǎn)指令延遲槽和基本塊內(nèi)的 其它空閑節(jié)拍進(jìn)行填充。跨基本塊進(jìn)行執(zhí)行包調(diào)度實(shí)際是增加了指令的調(diào)度域,給調(diào)度提 供了更多改善代碼的機(jī)會(huì)。
【附圖說明】
[0028] 圖1為計(jì)算目標(biāo)基本塊內(nèi)某個(gè)執(zhí)行包的可執(zhí)行最早時(shí)間的過程圖。
[0029] 圖中T為指令I(lǐng)與前驅(qū)指令inst之間必須的延遲時(shí)間;P為包含前驅(qū)指令inst的執(zhí) 行包所在的節(jié)拍編號(hào),基本塊內(nèi)第一個(gè)執(zhí)行包的P值為1。由于執(zhí)行包中一條指令可能有多 條前驅(qū)指令,所W可能有多個(gè)T+P的值,可執(zhí)行最早時(shí)間為該指令對(duì)應(yīng)的那些T+P值中最大 的那個(gè)值。對(duì)目標(biāo)基本塊中某個(gè)執(zhí)行包中的每條指令計(jì)算可執(zhí)行最早時(shí)間,即找出該執(zhí)行 包中每條指令的最大T+P值;其中最大的那個(gè)可執(zhí)行最早時(shí)間T+P的值就是該執(zhí)行包的可執(zhí) 行最早時(shí)間。
[0030] 圖2為選擇執(zhí)行包填充空閑節(jié)拍的狀態(tài)轉(zhuǎn)換圖,計(jì)算目標(biāo)基本塊內(nèi)執(zhí)行包的最早 可填充時(shí)間的狀態(tài)轉(zhuǎn)換。
[0031] 根據(jù)該圖的各個(gè)狀態(tài)W及相互之間的轉(zhuǎn)換可實(shí)現(xiàn)一個(gè)確定有限狀態(tài)自動(dòng)機(jī)來判 定目標(biāo)基本塊內(nèi)各執(zhí)行包的最早可填充時(shí)間。其中Bl是B2的唯一前驅(qū),B2是Bl的唯一后繼。 化指令表示無條件跳轉(zhuǎn)指令。其他說明如下:
[0032] 1化Time表示一個(gè)執(zhí)行包的可執(zhí)行最早時(shí)間所在的節(jié)拍號(hào);
[0033] 2)FTime是一個(gè)執(zhí)行包的可填充最早時(shí)間所在的節(jié)拍號(hào);
[0034] 3)P[n]為基本塊內(nèi)所有空閑節(jié)拍的序列;
[0035] 4)P[ 1 ]為基本塊內(nèi)的第一個(gè)空閑節(jié)拍的節(jié)拍號(hào);
[0036] 5)P[i]為基本塊內(nèi)第i個(gè)空閑節(jié)拍;
[0037] 6化P為執(zhí)行包可執(zhí)行最早時(shí)間ETime所在的節(jié)拍;
[0038] 7)FP為執(zhí)行包可填充最早時(shí)間FTime所在的節(jié)拍;
【具體實(shí)施方式】
[0039] 下面結(jié)合附圖和【具體實(shí)施方式】對(duì)本發(fā)明技術(shù)方案做進(jìn)一步詳細(xì)描述:
[0040] 如圖1、2所示,本發(fā)明方法的實(shí)施具體依次包括與執(zhí)行包的選擇和填充過程相關(guān) 的數(shù)據(jù)結(jié)構(gòu)的構(gòu)造、頂層流程控制、查找可W跨基本塊填充空閑節(jié)拍的基本塊對(duì)、執(zhí)行包的 前驅(qū)判定、計(jì)算執(zhí)行包的可執(zhí)行最早時(shí)間、計(jì)算執(zhí)行包的可填充最早時(shí)間、填充空閑節(jié)拍、 刪除目標(biāo)基本塊內(nèi)的可填充執(zhí)行包等部分。本方法可W用任何程序設(shè)計(jì)語言進(jìn)行具體實(shí) 施。下面W面向?qū)ο笳Z言為例來說明【具體實(shí)施方式】。
[0041] 在面向?qū)ο笳Z言程序中,數(shù)據(jù)和相關(guān)的功能模塊都封裝在類中。本發(fā)明的方法設(shè) 及的實(shí)施內(nèi)容可W用一個(gè)執(zhí)行包調(diào)度類封裝,將對(duì)跨基本塊進(jìn)行執(zhí)行包調(diào)度所需的全局?jǐn)?shù) 據(jù)作為此類的數(shù)據(jù)成員。由于本發(fā)明只設(shè)及基本塊內(nèi)空閑節(jié)拍的填充問題,所W,對(duì)于已完 成基本塊調(diào)度的基本塊和運(yùn)些基本塊中的指令的基本信息,假定它們已經(jīng)保存在基本塊類 對(duì)象和指令類對(duì)象之中(其中包含了基本塊的前驅(qū)和后繼信息,基本塊內(nèi)的執(zhí)行包序列,各 指令的依賴指令和被依賴指令信息);對(duì)于指令模板信息,假定它們保存在指令模板類的對(duì) 象中;對(duì)于體系結(jié)構(gòu)的基本信息,假定它們已經(jīng)保存在體系結(jié)構(gòu)類對(duì)象中。它們都可W通過 指針或者全局變量名來訪問。所W,在下面的具體實(shí)施中,只設(shè)及與本無條件跳轉(zhuǎn)情況指令 延遲槽填充指令選擇方法直接相關(guān)的內(nèi)容。
[0042] 1數(shù)據(jù)結(jié)構(gòu)構(gòu)造
[0043] 為了實(shí)現(xiàn)本發(fā)明的使用無條件跳轉(zhuǎn)目標(biāo)基本塊內(nèi)執(zhí)行包對(duì)基本塊內(nèi)的空閑節(jié)拍 進(jìn)行填充的方法,需要相關(guān)數(shù)據(jù)結(jié)構(gòu)的支持。除硬件結(jié)構(gòu)信息和指令集信息外,其他主要數(shù) 據(jù)結(jié)構(gòu)及其說明如下:
[0044] 1)空閑節(jié)拍列表??臻e節(jié)拍列表用于描述基本塊內(nèi)所有的空閑節(jié)拍的一些狀態(tài)信 息。它是一個(gè)下標(biāo)從1開始的一維數(shù)組,數(shù)組元素的個(gè)數(shù)為基本塊內(nèi)空閑節(jié)拍的個(gè)數(shù);其中 的元素值是各空閑節(jié)拍在基本塊的執(zhí)行包序列中對(duì)應(yīng)的執(zhí)行包編號(hào)。例如:一個(gè)基本塊中 的第3拍、第5拍和第8拍是空閑節(jié)拍,則a[l]=3、a[2]=5、a[3]=8;
[0045] 2)被依賴執(zhí)行包集合。一個(gè)執(zhí)行包可能包含多條指令,運(yùn)些指令所依賴的其他指 令所在的執(zhí)行包稱作該執(zhí)行包的被依賴執(zhí)行包。一個(gè)執(zhí)行包的被依賴執(zhí)行包可能有多個(gè), 其中屬于無條件跳轉(zhuǎn)指令所在基本塊的那些執(zhí)行包構(gòu)成被依賴執(zhí)行包集合;
[0046] 3)被依賴指令集合。目標(biāo)基本塊內(nèi)執(zhí)行包中的每條指令對(duì)應(yīng)一個(gè)被依賴指令集 合。運(yùn)些集合中的指令是與目標(biāo)基本塊內(nèi)執(zhí)行包中的指令存在數(shù)據(jù)依賴關(guān)系的被依賴指 令;
[0047] 4)計(jì)算執(zhí)行包可填充最早時(shí)間的確定有限狀態(tài)自動(dòng)機(jī)的各個(gè)狀態(tài)的枚舉;
[0048] 5)每個(gè)執(zhí)行包都需要的輔助數(shù)據(jù):執(zhí)行包的可執(zhí)行最早時(shí)間;執(zhí)行包可執(zhí)行最早 時(shí)間對(duì)應(yīng)的節(jié)拍的編號(hào),執(zhí)行包的可填充最早時(shí)間,執(zhí)行包可填充最早時(shí)間對(duì)應(yīng)的節(jié)拍的 編號(hào)。
[0049] 2頂層流程控制
[0050] 頂層控制過程有如下步驟:
[0051] (1)查找可進(jìn)行跨基本塊空閑節(jié)拍填充的一對(duì)基本塊?;緣KBl和B2是滿足調(diào)度 條件的基本塊對(duì),Bl是B2的前驅(qū)基本塊,B2是Bl的后繼基本塊,如果找到運(yùn)樣的一對(duì)基本 塊,用下面的步驟對(duì)它們進(jìn)行處理;
[0052] (2)對(duì)無條件跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包序列中的各執(zhí)行包進(jìn)行前驅(qū)執(zhí)行包判定, 找出所有被依賴執(zhí)行包并放入被依賴執(zhí)行包集合中。
[0053] (3)通過執(zhí)行包中的所有指令與其被依賴指令之間的數(shù)據(jù)依賴關(guān)系,計(jì)算出當(dāng)前 執(zhí)行包的可執(zhí)行最早時(shí)間。
[0054] (4)將執(zhí)行包的可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍與基本塊內(nèi)空閑節(jié)拍進(jìn)行區(qū)間比較, 確定執(zhí)行包的可填充最早時(shí)間。
[0055] (5)將可填充的執(zhí)行包填入到相應(yīng)的空閑節(jié)拍中,同時(shí)在目標(biāo)基本塊的執(zhí)行包序 列中刪除該可填充執(zhí)行包。
[0056] 3查找滿足調(diào)度條件的一對(duì)基本塊
[0057] 運(yùn)一部分的處理對(duì)應(yīng)5.2節(jié)步驟中的第1步。在代碼流圖中查找運(yùn)樣的一對(duì)基本塊 W對(duì)它們進(jìn)行跨基本塊填充空閑節(jié)拍,需要滿足W下條件:
[005引1)基本塊Bl W無條件跳轉(zhuǎn)指令結(jié)束;
[0059] 2)基本塊BI有唯一后繼基本塊B2,B2有唯一前驅(qū)基本塊BI;
[0060] 3)基本塊Bl內(nèi)有空閑節(jié)拍;
[0061] 4)基本塊B2的第一個(gè)執(zhí)行包內(nèi)不包含分支指令。
[0062] 具體步驟如下:
[0063] 1)為基本塊設(shè)置兩個(gè)標(biāo)示變量flag和target,它們分別標(biāo)示當(dāng)前基本塊是否包含 無條件跳轉(zhuǎn)指令和是否是滿足條件的目標(biāo)基本塊。根據(jù)基本塊標(biāo)號(hào)遍歷基本塊集合中的各 個(gè)基本塊,對(duì)基本塊進(jìn)行下面的所有步驟的處理;
[0064] 2)令flag為"假",target為"假",遍歷基本塊內(nèi)的各個(gè)執(zhí)行包中的各條指令,若當(dāng) 前基本塊執(zhí)行包序列中存在任意一個(gè)包含有無條件跳轉(zhuǎn)指令的執(zhí)行包,并且當(dāng)前基本塊中 存在至少一個(gè)空?qǐng)?zhí)行包,則令flag為"真"值并結(jié)束遍歷。分W下兩種情況處理:
[0065] (1)在當(dāng)前基本塊內(nèi)的所有執(zhí)行包中的所有指令都遍歷完成之后,若flag值仍為 "假",則對(duì)緊接著當(dāng)前基本塊的下一個(gè)基本塊進(jìn)行上述步驟2)處理;
[0066] (2)當(dāng)flag為"真"時(shí),根據(jù)無條件跳轉(zhuǎn)指令操作數(shù)中的目標(biāo)基本塊標(biāo)號(hào)找到目標(biāo) 基本塊;
[0067] 3)如果目標(biāo)基本塊有唯一前驅(qū),則遍歷第一個(gè)執(zhí)行包中的所有指令,如果該執(zhí)行 包中不包含分支指令,則令target為"真",否則target仍為"假',同時(shí)令flag也為"假";此 時(shí)表示該基本塊對(duì)不滿足條件。然后對(duì)緊接著前驅(qū)基本塊的下一個(gè)基本塊進(jìn)行上述步驟2) 處理1;
[006引6)flag和化rget同時(shí)為"真"時(shí),表示找到了滿足條件的一對(duì)基本塊。
[0069] 4執(zhí)行包的前驅(qū)執(zhí)行包判定
[0070] 如果指令12必須在指令I(lǐng)l執(zhí)行完之后才能執(zhí)行,則稱Il為12的前驅(qū)指令,即Il是 12的被依賴指令,12是Il的依賴指令。如果12在執(zhí)行包E2內(nèi),Il在執(zhí)行包El內(nèi),則稱El為E2 的前驅(qū)執(zhí)行包,即E2必須在El之后執(zhí)行。
[0071] 進(jìn)行執(zhí)行包前驅(qū)執(zhí)行包判定是計(jì)算執(zhí)行包的可執(zhí)行最早時(shí)間的準(zhǔn)備工作。一條指 令的被依賴指令可能有多條,意味著一個(gè)執(zhí)行包的前驅(qū)執(zhí)行包可能有多個(gè),并且該指令與 對(duì)應(yīng)的各被依賴指令之間的延遲都可能不同。此時(shí)根據(jù)執(zhí)行包中的各指令與其對(duì)應(yīng)的被依 賴指令之間的延遲時(shí)間找到該執(zhí)行包在基本塊內(nèi)可W開始執(zhí)行的最早時(shí)間對(duì)應(yīng)的節(jié)拍。計(jì) 算執(zhí)行包的可執(zhí)行最早時(shí)間的處理過程如附圖1所示。
[0072] 執(zhí)行包的前驅(qū)執(zhí)行包判定的具體步驟如下:
[0073] 1)如果目標(biāo)基本塊中有分支指令,則遍歷分支指令之前的每一個(gè)執(zhí)行包內(nèi)的每一 條指令,否則遍歷目標(biāo)基本塊執(zhí)行包序列中的每一個(gè)執(zhí)行包內(nèi)的每一條指令;對(duì)各指令進(jìn) 行如下所有步驟處理;
[0074] 2)找到當(dāng)前指令的每一條被依賴指令,并放入被依賴指令集合中。如果被依賴指 令集合中存在屬于目標(biāo)基本塊B2內(nèi)的指令,則包含當(dāng)前指令的執(zhí)行包不能對(duì)前驅(qū)基本塊Bl 內(nèi)的空閑節(jié)拍進(jìn)行填充,否則繼續(xù)下面步驟處理;
[0075] 3)遍歷當(dāng)前執(zhí)行包內(nèi)當(dāng)前指令的被依賴指令集合中的各指令,通過每條指令對(duì)應(yīng) 的指令模板信息類對(duì)象確定各被依賴指令的執(zhí)行周期T;
[0076] 4)確定當(dāng)前指令的各被依賴指令所在的被依賴執(zhí)行包對(duì)應(yīng)的節(jié)拍編號(hào)P;
[0077] 5)計(jì)算當(dāng)前指令的所有被依賴指令對(duì)應(yīng)的T+P的值,則當(dāng)前指令的可執(zhí)行最早時(shí) 間為最大的那個(gè)T+P的值對(duì)應(yīng)的節(jié)拍;
[0078] 6)對(duì)當(dāng)前執(zhí)行包中的其他指令進(jìn)行3)、4)、5)步驟處理,確定當(dāng)前執(zhí)行包中每條指 令的可執(zhí)行最早時(shí)間,其中最大的那個(gè)可執(zhí)行最早時(shí)間就是當(dāng)前執(zhí)行包的可執(zhí)行最早時(shí) 間。
[0079] 5獲得執(zhí)行包的可填充最早時(shí)間
[0080] 本發(fā)明方法通過確定狀態(tài)有限自動(dòng)機(jī)來發(fā)現(xiàn)可W填充基本塊內(nèi)空閑節(jié)拍的執(zhí)行 包,狀態(tài)轉(zhuǎn)換關(guān)系見附圖2。獲得執(zhí)行包的可填充最早時(shí)間FTime的步驟如下:
[0081] 1)更新空閑節(jié)拍列表。遍歷基本塊Bl指令執(zhí)行包序列中的所有執(zhí)行包,如果有空 執(zhí)行包,即該執(zhí)行包所在的節(jié)拍為空閑節(jié)拍;將運(yùn)些空閑節(jié)拍對(duì)應(yīng)的節(jié)拍編號(hào)依次存入空 閑節(jié)拍列表中。
[0082] 2)遍歷目標(biāo)基本塊指令執(zhí)行包序列中的各個(gè)指令執(zhí)行包,對(duì)各執(zhí)行包進(jìn)行下面步 驟3)的處理。
[0083] 3)對(duì)當(dāng)前執(zhí)行包進(jìn)行前驅(qū)執(zhí)行包判定。將執(zhí)行包的可執(zhí)行最早時(shí)間ETime對(duì)應(yīng)的 節(jié)拍編號(hào)與空閑節(jié)拍列表中的空閑節(jié)拍對(duì)應(yīng)的節(jié)拍編號(hào)進(jìn)行區(qū)間關(guān)系分析,分析過程分如 下幾種情況進(jìn)行處理:
[0084] (1)若當(dāng)前執(zhí)行包不存在被依賴執(zhí)行包,則當(dāng)前執(zhí)行包的可填充最早時(shí)間FTime為 基本塊內(nèi)第一個(gè)空閑節(jié)拍對(duì)應(yīng)的節(jié)拍編號(hào)a[l]。將當(dāng)前執(zhí)行包的所有指令復(fù)制到該空節(jié)點(diǎn) 對(duì)應(yīng)的執(zhí)行包中,然后刪除目標(biāo)基本塊內(nèi)執(zhí)行包鏈表中當(dāng)前執(zhí)行包所在的節(jié)點(diǎn)。進(jìn)行步驟 1)處理更新空閑節(jié)拍列表。
[0085] (2)若當(dāng)前執(zhí)行包的可執(zhí)行最早時(shí)間ETime小于等于空閑節(jié)拍列表中的第一個(gè)元 素曰[1]的值,則當(dāng)前執(zhí)行包的可填充最早時(shí)間FTime對(duì)應(yīng)的節(jié)拍為空閑節(jié)拍列表中第一個(gè) 元素 a[l]所對(duì)應(yīng)的節(jié)拍。將當(dāng)前執(zhí)行包的所有信息復(fù)制到該空節(jié)點(diǎn)中,然后刪除目標(biāo)基本 塊內(nèi)執(zhí)行包鏈表中當(dāng)前執(zhí)行包所在的節(jié)點(diǎn)。進(jìn)行步驟1)處理更新空閑節(jié)拍列表。
[0086] (3)若當(dāng)前執(zhí)行包的可執(zhí)行最早時(shí)間ETime大于空閑節(jié)拍列表中的第一個(gè)元素 a
[1]的值,小于等于空閑節(jié)拍列表中的最后一個(gè)元素 a[n]的值,則當(dāng)前執(zhí)行包的可填充最早 時(shí)間FTime對(duì)應(yīng)的節(jié)拍為空閑節(jié)拍列表中第一個(gè)其元素的值大于等于該執(zhí)行包可執(zhí)行最早 時(shí)間的那個(gè)元素 a[i]所對(duì)應(yīng)的節(jié)拍。將當(dāng)前執(zhí)行包的所有信息復(fù)制到該空節(jié)點(diǎn)中,然后刪 除目標(biāo)基本塊內(nèi)執(zhí)行包鏈表中當(dāng)前執(zhí)行包所在的節(jié)點(diǎn)。進(jìn)行步驟1)處理更新空閑節(jié)拍列 表。
[0087] (4)若當(dāng)前執(zhí)行包的可執(zhí)行最早時(shí)間ETime大于空閑節(jié)拍列表中的最后一個(gè)元素 a [n]的值,則當(dāng)前執(zhí)行包不能用來填充空閑節(jié)拍。
[0088] 4)取下一個(gè)執(zhí)行包進(jìn)行上述2)、3)步驟處理,直到取到含有分支指令的執(zhí)行包或 者目標(biāo)基本塊內(nèi)的所有執(zhí)行包都處理完成。
[0089] 附表1目標(biāo)基本塊中執(zhí)行包可填充最早時(shí)間FTime-覽表。其中,(a[i]為空閑節(jié)拍 集合中第一個(gè)其元素的值大于等于該執(zhí)行包可執(zhí)行最早時(shí)間的那個(gè)元素所表示的節(jié)拍,a [1]為基本塊中的第一個(gè)空閑節(jié)拍,a[n]為最后一個(gè)空閑節(jié)拍,n為空閑節(jié)拍的個(gè)數(shù)。)
[0090]
[0091] 附表1中的內(nèi)容是獲得執(zhí)行包可填充最早時(shí)間后的結(jié)果,執(zhí)行包的可填充最早時(shí) 間只有表中所示的運(yùn)幾種可能
[0092] W上所述,僅為本發(fā)明的【具體實(shí)施方式】,但本發(fā)明的保護(hù)范圍并不局限于此,任何 不經(jīng)過創(chuàng)造性勞動(dòng)想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的 保護(hù)范圍應(yīng)該W權(quán)利要求書所限定的保護(hù)范圍為準(zhǔn)。
【主權(quán)項(xiàng)】
1. 用跳轉(zhuǎn)目標(biāo)基本塊的執(zhí)行包填充空閑節(jié)拍的指令調(diào)度方法,其特征在于,包括如下 步驟: 步驟一,在代碼流圖中找出與進(jìn)行跨基本塊選擇執(zhí)行包填充空閑節(jié)拍操作有關(guān)的目標(biāo) 基本塊對(duì); 步驟二,對(duì)跳轉(zhuǎn)目標(biāo)基本塊內(nèi)的指令執(zhí)行包進(jìn)行前驅(qū)執(zhí)行包判定,即判定該執(zhí)行包內(nèi) 各指令所依賴的其他指令,即被依賴指令所在的執(zhí)行包及其位置,并根據(jù)指令之間的依賴 關(guān)系確定該執(zhí)行包的可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍; 步驟三,根據(jù)各個(gè)指令執(zhí)行包可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍與基本塊內(nèi)空閑節(jié)拍的位置 關(guān)系,計(jì)算出各指令執(zhí)行包各自對(duì)應(yīng)的可填充最早時(shí)間,移動(dòng)這些執(zhí)行包到對(duì)應(yīng)的空閑節(jié) 拍處,完成填充。2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟一中,本方法對(duì)應(yīng)的處理是在已 經(jīng)完成了基本塊調(diào)度并形成了各基本塊的執(zhí)行包序列的基礎(chǔ)上進(jìn)行的;因此,在初始時(shí)刻, 基本塊內(nèi)的指令已經(jīng)被分派到執(zhí)行包序列中的各個(gè)執(zhí)行包內(nèi)。3. 根據(jù)權(quán)利要求1所述的方法,其特征在于,確定步驟一中基本塊的處理包括以下基本 流程: 1) 找到含有無條件跳轉(zhuǎn)指令的基本塊B1,且B1中有空閑節(jié)拍; 2) 找到B1中的跳轉(zhuǎn)指令的跳轉(zhuǎn)目標(biāo)基本塊B2,并要求B2內(nèi)第一個(gè)執(zhí)行包中不包含跳轉(zhuǎn) 指令; 3) 判斷B1是否是B2的唯一前驅(qū)基本塊,B2是否是B1的唯一后繼基本塊;若條件滿足,則 表示發(fā)現(xiàn)了可進(jìn)行跨基本塊填充空閑節(jié)拍的一對(duì)基本塊。4. 根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟二中目標(biāo)基本塊內(nèi)執(zhí)行包的前驅(qū)執(zhí)行 包判定具體為: 如果指令12必須在指令I(lǐng)I執(zhí)行完之后才能執(zhí)行,則稱II為12的前驅(qū)指令。如果12在執(zhí) 行包E2內(nèi),11在執(zhí)行包E1內(nèi),則稱E1為E2的前驅(qū)執(zhí)行包,即E2必須在E1之后執(zhí)行。這種判定 處理的主要方法是: 1) 判斷目標(biāo)基本塊內(nèi)的各指令執(zhí)行包是否有前驅(qū)執(zhí)行包; 2) 若存在前驅(qū)執(zhí)行包,則通過該執(zhí)行包與前驅(qū)執(zhí)行包中各指令之間的數(shù)據(jù)依賴關(guān)系, 計(jì)算該執(zhí)行包的可執(zhí)行最早時(shí)間,然后根據(jù)執(zhí)行包的可執(zhí)行最早時(shí)間對(duì)應(yīng)的節(jié)拍與B1內(nèi)空 閑節(jié)拍的位置關(guān)系確定當(dāng)前執(zhí)行包的可填充最早時(shí)間; 3) 若不存在前驅(qū)執(zhí)行包,則該執(zhí)行包可插入到B1內(nèi)的第一個(gè)空閑節(jié)拍。5. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟三中,執(zhí)行包的可填充最早時(shí)間 確定方法包括以下內(nèi)容: 1) 確定B1中所有空閑節(jié)拍在基本塊中的位置; 2) 對(duì)于跳轉(zhuǎn)目標(biāo)基本塊中的某個(gè)執(zhí)行包,在完成其前驅(qū)執(zhí)行包判定、得到其可執(zhí)行最 早時(shí)間以后,判斷其可填充最早時(shí)間對(duì)應(yīng)的節(jié)拍時(shí)分三種情況處理:若其可執(zhí)行最早時(shí)間 在基本塊內(nèi)第一個(gè)空閑節(jié)拍之前,則可填充最早時(shí)間為第一個(gè)空閑節(jié)拍;若其可執(zhí)行最早 時(shí)間在基本塊內(nèi)第一個(gè)空閑節(jié)拍和最后一個(gè)空閑節(jié)拍之間,則可填充最早時(shí)間為該執(zhí)行包 可執(zhí)行最早時(shí)間之后的第一個(gè)空閑節(jié)拍;若其可執(zhí)行最早時(shí)間在基本塊內(nèi)最后一個(gè)空閑節(jié) 拍之后,則當(dāng)前執(zhí)行包不可以用來填充。
【文檔編號(hào)】G06F9/45GK106020922SQ201610370406
【公開日】2016年10月12日
【申請(qǐng)日】2016年5月30日
【發(fā)明人】胡勇華, 黃文體, 李國輝, 邱亞瓊
【申請(qǐng)人】湖南科技大學(xué)