專利名稱:基于數(shù)據(jù)流分析的單線程程序并行化的實現(xiàn)方法
技術領域:
本發(fā)明涉及單線程程序并行化的領域,尤其涉及一種基于數(shù)據(jù)流分析的單 線程程序并行化的實現(xiàn)方法。
背景技術:
隨著電子技術的發(fā)展,電子芯片的制造工藝由原來的卯nm減小到65nm、 45nm,現(xiàn)在甚至還出現(xiàn)了 32nm的芯片,制造工藝的改進使得固定面積的芯片 可以集成更多的晶體管,進而也使得單個芯片上可以被設計成更復雜的結構和 更多的計算資源;同時較高的芯片集成度使得原來通過提高芯片工作頻率的做 法不再有效, 一方面芯片的電路延時使得芯片的頻率不能被無限提升,另一方 面,過高的頻率帶來了更高的能耗,使得髙集成度的芯片散熱成為一個巨大的 問題。為了解決上述問題,更好和更合理的利用單個芯片上的資源,芯片多處 理器(Chip Multi Processor, CMP)結構就應運而生了。 CMP集成多個處理器 核在單個芯片上,不僅能夠解決能耗和散熱的問題,同時能夠是芯片具有更好 的并行性。CMP同時帶來的一個問題是當面對傳統(tǒng)的基于單核結構而設計的單 線程程序,CMP并不能夠取得良好的加速比,甚至在有些時候,單線程程序在 CMP上的運行性能還不如結構復雜的單核處理器。
現(xiàn)在在CMP卜.提高單線程程序性能的主要方法是探索單線程程序的并行部 分,這樣不同的計算資源就能夠同時運行實現(xiàn)并行性。比較常用的實現(xiàn)并行的 手段有指令級的并行(Instruction Level Parallelism, ILP),線程級的并行(Thread Level Parallelism, TLP)和投機(Speculation)。指令級的并行是一種粒度較小 的并行手段,它主要實現(xiàn)指令的并行執(zhí)行,指令級并行在單核處理器中同樣被 使用,現(xiàn)在使用的多級指令流水技術,超長指令字等方法都是指令級的并行方 法。
線程級的并行或稱為軟件級的并行主要是把一個單線程程序抽取成多線程 程序,這些多線程程序并行執(zhí)行從而實現(xiàn)程序的并行執(zhí)行。線程級并行的實現(xiàn) 方式很多,它是一種粒度較大的并行方式。例如在某些科學計算和多媒體應用 的環(huán)境中,由于程序所處理的數(shù)據(jù)前后依賴性不強,所以可以同時處理原始數(shù) 據(jù)中的不同部分,這種方式叫做數(shù)據(jù)級的并行,是一種線程級并行;再譬如在 程序的某個循環(huán)中,可以把循環(huán)分解成前后的不同部分,前面部分的輸出可以作為后面部分的輸入,進而形成前后部分的流水讓前后兩部分并行執(zhí)行,這種 方式叫做軟件級的流水,也是一種線程級并行。
投機也是實現(xiàn)程序并行的一種方法,它通過預測來提前執(zhí)行程序的某一個 部分,如果這個部分在將來被執(zhí)行,那么它的結果可以直接被使用,如果將來 未被執(zhí)行,那么只要拋棄先前執(zhí)行的結果便可。投機是現(xiàn)在研究中的一個重要 方向,有許多不同的方法來實現(xiàn)投機,但是當投機錯誤的時候,它并不能改變
程序的性能,甚至有可能損失一部分程序性能。投機的粒度變化較大,小可以 小的一條匯編指令,大可以大到一個循環(huán)部分或者一個函數(shù)。
無論人們?nèi)绾螄L試著程序并行化的方法,程序中指令前后的依賴性是限制 程序并行的最主要約束,建立新的編程模型可能能夠使得程序之間的依賴關系 有所改善,但是由于任務的過程性,程序之間的依賴關系不可能被消除,所以 現(xiàn)在所做的一切關于并行的研究都是建立在依賴性的基礎上的。程序內(nèi)部的依 賴關系有控制依賴和數(shù)據(jù)依賴兩種,但是如果需要并行的執(zhí)行某一段代碼,反 向的依賴關系也是必須考慮的一個問題,反向的相關存在于指令級的并行和線 程級的并行當中,例如處理器的亂序執(zhí)行,投機和軟件流水。
通常在程序執(zhí)行的某一個時刻存在多個數(shù)據(jù)流,這些數(shù)據(jù)流相互交織在一 起組成了程序的執(zhí)行流程。事實上,在具有控制依賴關系的指令之間,如果把 控制條件的值作為后面指令的輸入的話,那么控制依賴也可以被當成是一種數(shù) 據(jù)上的依賴。加之程序中本身存在的反向的依賴關系,那么可以簡單的確定程 序中的某些指令必定執(zhí)行在另外一些指令之后。在編譯器的優(yōu)化技術中,指令 之間的依賴關系和程序的數(shù)據(jù)流都是程序優(yōu)化的基礎。
生產(chǎn)者消費者方式是解決多線程程序在線程之間通信的一個方法,這個方 法一般通過指定內(nèi)存的某一塊區(qū)域為存放通信內(nèi)容的倉庫,生產(chǎn)者線程向倉庫 中存放需要通信的內(nèi)容,而消費者線程從倉庫中得到所需要通信的內(nèi)容。根據(jù) 生產(chǎn)者消費者的軟件模型可以構建出一個生產(chǎn)者消費者的硬件架構。
發(fā)明內(nèi)容
一種基于數(shù)據(jù)流分析的單線程程序并行化的實現(xiàn)方法能夠自動把單線程程 序抽取成多線程程序,使之適合在多核結構上并行運行從而提升程序性能,它 是一種編譯技術。
本發(fā)明解決技術問題所采用的技術方案是
1)分解算法的實現(xiàn)-
分解算法是把單線程程序分解成多個線程的算法實現(xiàn),這個算法根據(jù)聯(lián)合依賴關系圖當中的指令依賴性,把單個線程分解成兩個或多個線程。分解算法 是一個遞歸的過程,它首先作出非嵌套循環(huán)或者無循環(huán)部分的聯(lián)合依賴關系圖, 根據(jù)原程序中指令執(zhí)行的時間以及數(shù)據(jù)依賴關系,向圖中的節(jié)點和邊的添加屬 性,之后是圖的分解過程,分解算法考慮的是分解后線程的通信代價和線程之 間的平衡性,把圖中的節(jié)點分配到不同的組中,組成不同的線程,然后向線程 中插入生產(chǎn)者消費者指令,分解后,被分解的部分被當作一個節(jié)點插入原來代 碼當中,分解算法繼續(xù)分解新組成的代碼中的非嵌套循環(huán)部分,如此遞歸進行, 直到分解完整個需要分解的代碼;
2) 根據(jù)指令依賴關系作出聯(lián)合依賴關系圖
單線程程序指令之間存在兩種依賴關系,分別是指令之間的數(shù)據(jù)依賴和控 制依賴。當單線程程序別分解成多個線程而并行執(zhí)行的時候,還存在反向的數(shù) 據(jù)依賴關系。聯(lián)合依賴關系圖是混合這三種依賴關系的圖,它的作法是這樣的 首先以程序中的指令作為圖的節(jié)點,然后根據(jù)指令之間的依賴關系添加上述的 三種依賴關系。在添加完依賴關系以后,以圖中不存在依賴的節(jié)點為起始節(jié)點, 消除與這些節(jié)點連接的所有邊,查找圖中新的不存在依賴的節(jié)點,取出這些節(jié) 點加入到起始節(jié)點的集合中,在起始節(jié)點的集合中添加新節(jié)點與舊節(jié)點在程序 執(zhí)行中的先后關系,消除新節(jié)點在原來依賴圖中所有與之相連的邊。這樣循環(huán) 進行直到所有節(jié)點被添加到起始節(jié)點集合為止;
3) 函數(shù)、過程內(nèi)聯(lián)和程序中三種基本元素的分解
函數(shù)和過程會使指令流跳出到被分解部分的代碼,這使得分解過程難以繼 續(xù)進行,因此需要把被分解代碼部分內(nèi)的函數(shù)和過程被內(nèi)聯(lián)進來?;緣K、條 件分支和循環(huán)是程序的三種基本元素,循環(huán)被分解算法作為基本分解單元,分 支和循環(huán)需要控制條件值的傳遞,基本塊可以被直接分解,但會存在數(shù)據(jù)依賴 和反向數(shù)據(jù)依賴;
4) 生產(chǎn)者消費者通信模式及硬件實現(xiàn)
分解后線程之間的通信通過生產(chǎn)者消費者方式解決,生產(chǎn)者消費者需要在 倉庫中存儲和消費所通信的值,如果以內(nèi)存為倉庫,由于內(nèi)存的速度慢,對內(nèi) 存的讀寫影響分解后線程的性能,為了能夠更快的完成生產(chǎn)者消費者,減少通 信代價, 一種硬件的實現(xiàn)可以有效的改進效率;
5) 分解后線程間通信的一個特殊例子考慮
對于生產(chǎn)者消費者的實現(xiàn),有一個特殊的例子需要被考慮,當消費者消費 的值有可能來自分支或循環(huán)內(nèi)部,也有可能來之分支或循環(huán)前面時生產(chǎn)者需要在一個特定的點生產(chǎn)或者向倉庫中的同一個單元進行生產(chǎn),不然消費者得到的 值可能是錯誤的或者過時的。 本發(fā)明具有的有益效果是
隨著CMP構架的廣泛使用,單線程程序在需要探索指令間的并行性外,還 需要能夠實現(xiàn)線程級的并行,使得程序能夠適應CMP構架,在多個核上并行執(zhí) 行。本發(fā)明的目的就在于自動分解單線程程序為多線程程序,使得單線程程序 可以在CMP結構上并行執(zhí)行,進而提高程序的執(zhí)行效率,增加系統(tǒng)的吞吐量, 提高CMP芯片的利用效率。單線程程序的并行化方法尤其適合當今的多核結構 (Chip Multi Processor , CMP
圖1是分解算法流程圖。
圖2是基本塊的UDG以及分解。
圖3是分支的UDG以及分解。
圖4是循環(huán)的UDG以及分解。
圖5是添加節(jié)點和邊的屬性到UDG中。
圖6是生產(chǎn)者消費者硬件實現(xiàn)的結構框架圖。
圖7是程序分解中的一個特殊情況。
具體實施例方式
基于數(shù)據(jù)流分析的單線程程序并行化通過分析單線程程序中指令之間的依 賴性,把單線程程序分解成多線程程序,在線程分解的過程中,同時考慮分解 后線程通信代價和線程之間的平衡性。單線程程序并行化能夠使單線程程序的 不同部分并行執(zhí)行,進而減短程序執(zhí)行時間提高程序執(zhí)行效率。它的具體實現(xiàn) 如下
(一)分解算法的實現(xiàn)(Dataflow Abstracting Thread, DFAT):
分解算法是把單線程程序分解成多個線程的算法實現(xiàn),這個算法根據(jù)聯(lián)合 依賴關系圖當中的指令依賴性,把單個線程分解成指定個數(shù)的線程。在線程的 分解過程中,分解算法不但需要考慮分解后線程的通信代價同時需要考慮線程 之間的平衡性。分解算法首先分解程序屮的非嵌套循環(huán)部分,分解完成以后把 循環(huán)標記為一個節(jié)點繼續(xù)分解上層的循環(huán),直到所有待分解的代碼全部被分解 為止。算法的流程圖如圖l所示,下面將詳細敘述分解算法的過程
1.作出非嵌套循環(huán)或者無循環(huán)部分聯(lián)合依賴關系圖(United Dependence Graph, UDG);沒有嵌套的循環(huán)指的是循環(huán)內(nèi)部只存在基本塊和分支條件而不再包含循環(huán)。在 找到這樣的循環(huán)以后,對循環(huán)內(nèi)部作聯(lián)合依賴關系圖。聯(lián)合依賴關系圖的具體 作法見第二部分。
2. 添加節(jié)點和邊的屬性到UDG;
在作出兩和依賴關系圖以后需要向圖中添加一些重要屬性,這些屬性表示 指令之間是否有數(shù)值傳遞以及該指令的預計執(zhí)行時間,其中反向依賴不存在數(shù)
值傳遞,對聯(lián)合依賴關系圖添加屬性的過程如圖5所示,這是對圖2 (b)的聯(lián) 合依賴關系圖添加屬性,節(jié)點上的數(shù)值表示節(jié)點的預計執(zhí)行時間,邊上的數(shù)值 表示兩個節(jié)點間傳遞的數(shù)值個數(shù)。這些屬性被用于圖的分解,使分解后線程間 具有較小的通信代價和保持平衡性。由于該聯(lián)合依賴關系圖是對一個循環(huán)的分 解,所以循環(huán)的控制條件對于循環(huán)內(nèi)所有節(jié)點的控制依賴可以被省略。
3. 把UDG中的節(jié)點分配到不同組中;
在分解依賴圖的時候,肯定存在一種最優(yōu)的分解方法,但這個是NP問題, 時間復雜度高,本發(fā)明中的分解采用貪心策略,這是一種近似求解的方式,優(yōu) 點是算法簡單,時間復雜度低。在分解的過程中不但要考慮分解以后的線程通 信量盡量的少,同時需要考慮線程之間的平衡性,如果各個線程的執(zhí)行時間能 夠接近,那么執(zhí)行的總時間就有可能相對較短。所以在分解的過程中,首先考 慮通信優(yōu)先,即有數(shù)據(jù)依賴的應該被分配在同一個線程,但是同時要保證分解 后線程的平衡,對于線程的平衡可以設置一個閾值,即分解后的線程中理論上 的最長時間和最短時間差不應該超過這個值。這個閾值的設置方法可以有多種 方式,可以是一個常數(shù), 一個在某個取值范圍內(nèi)的隨機數(shù)或者是程序總的執(zhí)行 時間的一個百分比值。
4. 插入生產(chǎn)者消費者指令;
分解后線程之間的通信是一個影響性能的重要問題,木發(fā)明中采用的是生 產(chǎn)者消費者方式來解決線程之間的通信,為了能夠更快的完成線程之間的通信, 本發(fā)明采用了硬件的方式實現(xiàn)生產(chǎn)者消費者,具體的實現(xiàn)在第四部分中講被詳 細討論。對于分解后線程預計執(zhí)行時間的計算,不但要計算本身指令的執(zhí)行時 間,還要加上數(shù)據(jù)的等待時間和傳輸時間。
在分解完一個沒有嵌套的循環(huán)以后,計算出分解后各個部分的live-in和 live-out,把分解后的各個部分分別作為一個整體,或者說看成是一條指令,記 執(zhí)行時間為代碼執(zhí)行一遍循環(huán)的時間,并在該部分上作上標記,有相同標記的 兩個指令不能放在同一線程中,回到第一步,直到指定代碼全部被分解則算法結束°
5.考慮特殊情況;
由于一種特殊情況的存在,分解結束以后需要對代碼作出調(diào)整,這個將在 第五部分討論;
(二) 根據(jù)指令依賴關系作出聯(lián)合依賴關系圖(UnitedDependence Graph, UDG):
程序的指令之間存在兩種依賴關系,分別是指令之間的數(shù)據(jù)依賴和控制依 賴??刂埔蕾囀潜豢刂撇糠值闹噶顚刂茥l件的值的依賴,是一種特殊的數(shù)據(jù) 依賴形式。當單個程序別分解成多個線程而并行執(zhí)行的時候,還存在反向的數(shù) 據(jù)依賴關系,這三種關系聯(lián)合起來被叫做聯(lián)合依賴關系,由聯(lián)合依賴關系得到 的指令之間的依賴圖被叫做聯(lián)合依賴關系圖(UDG)。圖2 (b)、圖3 (a)、圖4 (a)分別是對各自圖中代碼所作的聯(lián)合依賴關系圖。在圖2 (b)中包含了數(shù)據(jù) 依賴關系,在圖3 (a)包含了數(shù)據(jù)依賴和控制依賴,在圖4 (a)中包含了全部 的三種依賴關系。
UDG是基于傳統(tǒng)的程序依賴關系圖的,作圖方法比較簡單。在傳統(tǒng)的程序 依賴圖(包含控制依賴和數(shù)據(jù)依賴)基礎上,加上程序之間的反向數(shù)據(jù)依賴關 系,然后再對包含這三種依賴關系的圖化簡即可?;喎椒ㄊ沁@樣的,根據(jù)三 種依賴關系掃描圖中的所有節(jié)點,如果被掃描的節(jié)點是可以被執(zhí)行的,那么把 它們?nèi)〕龇湃胄聢D中,在新圖中添加從原圖中新節(jié)點所依賴的點到新節(jié)點的箭 頭,并從原圖中刪除節(jié)點和與之相連的所有邊,如果原圖中所有節(jié)點被刪除, 那么化簡結束,否則繼續(xù)上述步驟知道所有節(jié)點被刪除。UDG其實是程序中指 令先后執(zhí)行的順序(三) 函數(shù)、過程內(nèi)聯(lián)和程序中三種基本元素的分解
函數(shù)和過程會使指令流跳出到被分解部分的代碼,這使得分解過程難以繼 續(xù)進行,因此被分解代碼部分內(nèi)的函數(shù)和過程被內(nèi)聯(lián)進來,內(nèi)聯(lián)會使得代碼量 變大,但對于現(xiàn)在的存儲容量,這并沒有太大影響?;緣K、條件分支和循環(huán) 是構成程序的三種基本元素,這三種元素的分解方法不盡相同,循環(huán)被分解算 法作為基本單元,分支和循環(huán)又需要控制條件值的傳遞,基本塊可以被直接分 解,但會存在數(shù)據(jù)依賴和反向數(shù)據(jù)依賴,同時分支和循環(huán)的內(nèi)部又是由基本塊 構成的。
基本塊中存在的依賴關系只可能是數(shù)據(jù)依賴和反向的數(shù)據(jù)依賴,圖2是對 一個基本塊的分解,在這個代碼段中,只有數(shù)據(jù)依賴,圖2 (c)是把圖2 (b)分解成兩個部分的一個舉例,在分解以后,線程1中的指令1要將數(shù)據(jù)傳遞給
線程2中的指令2、 5,線程1中的指令3要將數(shù)據(jù)傳遞給線程2中的指令7。 這些數(shù)據(jù)的傳遞是線程間的通信,通過生產(chǎn)者消費者硬件完成。
在分支的情況下存在的重要依賴關系是控制依賴,控制依賴主要是內(nèi)部指 令對于分支條件的依賴性,這種依賴性包含著數(shù)值的依賴,是一種特殊的數(shù)據(jù) 依賴情況,如圖3是一段包含一個分支的程序片段,在這個程序片斷中指令1 決定著指令2-7是否執(zhí)行,所以指令2-7對指令l有控制依賴。指令2-7是基本 的程序塊,其中的函數(shù)為宏,在這個基本塊中,指令3對指令2,指令5對指令 4具有數(shù)據(jù)以來,而指令6對指令3存在著反向的以來關系。圖3 (a)是程序 片段的聯(lián)合依賴關系圖,其中用虛線表示出來的是指令2-7對指令1的控制依賴 關系,圖3 (b)是對圖3 (a)的一個雙線程分解,在這個分解中多出了一條指
令r,指令i與指令r之間存在著控制變量值的傳遞,指令457對指令r存在
控制依賴。圖3 (c)是對圖3 (a)的三線程分解,如同雙線程的分解,這里指 令1需要把控制變量的值傳遞給l'和1"。在線程3中,可以看到指令7先于指 令6執(zhí)行,這是由于指令6依賴于線程2的指令4。
循環(huán)中存在依賴關系主要也是控制依賴,這種依賴關系類似分支當中的依 賴,所以循環(huán)的分解類似于分支的分解。圖4是一段包含一個非嵌套循環(huán)的程 序片段,在這個程序片段中包含了全部的依賴關系,指令2控制了指令3-8的執(zhí) 行,指令8反向依賴于指令2-7,而指令2-7又對l具有數(shù)據(jù)的依賴關系,指令 3-8是一個基本程序塊,按照基本程序塊的分析判斷指令執(zhí)行的先后順序。圖4 (b)是對圖4 (a)的分解,如同前面對分支的分解,分解后控制條件的值需要 進行傳遞;
(四)生產(chǎn)者消費者通信模式及硬件實現(xiàn) 線程分解以后的通信代價很大程度上決定了分解的可行性,不合理的分解 會導致過高的線程通信代價,從而使得線程分解與并行執(zhí)行毫無意義。分解后 線程之間的通信通過生產(chǎn)者消費者方式解決,生產(chǎn)者消費者需要在倉庫中存儲 和消費所通信的值,為了能夠更快的完成生產(chǎn)者消費者,減少通信代價, 一種 硬件的實現(xiàn)可以有效的改進效率。但是在硬件的實現(xiàn)中,需要編譯器的額外支
持,有兩條新指令(produce和consume)會被加入到編譯器中用來控制生產(chǎn)者 消費者的硬件部件,完成通信。
圖6是生產(chǎn)者消費者硬件實現(xiàn)的結構框架圖,在圖中以一個芯片上集成兩 個處理器為例。中間的倉庫由一個緩存器和一個控制器構成,緩存器用于緩存線程之間的通信數(shù)據(jù),而控制器則是控制處理器對倉庫的訪問。倉庫的訪問是 排他的,這由控制器控制,當有一條生產(chǎn)指令或者消費指令訪問倉庫內(nèi)數(shù)據(jù)的 時候,其他的生產(chǎn)指令和消費指令不允許訪問倉庫,控制器內(nèi)部有兩個隊列, 一個是生產(chǎn)隊列, 一個是消費隊列,當有生產(chǎn)者或者消費者訪問倉庫時,訪問 指令首先需要被緩存在隊列中然后由控制器來決定生產(chǎn)者和消費者指令的執(zhí) 行。當生產(chǎn)者所要寫入的單元滿或者消費者需要讀取的單元空時,這些指令都 是不會被寫入隊列的,而且遇到這樣的指令會使得處理器等待。
倉庫中的每個存儲單元具有一些標志位,其中filll標記是一個8位長的標志,
用來表示該單元中的數(shù)據(jù)將會被消費幾次,如果fuu標記為o,則表示這個單元
是空的。Read標記是一個一位長的標記,如果被置位則表示有消費者需要取該 存儲單元中的內(nèi)容。
又兩條指令來控制進程對倉庫的讀和寫,他們分別是produce和consume, 他們在處理器中被實現(xiàn)成整形指令。produce的格式是操作碼、寄存器、立即數(shù) l和立即數(shù)2,其中寄存器中存放是的將被存入倉庫的值,立即數(shù)l表示將被存 入倉庫中的哪個單元,立即數(shù)2是這個值被消費的次數(shù),被放入full標志位中。 consume的格式是操作碼、寄存器、立即數(shù)和零,寄存器中將存放從倉庫讀入的 值,立即數(shù)指示讀倉庫中的那個值。指令執(zhí)行單元中整形ALU的輸出將作為倉 庫中控制器的輸入,控制器根據(jù)ALU的輸出值控制倉庫的存取。
線程在分解后插入生產(chǎn)者消費者指令是由編譯器設定的,編譯器需要知道 倉庫的單元數(shù)。在線程通信的過程中,生產(chǎn)者生產(chǎn)的某個值將存入倉庫的哪個 單元是由編譯器預先靜態(tài)指定的,消費者的消費方式也一樣。 (五)分解后線程間通信的一個特殊例子考慮
對于生產(chǎn)者消費者的實現(xiàn),有一個特殊的例子需要被考慮,當消費者消費 的值有可能來自分支或循環(huán)內(nèi)部,也有可能來之分支或循環(huán)前面時生產(chǎn)者需要 在一個特定的點生產(chǎn)或者向倉庫中的同一個單元進行生產(chǎn),不然消費者得到的 值可能是錯誤的或者過時的。
這種特殊情況的圖例如圖7所示,這時指令6所讀到的j有可能是來自循環(huán) 或者分支內(nèi)部,也有可能來自指令l,對于這樣的情況,需要對原先分解的線程 做出調(diào)節(jié),把指令l以及控制條件下面含有j的指令分配在同一個線程中。
權利要求
1.一種基于數(shù)據(jù)流分析的單線程程序并行化的實現(xiàn)方法,其特征在于1)分解算法的實現(xiàn)分解算法是把單線程程序分解成多個線程的算法實現(xiàn),這個算法根據(jù)聯(lián)合依賴關系圖當中的指令依賴性,把單個線程分解成兩個或多個線程,分解算法是一個遞歸的過程,它首先作出非嵌套循環(huán)或者無循環(huán)部分的聯(lián)合依賴關系圖,根據(jù)原程序中指令執(zhí)行的時間以及數(shù)據(jù)依賴關系,向圖中的節(jié)點和邊的添加屬性,之后是圖的分解過程,分解算法考慮的是分解后線程的通信代價和線程之間的平衡性,把圖中的節(jié)點分配到不同的組中,組成不同的線程,然后向線程中插入生產(chǎn)者消費者指令,分解后,被分解的部分被當作一個節(jié)點插入原來代碼當中,分解算法繼續(xù)分解新組成的代碼中的非嵌套循環(huán)部分,如此遞歸進行,直到分解完整個需要分解的代碼;2)根據(jù)指令依賴關系作出聯(lián)合依賴關系圖單線程程序指令之間存在兩種依賴關系,分別是指令之間的數(shù)據(jù)依賴和控制依賴。當單線程程序別分解成多個線程而并行執(zhí)行的時候,還存在反向的數(shù)據(jù)依賴關系。聯(lián)合依賴關系圖是混合這三種依賴關系的圖,它的作法是這樣的首先以程序中的指令作為圖的節(jié)點,然后根據(jù)指令之間的依賴關系添加上述的三種依賴關系。在添加完依賴關系以后,以圖中不存在依賴的節(jié)點為起始節(jié)點,消除與這些節(jié)點連接的所有邊,查找圖中新的不存在依賴的節(jié)點,取出這些節(jié)點加入到起始節(jié)點的集合中,在起始節(jié)點的集合中添加新節(jié)點與舊節(jié)點在程序執(zhí)行中的先后關系,消除新節(jié)點在原來依賴圖中所有與之相連的邊。這樣循環(huán)進行直到所有節(jié)點被添加到起始節(jié)點集合為止;3)函數(shù)、過程內(nèi)聯(lián)和程序中三種基本元素的分解函數(shù)和過程會使指令流跳出到被分解部分的代碼,這使得分解過程難以繼續(xù)進行,因此需要把被分解代碼部分內(nèi)的函數(shù)和過程被內(nèi)聯(lián)進來?;緣K、條件分支和循環(huán)是程序的三種基本元素,循環(huán)被分解算法作為基本分解單元,分支和循環(huán)需要控制條件值的傳遞,基本塊可以被直接分解,但會存在數(shù)據(jù)依賴和反向數(shù)據(jù)依賴;4)生產(chǎn)者消費者通信模式及硬件實現(xiàn)分解后線程之間的通信通過生產(chǎn)者消費者方式解決,生產(chǎn)者消費者需要在倉庫中存儲和消費所通信的值,如果以內(nèi)存為倉庫,由于內(nèi)存的速度慢,對內(nèi)存的讀寫影響分解后線程的性能,為了能夠更快的完成生產(chǎn)者消費者,減少通信代價,一種硬件的實現(xiàn)可以有效的改進效率;5)分解后線程間通信的一個特殊例子考慮對于生產(chǎn)者消費者的實現(xiàn),有一個特殊的例子需要被考慮,當消費者消費的值有可能來自分支或循環(huán)內(nèi)部,也有可能來之分支或循環(huán)前面時生產(chǎn)者需要在一個特定的點生產(chǎn)或者向倉庫中的同一個單元進行生產(chǎn),不然消費者得到的值可能是錯誤的或者過時的。
全文摘要
本發(fā)明公開了一種基于數(shù)據(jù)流分析的單線程程序并行化的實現(xiàn)方法。本發(fā)明通過分析單線程程序中指令之間的數(shù)據(jù)依賴性,把單線程程序分解成多線程程序,單線程程序指令之間的依賴性有數(shù)據(jù)依賴和控制依賴兩種,控制依賴是對控制條件值的依賴,是一種特殊的數(shù)據(jù)依賴。本發(fā)明在線程分解的過程中,同時考慮分解后線程通信代價和線程之間的平衡性。本發(fā)明的優(yōu)勢在于能夠使單線程程序的不同部分并行執(zhí)行,進而減短程序執(zhí)行時間提高程序執(zhí)行效率。單線程程序的并行化方法尤其適合當今的多核結構。
文檔編號G06F9/38GK101515231SQ20091009714
公開日2009年8月26日 申請日期2009年3月23日 優(yōu)先權日2009年3月23日
發(fā)明者超 王, 繆良華, 蔣冠軍, 劍 陳, 陳天洲 申請人:浙江大學