
本發(fā)明涉及計算機
技術領域:
,尤其涉及處理不規(guī)則應用的方法及裝置。
背景技術:
:本部分旨在為權利要求書中陳述的本發(fā)明實施例提供背景或上下文。此處的描述不因為包括在本部分中就承認是現(xiàn)有技術。為了提高應用的執(zhí)行效率,當前對并行化技術的研究也越來越多?,F(xiàn)有的基于c語言或opencl等的高層次綜合(high-levelsynthesis,hls)為了實現(xiàn)并行化處理,需要在編譯期間提取應用的并行性。然而,這樣的技術僅適用于執(zhí)行規(guī)則應用,而在實現(xiàn)不規(guī)則應用(irregularapplication)(例如,圖形分析和稀疏矩陣計算等)方面性能極差。這是因為,不規(guī)則應用通常具有不佳的局域性或靜態(tài)不可預測的控制流,這種應用中的任務依賴關系只能在運行期間給定輸入數(shù)據(jù)后才能完全確定,這導致現(xiàn)有的高層次綜合方案在實現(xiàn)不規(guī)則應用時過度串行化,執(zhí)行效率非常低。因此,目前想要實現(xiàn)不規(guī)則應用的并行化,僅能通過人工的方式來統(tǒng)籌不規(guī)則應用內的并行性,但是實現(xiàn)的復雜度非常大。那么,如何高效地執(zhí)行不規(guī)則應用成為亟待解決的問題。技術實現(xiàn)要素:為了高性能地執(zhí)行不規(guī)則應用,本發(fā)明實施例提供如下解決方案:在本發(fā)明實施例中,提供一種處理不規(guī)則應用的方法,該方法包括:確定不規(guī)則應用的m類任務,m為正整數(shù);并行地執(zhí)行所述m類任務,其中,所述m類任務中的每類任務中的各個任務分別具有索引,每個任務的索引用于表示該任務在不規(guī)則應用中出現(xiàn)的順序;對于所述m類任務中的第x類任務中的第i個任務而言,i是正整數(shù),x是小于或者等于m的正整數(shù):當所述第i個任務被執(zhí)行到約定點時,暫停所述第i個任務,并根據(jù)所述第i個任務的索引確定與所述第i個任務對應的規(guī)則,與所述第i個任務對應的規(guī)則用于表示所述第i個任務與所述m類任務中的其它任務的依賴關系;根據(jù)與所述第i個任務對應的規(guī)則,檢查所述第i個任務的當前狀態(tài),以便引導所述第i個任務的繼續(xù)執(zhí)行。在本發(fā)明實施例中,還提供一種處理不規(guī)則應用的裝置,該裝置包括:任務確定模塊,用于確定不規(guī)則應用的m類任務,m為正整數(shù);任務執(zhí)行模塊,用于并行地執(zhí)行所述m類任務,其中,所述m類任務中的每類任務中的各個任務分別具有索引,每個任務的索引用于表示該任務在不規(guī)則應用中出現(xiàn)的順序;所述任務執(zhí)行模塊,還用于:對于所述m類任務中的第x類任務中的第i個任務而言,i是正整數(shù),x是小于或者等于m的正整數(shù):當所述第i個任務被執(zhí)行到約定點時,暫停所述第i個任務,并根據(jù)所述第i個任務的索引確定與所述第i個任務對應的規(guī)則,與所述第i個任務對應的規(guī)則用于表示所述第i個任務與所述m類任務中的其它任務的依賴關系;根據(jù)與所述第i個任務對應的規(guī)則,檢查所述第i個任務的當前狀態(tài),以便引導所述第i個任務的繼續(xù)執(zhí)行。在本發(fā)明實施例中,還提供一種處理不規(guī)則應用的裝置,該裝置包括處理系統(tǒng)、存儲器及存儲在所述存儲器上并可在所述處理系統(tǒng)上運行的計算機程序,所述處理系統(tǒng)與所述存儲器相耦合,所述處理系統(tǒng)執(zhí)行所述計算機程序時實現(xiàn)上述處理不規(guī)則應用的方法。在本發(fā)明實施例中,還提供一種計算機可讀存儲介質,所述計算機可讀存儲介質存儲有可執(zhí)行上述處理不規(guī)則應用的方法的計算機程序。在本發(fā)明實施例中,通過劃分出不規(guī)則應用的m類任務,使這m類任務并行地執(zhí)行,能夠提高不規(guī)則應用的執(zhí)行性能和效率;而在任務被執(zhí)行到約定點時,依據(jù)其與其它任務的依賴關系來檢查該任務的當前狀態(tài),根據(jù)該當前狀態(tài)來引導該任務的繼續(xù)執(zhí)行,由此能夠確保任務并行執(zhí)行結果的正確性。因此,通過本發(fā)明實施例,能夠以細粒度流水并行化的方式高效地并且正確地執(zhí)行不規(guī)則應用。附圖說明為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。在附圖中:圖1為本發(fā)明實施例中處理不規(guī)則應用的方法的流程圖;圖2為本發(fā)明實施例中不規(guī)則應用的示例代碼片段圖;圖3為本發(fā)明實施例中在fpga上實現(xiàn)不規(guī)則應用的過程示意圖;圖4(a)-圖4(d)為本發(fā)明實施例中生成適用于fpga實現(xiàn)的布爾數(shù)據(jù)流圖的過程的示例圖,其中,圖4(a)示出了不規(guī)則應用的代碼片段的例子,圖4(b)示出了針對該代碼片段的程序依賴關系圖,圖4(c)示出了依據(jù)圖4(b)轉換得到的數(shù)據(jù)流圖,圖4(d)示出了bdfg可以實現(xiàn)為fpga的數(shù)據(jù)通路的例子;圖5為本發(fā)明實施例中可實現(xiàn)本發(fā)明實施例的系統(tǒng)的示例圖;圖6為本發(fā)明實施例中數(shù)據(jù)通路模塊與規(guī)則引擎模塊之間的交互過程示例圖,其中,(a)示出了在數(shù)據(jù)通路模塊512中的示例流水線1,(b)示出了規(guī)則引擎模塊513的結構示意圖,(c)示出了作為一個例子的通用規(guī)則偽代碼段;圖7為根據(jù)本發(fā)明一個實施例的處理不規(guī)則應用的裝置的示意框圖;圖8為根據(jù)本發(fā)明另一實施例的處理不規(guī)則應用的裝置的示意框圖。具體實施方式為使本發(fā)明實施例的目的、技術方案和優(yōu)點更加清楚明白,下面結合附圖對本發(fā)明實施例做進一步詳細說明。在此,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,但并不作為對本發(fā)明的限定。如前所述,由于不規(guī)則應用中的任務間依賴關系只有在運行期間給定輸入數(shù)據(jù)后才能完全確定,因此基于c語言或者opencl等的高層次綜合通常過度串行化地執(zhí)行不規(guī)則應用,導致執(zhí)行性能非常差。本發(fā)明實施例提供了處理不規(guī)則應用的方案,能夠有效地解決上述問題。下面將結合各個實施例來詳細描述本發(fā)明實施例的方案。圖1為本發(fā)明實施例中處理不規(guī)則應用的方法的流程圖,如圖1所示,該方法可以包括:步驟101、確定不規(guī)則應用的m類任務,m為正整數(shù);步驟102、并行地執(zhí)行所述m類任務,其中,所述m類任務中的每類任務中的各個任務分別具有索引,每個任務的索引用于表示該任務在不規(guī)則應用中出現(xiàn)的順序;對于所述m類任務中的第x類任務的第i個任務而言,i是正整數(shù),x是小于或者等于m的正整數(shù):當所述第i個任務被執(zhí)行到約定點時,暫停所述第i個任務,并根據(jù)所述第i個任務的索引確定與所述第i個任務對應的規(guī)則,與所述第i個任務對應的規(guī)則用于表示所述第i個任務與所述m類任務中的其它任務的依賴關系;根據(jù)與所述第i個任務對應的規(guī)則,檢查所述第i個任務的當前狀態(tài),以便引導所述第i個任務的繼續(xù)執(zhí)行??梢姡诒景l(fā)明實施例中,通過劃分出不規(guī)則應用的m類任務,使這m類任務并行地執(zhí)行,能夠提高不規(guī)則應用的執(zhí)行性能和效率;而在任務被執(zhí)行到約定點時,依據(jù)其與其它任務的依賴關系來檢查該任務的當前狀態(tài),根據(jù)該當前狀態(tài)來引導該任務的繼續(xù)執(zhí)行,由此能夠確保任務并行執(zhí)行結果的正確性。因此,通過本發(fā)明實施例,能夠以細粒度流水并行化的方式高效地、正確地、自動地執(zhí)行不規(guī)則應用。具體而言,在本發(fā)明實施例中,由于不規(guī)則應用可以被抽象(abstracted)為可并行的任務,而任務間的依賴關系可以被抽象為規(guī)則,這樣在編譯期間可以積極地假定任務之間的依賴關系不存在,能夠確保任務并行執(zhí)行,從而提高計算性能;然后在運行期間在約定點處依據(jù)規(guī)則來檢查任務的狀態(tài),從而能夠確保并行結果的正確性。因此,通過本發(fā)明實施例,能夠以高層次模型來實現(xiàn)不規(guī)則應用的并行化處理,相比現(xiàn)有的人工統(tǒng)籌并行性的方式而言極大地降低了實現(xiàn)復雜度。在本發(fā)明實施例中,確定不規(guī)則應用的m類任務可以有多種方式,本發(fā)明對此不作限定,相關的變化例均應落入本發(fā)明的保護范圍,例如,考慮到不規(guī)則應用通常圍繞著循環(huán)結構而建,可以將不規(guī)則應用中的m個循環(huán)識別為m類任務??梢岳斫獾氖?,m個循環(huán)可以是并列的或者嵌套的。例如,根據(jù)編譯器的分類方法,可以將循環(huán)結構分為for-all和for-each循環(huán)。如本領域中所已知的,對于for-all循環(huán)而言,所有迭代能夠并行執(zhí)行。而對于for-each循環(huán)而言,后面的迭代可能需要從前面的迭代得到正確的值。因此,上述m類任務可以包括for-each任務和for-all任務。此外,每類任務可以包括至少一個任務,每個任務可以是該類任務對應的循環(huán)中的一個迭代。也就是說,循環(huán)中的每個迭代可以被抽象為一個任務。那么,可以理解的是,在一類任務執(zhí)行的過程中,也就是一個循環(huán)執(zhí)行的過程中,可以動態(tài)創(chuàng)建新任務。為了便于說明,在本文中以t表示任務,σ表示程序狀態(tài)域(即存儲器位置以及在所述位置上存儲的值),t表示任務域。任務t可以是一個從狀態(tài)到狀態(tài)和任務的部分函數(shù),t:σ→σ×t。具有相同函數(shù)(即循環(huán)體)的任務可以被劃分成一個任務集。那么,基于任務集中使用的循環(huán)結構,任務集可以被分為for-all任務集或for-each任務集。任務域t是所有任務集的組合。即,此處的任務域t是所有任務集的叉積或者笛卡爾積。此外,任務還可以分為活動任務和非活動任務。例如,如果一個任務準備好被執(zhí)行,則認為這個任務是活動的。類似地,具有相同函數(shù)的所有活動任務可以形成一個活動的任務集?;顒拥娜蝿占梢允侨蝿占囊粋€子集。另外,對于每類任務(即每個循環(huán))而言,可以使用非負整數(shù)表示其中的每個任務在激活序列中的順序。例如,在for-each任務集中,任務tj(j為非負整數(shù))可以表示第j個被激活的任務;在for-all任務集中,任務激活的順序不影響執(zhí)行順序,所以所有任務可以均使用0或者其它數(shù)字來標識,從而使得這些任務可以具有相同的順序。在一個實施例中,可以為m類任務中的每類任務中的各個任務分別分配索引,其中每個任務的索引可以用于表示該任務在不規(guī)則應用中出現(xiàn)的順序??梢岳斫獾氖?,由于可以在每類任務的執(zhí)行期間(例如,一個循環(huán)的運行期間)動態(tài)地創(chuàng)建其中的各個任務,所以各個任務的索引也可以是在運行期間動態(tài)分配的。在一個實施例中,每個任務的索引可以具有m元組的形式。例如,在用于表示第x類任務中的第i個任務的m元組中,第x個元素用于表示第i個任務在第x類任務中的迭代計數(shù),在第x個元素之前的(x-1)個元素分別用于表示m類任務中在第x類任務之前執(zhí)行的(x-1)類任務,該(x-1)個元素的順序可以與該(x-1)類任務在不規(guī)則應用中出現(xiàn)的順序相對應??梢岳斫獾氖?,在將不規(guī)則應用中的m個循環(huán)劃分為m類任務的情況下,m類任務在不規(guī)則應用中出現(xiàn)的順序也就是m個循環(huán)在不規(guī)則應用中出現(xiàn)的順序。另外,上述m元組中的各個元素可以是非負整數(shù)或者正整數(shù)或者其它適用的表示,本發(fā)明實施例對此不作限定。可見,通過這樣的索引方式,能夠使得各個任務維持良好的順序,從而能夠依據(jù)該索引來確保后續(xù)并行執(zhí)行結果的正確性。也就是說,通過這樣的索引方式,能夠確保各個任務并行執(zhí)行的結果與順序執(zhí)行的結果一致??梢岳斫獾氖?,此處所述的順序執(zhí)行可以如下定義:假定初始活動任務為t0,在所有活動任務中選擇最小任務tmin,并將tmin迭代應用到σ,直到沒有活動的任務為止。此處所描述的最小任務可以是指在所有活動任務中索引最小的任務。還可以理解的是,可以通過將索引進行比較來確定索引是否是最小。例如,在上述采用m元組表示索引的情況下,可以將各個任務對應的m元組的各元素從左到右開始進行比較。m元組中前面的元素可以比后面的元素具有更高的權重。例如,可以將第一個任務的m元組與第二個任務的m元組的各個元素對應比較,如果第一個任務的m元組的第1個元素小于第二個任務的第1個元素,則認為第一個任務的索引比第二個任務的索引小。如果第一個任務的m元組的第1個元素等于第二個任務的第1個元素,那么就繼續(xù)比較第一個任務的m元組的第2個元素與第二個任務的m元組的第2個元素,如果第一個任務的m元組的第2個元素比第二個任務的m元組的第2個元素小,則認為第一個任務的索引比第二個任務的索引小。以此類推。應當理解的是,此處的第一個任務和第二個任務中提及的“第一”和“第二”僅是為了在任務之間進行區(qū)別,并非指示這兩個任務在不規(guī)則應用中出現(xiàn)的順序。為了本領域技術人員更好地理解本發(fā)明實施例中描述的索引方式,下面舉例進行說明。應當理解的是,該例子并不對本發(fā)明實施例的范圍造成任何限定。圖2給出了一種不規(guī)則應用的示例代碼片段。在圖2的例子中,具有三個循環(huán)。具體而言,外層具有for-each循環(huán)結構的update循環(huán),該循環(huán)內嵌了另外兩個循環(huán),即具有for-each循環(huán)結構的visit循環(huán)和具有for-all循環(huán)結構的writeback循環(huán)。在該例子中,update循環(huán)、visit循環(huán)和writeback循環(huán)可以分別被表示為3類任務:tu、tv和tw。visit的任務體激活了3種任務(即隊列中的push)??梢岳胕u、iv、iw分別對tu、tv和tw進行編號,其用于表示tu、tv和tw在不規(guī)則應用中出現(xiàn)的順序。在該例子中,iu、iv、iw可以是非負整數(shù)。如圖2中所示,可以分別利用三元組來對tu、tv和tw進行索引。在該例子中,tu={cu++,0,0},tv={iu,cv++,0},tw={iu,iv,0}。其中,cu++表示tu對應的update循環(huán)中的迭代計數(shù),cv++可以表示tv對應的visit循環(huán)中的迭代計數(shù)??梢姡ㄟ^這樣的索引方式,能夠有效地表示任務在不規(guī)則應用中出現(xiàn)的順序,從而為后續(xù)確保任務并行執(zhí)行結果的正確性提供依據(jù)。如上所述,不規(guī)則應用的特征之一是在編譯時間無法解決的依賴關系,因此如果簡單地并行執(zhí)行不規(guī)則應用中的多個任務,它們之間的沖突可能會將錯誤引入程序狀態(tài)中,這樣會導致不規(guī)則應用執(zhí)行錯誤。為了實現(xiàn)不規(guī)則應用的并行化,本發(fā)明實施例可以利用索引來表示不規(guī)則應用中的任務的出現(xiàn)順序,也就是說將不規(guī)則應用抽象為良序的任務集。而對于任務之間的依賴關系,可以將其表示為規(guī)則。當任務執(zhí)行到某一約定點時,通過這樣的規(guī)則來檢查任務是否違反依賴性,然后根據(jù)檢查結果來引導任務的繼續(xù)執(zhí)行,從而能夠確保并行執(zhí)行結果的正確性。在本發(fā)明實施例中,采用了積極的并行化思想。具體地,根據(jù)是否允許同時執(zhí)行有沖突的任務,積極的并行化技術可以分為兩類:(1)推測性并行(speculativeparallelization):執(zhí)行多個任務,而不考慮其之間的沖突。每個任務可以在運行時間期間檢查其與其它任務之間的沖突。若與先前的任務發(fā)生了沖突,則應中止該任務。(2)協(xié)調并行(coordinativeparallelization):確保僅激活不沖突的任務。無論是通過上述推測性并行技術還是協(xié)調并行技術來并行地執(zhí)行不規(guī)則應用的m類任務,都可以在任務被執(zhí)行到約定點時,利用本發(fā)明實施例所定義的規(guī)則來檢查其當前狀態(tài),從而正確地引導該任務的繼續(xù)執(zhí)行。在本發(fā)明實施例中,約定點(rendezvous)可以是預先定義的,例如,可以由編程人員預先將用于指定約定點的指令或者類似的指示嵌入到不規(guī)則應用中。在本發(fā)明實施例中,規(guī)則可以是如下定義的:規(guī)則是在未來當其創(chuàng)建者按計劃到達約定點時,向其創(chuàng)建者返回某個值的承諾。該返回的值可以是運行系統(tǒng)跨越從規(guī)則的創(chuàng)建到返回點之間的所有狀態(tài)的函數(shù)。具體而言,對于上述第i個任務而言,當?shù)趇個任務被執(zhí)行到約定點時,可以暫停第i個任務,并根據(jù)第i個任務的索引確定與第i個任務對應的規(guī)則。在一個實施例中,可以至少基于第i個任務的索引對預先定義的通用規(guī)則進行實例化,以創(chuàng)建與第i個任務對應的規(guī)則,其中,通用規(guī)則可以用于表示不規(guī)則應用的任務之間的依賴關系。例如,可以將第i個任務的索引(比如,以上的m元組)以及其它相關參數(shù)作為輸入提供給通用規(guī)則,由此對該通用規(guī)則進行實例化,從而創(chuàng)建與第i個任務對應的規(guī)則??梢?,每個實例化的規(guī)則可以是在運行時間創(chuàng)建的,并且其可以對應于一個父任務。在一個實施例中,通用規(guī)則可以是預先定義的,例如,可以由編程人員預先編寫通用規(guī)則。在硬件執(zhí)行不規(guī)則應用時,可以調用通用規(guī)則。在一個實施例中,通用規(guī)則可以包括正常路徑和退出路徑。例如,可以利用事件-條件-動作(event-condition-action,eca)語法來定義正常路徑。eca語法可以采用傳統(tǒng)的eca子句(oneventifconditionsdoactions)。例如,規(guī)則的具體語義可以如下:事件(event)觸發(fā)規(guī)則,然后規(guī)則檢查條件(conditions),如果條件滿足,則執(zhí)行動作(action)??梢姡ㄟ^eca語法,能夠簡單有效地表示任務之間的依賴關系,從而能夠簡化不規(guī)則應用的并行化實現(xiàn)。此外,在可選的實施例中,上述事件可以包括任務的激活、任務到達任務體中的特定操作、或這兩類事件的組合。通過用信號的方式發(fā)送事件,將所觸發(fā)的任務的索引和數(shù)據(jù)域廣播給所有規(guī)則。上述條件可以是布爾表達式,其包括所觸發(fā)的事件中的索引和數(shù)據(jù)域、父任務在創(chuàng)建該規(guī)則時傳送的參數(shù)。上述動作可以包括在父任務的任務體中返回用于引導任務令牌的一個布爾值。應當理解的是,此處關于事件、條件和動作的描述僅是示例性說明,本發(fā)明實施例對此并不限定。本領域技術人員可以根據(jù)具體實現(xiàn)情況來定義事件、條件和動作的具體內容。從上述可知,當任務到達約定點時,其將暫停并等待對應規(guī)則的返回值。然而,如果沒有在規(guī)則的正常路徑上返回一個值,任務可能將永遠在約定點等待,這樣可能會出現(xiàn)死鎖,尤其是執(zhí)行資源有限時。因此,在一個實施例中,規(guī)則可以包含退出路徑。當無法通過規(guī)則的正常路徑返回值時,可以執(zhí)行規(guī)則的退出路徑,由此退出規(guī)則的執(zhí)行過程,從而確保不會出現(xiàn)死鎖。例如,當規(guī)則的父任務是在約定點處所有等待任務中的最小任務時,可以自動觸發(fā)退出路徑。關于最小任務的確定,可以參見前述內容,此處不再贅述。因此,在一個實施例中,規(guī)則可以由任務中用于創(chuàng)建的構造函數(shù)(constructor)、許多eca子句和一個otherwise子句構成。應當理解的是,雖然以上描述了利用eca語法來定義規(guī)則,但是在其它實施例中,還可以采用本領域技術中其它適用的語法來定義規(guī)則,例如,可以采用任何支持基于future和promise語法的異步編程范式的語言。本發(fā)明實施例對此不作限定。如上所述,在具體的實施例中,根據(jù)與第i個任務對應的規(guī)則,檢查第i個任務的當前狀態(tài),可以包括:當根據(jù)與第i個任務對應的規(guī)則的正常路徑而產生正常返回值時,根據(jù)該正常返回值來檢查第i個任務的當前狀態(tài),以便引導第i個任務的繼續(xù)執(zhí)行;當根據(jù)與第i個任務對應的規(guī)則的正常路徑無法產生正常返回值時,根據(jù)與第i個任務對應的規(guī)則的退出路徑,退出與第i個任務對應的規(guī)則的運行,以便根據(jù)退出路徑所產生的設定值來繼續(xù)執(zhí)行第i個任務。在一個實施例中,第i個任務可以是在約定點處等待的任務中索引最小的任務。當根據(jù)與第i個任務對應的規(guī)則的正常路徑無法產生正常返回值時,可以執(zhí)行退出路徑,由此通過退出路徑返回一個設定值,該設定值可以指示退出對任務狀態(tài)的檢查,繼續(xù)任務的執(zhí)行。本發(fā)明實施例的方案可以在可重構硬件(例如,現(xiàn)場可編程門陣列(field-programmablegatearray,fpga))上執(zhí)行,也可以在非可重構硬件(例如,處理器)上執(zhí)行。也就是說,通過本發(fā)明實施例,可以在可重構硬件或者非可重構硬件上實現(xiàn)不規(guī)則應用的并行化,從而能夠高效地處理不規(guī)則應用。為了在可重構硬件上執(zhí)行本發(fā)明實施例的處理不規(guī)則應用的方法,關于并行地執(zhí)行m類任務,可以包括:將m類任務分別分配在n個任務隊列中,n為正整數(shù);生成k個數(shù)據(jù)通路,k為正整數(shù);在k個數(shù)據(jù)通路上并行地執(zhí)行n個任務隊列,其中,n個任務隊列中的每個任務隊列中的任務被并行地執(zhí)行。例如,任務隊列中的任務可以按照先入先出的順序被彈入到相應的數(shù)據(jù)通路中。例如,數(shù)據(jù)通路可以是通過流水線(pipeline)來實現(xiàn)的??梢岳斫獾氖牵粋€任務隊列可以由一個或多個數(shù)據(jù)通路來執(zhí)行。每個任務隊列可以包括一個或多個任務。本發(fā)明實施例對此不作限定。關于將m類任務分別分配在n個任務隊列中,可以包括:將m類任務劃分為n個任務集,其中,每個任務集中的任務具有相同的函數(shù);將n個任務集分別分配給n個任務隊列,其中,每個任務集對應于一個任務隊列。這里的n個任務集可以是活動的任務集,任務集中的任務都處于準備執(zhí)行狀態(tài)??梢姡ㄟ^這樣的實施例,能夠在可重構硬件上高效地實現(xiàn)不規(guī)則應用的并行化。近年來,可重構硬件由于可編程的靈活性以及空間上的并行性,能夠顯著提升處理性能,因此也成為主流研究方向之一。傳統(tǒng)上,可重構硬件使用硬件描述語言(hardwaredescriptionlanguages,hdl)進行編程,hdl基于以硬件為中心的抽象。因此,關于在可重構硬件上上實現(xiàn)不規(guī)則應用,僅能通過人工統(tǒng)籌不規(guī)則應用的內在并行性,并使用hdl設計將不規(guī)則應用有效地映射到可重構硬件上。然而,這樣的人工方法復雜性非常高,難于在日益發(fā)展的各種復雜系統(tǒng)(例如,倉庫規(guī)模和分布式系統(tǒng))中實現(xiàn)。對于現(xiàn)有的針對可重構硬件的高級語言編程模型(如基于c語言或opencl的高層次綜合)而言,需要在編譯時間提取應用中的并行性,而不規(guī)則應用中的任務間依賴關系只有在運行期給定輸入數(shù)據(jù)后才能完全確定,因此,這樣的高級語言編程模型僅適用于規(guī)則應用,而不太適用于不規(guī)則應用。對此,本發(fā)明實施例提供的方案非常適合于在可重構硬件上高效地實現(xiàn)不規(guī)則應用。利用本發(fā)明實施例的方案,能夠以高層次綜合在fpga上實現(xiàn)不規(guī)則應用,也就是說,能夠將不規(guī)則應用高性能地、正確地、自動地被轉化成fpga上的硬件加速器。此外,通過本發(fā)明實施例的方案,對于開發(fā)人員來說也無需了解硬件知識,能夠減輕開發(fā)人員的處理復雜度。為了本領域技術人員更好地理解本發(fā)明實施例,下面將通過例子進一步說明如何在作為典型的可重構硬件的fpga上實現(xiàn)不規(guī)則應用的并行化。應當理解的是,以下例子并不對本發(fā)明實施例的范圍造成任何限制。下面將結合各個圖來描述這些例子。圖3為根據(jù)本發(fā)明一個實施例的在fpga上實現(xiàn)不規(guī)則應用的過程示意圖。如圖3所示,在框301中,可以確定不規(guī)則應用的m類任務,其中,每類任務中的各個任務分別被分配有索引,每個任務的索引可以用于表示該任務在不規(guī)則應用中出現(xiàn)的順序。此外,可以預先定義通用規(guī)則,該通用規(guī)則可以用于表示各個任務之間的依賴關系。在框302中,可以根據(jù)框301中確定的任務和規(guī)則,將不規(guī)則應用轉換為布爾數(shù)據(jù)流圖(booleandataflowgraph,bdfg)。框302的過程可以利用本領域中適用的編程語言來實現(xiàn)。可以理解的是,該過程可以在與fpga相耦合的處理器上實現(xiàn),也可以在fpga上實現(xiàn),本發(fā)明實施例對此不作限定。下面還將結合具體例子來描述框302的操作。在框303中,可以根據(jù)布爾數(shù)據(jù)流圖,在fpga上生成數(shù)據(jù)通路,以執(zhí)行不規(guī)則應用。也就是說,可以將不規(guī)則應用映射為fpga上的加速器。圖4(a)-4(d)示出了生成適用于fpga實現(xiàn)的布爾數(shù)據(jù)流圖的過程的例子。例如,圖4(a)示出了不規(guī)則應用的代碼片段的例子。圖4(b)示出了針對該代碼片段的程序依賴關系圖(programdependencegraph,pdg)。在圖4(b)中,虛線可以表示控制依賴關系。圖4(c)示出了依據(jù)圖4(b)轉換得到的數(shù)據(jù)流圖。該數(shù)據(jù)流圖將程序的控制依賴關系編碼成參與者/節(jié)點(即任務)之間的數(shù)據(jù)依賴關系,從而能夠消除集中控制單元的需要。當在fpga上實現(xiàn)時,可以使bdfg中的一個參與者/節(jié)點對應于fpga的一個計算模塊,bdfg中的每條連線可以對應于fpga上的一條通信鏈路(由互連線和緩存隊列組成)。計算模塊可以受上級通信鏈路的數(shù)據(jù)驅動,獲取輸入數(shù)據(jù)進行計算,然后將計算結果輸出到下級通信鏈路中。由此,bdfg可以實現(xiàn)為fpga的數(shù)據(jù)通路,例如,如圖4(d)所示。另外,在圖4(b)-圖4(d)中,“l(fā)d”可以表示“讀取(load)”,“eq”可以表示“相等(equal)”,“st”可以表示“寫入(store)”。此外,也可以通過系統(tǒng)化的方式,將通用規(guī)則轉換為bdfg,從而進一步在fpga上實現(xiàn)規(guī)則。圖5示出了可實現(xiàn)本發(fā)明實施例的系統(tǒng)的例子的示意框圖。如圖5所示,該系統(tǒng)可以包括fpga510、處理器520和存儲器530。fpga510可以與處理器520以及存儲器530相耦合。例如,處理器520可以是任何適用的處理器,例如英特爾的xeon處理器。存儲器530可以包括任何適用的存儲器,例如動態(tài)隨機存取存儲器(dynamicrandomaccessmemory,dram)。如圖5所示,fpga510可以包括任務隊列模塊511、數(shù)據(jù)通路模塊512、規(guī)則引擎模塊513和存儲器子系統(tǒng)514。任務隊列模塊511可以包括至少一個任務隊列。在一個實施例中,每個任務隊列可以包括一個活動任務集。如上所述,活動任務集可以包括不規(guī)則應用的至少一個活動任務,所述至少一個活動的任務可以具有相同的函數(shù)??梢岳斫獾氖牵斎蝿毡煌迫胍粋€任務隊列中時,可以認為該任務是活動的。數(shù)據(jù)通路模塊512可以包括至少一條流水線。例如,根據(jù)bdfg的拓撲,可以逐步生成多個流水線,直到達到fpga的資源限制為止。然而,具有不可預測的時延的操作可能會嚴重降低流水線的利用率。例如,對fpga上的64kb緩存的直接讀命中可能會有70ns(或者14fpga周期)的時延,而緩存未中會使得存儲器操作停止大約200ns。針對于該問題,本發(fā)明實施例中采用動態(tài)數(shù)據(jù)流方案,根據(jù)操作數(shù)的可用性來對任務重新排序。這樣,可以繞過受阻的任務。如圖4(d)中所示,雖然任務a3因緩存未中而停止,但是讀取(即,ld)操作節(jié)點仍然發(fā)出新請求a4。此外,在本發(fā)明實施例中,可以將亂序執(zhí)行限制在之前描述的約定點,從而確保這些任務并行執(zhí)行結果的正確性??蛇x地,為了確保數(shù)據(jù)通路實現(xiàn)簡單,可以在將讀取操作節(jié)點中的亂序結果輸出到下級通信鏈路之前,將這些結果恢復為正常順序。在一個實施例中,處理器520可以對任務隊列進行初始化。任務隊列中的任務可以按照先入先出的順序,被彈入到數(shù)據(jù)通路模塊512中的流水線中。例如,每個任務隊列可以對應于一條流水線或者多條流水線。規(guī)則引擎模塊513可以實現(xiàn)以上所述的通用規(guī)則??梢岳斫獾氖?,針對不同類型的任務,可能需要分別預先定義不同類型的通用規(guī)則。因此,規(guī)則引擎模塊513可以實現(xiàn)不同類型的通用規(guī)則。在需要確定某個任務對應的規(guī)則時,規(guī)則引擎模塊513可以利用該任務的索引和相關的參數(shù),對通用規(guī)則進行實例化,從而創(chuàng)建與該任務對應的規(guī)則。此外,可以理解的是,數(shù)據(jù)通路模塊512中的至少一個流水線可以共享規(guī)則引擎模塊513,從而能夠保證執(zhí)行結果的正確性。存儲器子系統(tǒng)514可以通過本領域已知的任何可用的存儲器來實現(xiàn),其可以用于存儲實現(xiàn)本發(fā)明實施例所涉及的相關信息(例如,fpga的配置信息等)。下面將結合例子來描述數(shù)據(jù)通路模塊512與規(guī)則引擎模塊513之間的交互過程。應當理解的是,該例子僅是為了幫助本領域技術人員更好地理解本發(fā)明實施例,而非限制本發(fā)明實施例的范圍。圖6中的(a)-(c)示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)通路模塊512與規(guī)則引擎模塊513之間的交互過程。具體而言,圖6中(a)示出了在數(shù)據(jù)通路模塊512中的示例流水線1。圖6中(b)示出了規(guī)則引擎模塊513的結構示意圖。圖6中(c)示出了作為一個例子的通用規(guī)則偽代碼段。如圖圖6中(a)中所示,在流水線1中可以分配規(guī)則。例如,使用任務的索引和其它變量作為輸入參數(shù),來創(chuàng)建與該任務對應的規(guī)則(圖6中(c)②)。規(guī)則引擎模塊513中的分配器(allocator)可以為該任務的索引分配規(guī)則通道(rulelane)(圖6中(c)③)。在沒有通道可用的情況下,可以暫停父任務。另外,通過廣播到達特定操作的任務,規(guī)則引擎模塊513中的事件總線(eventbus)可以捕獲到事件。若某一任務對應的規(guī)則通過執(zhí)行正常路徑(例如,圖6中(c)中由eca語法所定義的路徑)得到返回值,則可以將返回值放置在規(guī)則引擎模塊513中的返回緩沖器(returnbuffer)中,并釋放相應的規(guī)則通道。在流水線1中,約定點被設計為開關(switch),其對亂序的返回值進行重新排序,并基于這些值引導任務的繼續(xù)執(zhí)行。另外,可以將在所有流水線上的約定點處的最小任務的索引廣播給規(guī)則通道,以便在無法執(zhí)行正常路徑時,觸發(fā)規(guī)則中的退出路徑(例如,otherwise子句(圖6中(c)④))??梢岳斫獾氖牵颂幍囊?guī)則引擎模塊可以等效于積極并行化實現(xiàn)中的運行調度器。可見,通過上述實施例,能夠在fpga上實現(xiàn)不規(guī)則應用的細粒度流水并行,從而能夠將不規(guī)則應用高性能地、正確地、自動地轉化成fpga上的硬件加速器。另外,為了進一步說明本發(fā)明實施例的有益效果,以下對本發(fā)明實施例的方案和現(xiàn)有方案在英特爾的harp(intel-alteraheterogeneousarchitectureresearchplatform,異構架構研究平臺)上的執(zhí)行結果進行了比較。harp可以包括一個處理器和一個alterastratixv5sgxea7n1fc45fpga。在該例子中,所測試的不規(guī)則應用為寬度優(yōu)先搜索(breadth-firstsearch,bfs)算法。在測試中使用的現(xiàn)有的、公開的方案是基于opencl語言,人為地分析bfs的并行性,并編寫相應的代碼,然后利用alteraopencl工具生成在fpga上實現(xiàn)的程序。相應地,使用的基準測試程序如下:采用本發(fā)明實施例的推測并行化的bfs(spec-bfs)和協(xié)調并行化的bfs(coor-bfs),以及采用現(xiàn)有方案的opencl版本的bfs(opencl-bfs)。在表1中,示出了采用本發(fā)明實施例的spec-bfs和coor-bfs在fpga上的執(zhí)行時間,以及采用現(xiàn)有方案的opencl-bfs在fpga上的執(zhí)行時間。表1采用的方案opencl-bfsspec-bfscoor-bfs執(zhí)行時間(秒)124.10.470.64從表1可以看出,采用本發(fā)明實施例對不規(guī)則應用的處理結果明顯優(yōu)于現(xiàn)有方案的處理結果??梢?,與現(xiàn)有處理方案相比,本發(fā)明實施例的方案能夠高效地執(zhí)行不規(guī)則應用,而且實現(xiàn)復雜度也極大地降低。圖7是根據(jù)本發(fā)明一個實施例的處理不規(guī)則應用的裝置的示意框圖。如圖7所示,該裝置可以包括:任務確定模塊701,用于確定不規(guī)則應用的m類任務,m為正整數(shù);任務執(zhí)行模塊702,用于并行地執(zhí)行所述m類任務,其中,所述m類任務中的每類任務中的各個任務分別具有索引,每個任務的索引用于表示該任務在不規(guī)則應用中出現(xiàn)的順序;任務執(zhí)行模塊702,還用于:對于所述m類任務中的第x類任務中的第i個任務而言,i是正整數(shù),x是小于或者等于m的正整數(shù):當所述第i個任務被執(zhí)行到約定點時,暫停所述第i個任務,并根據(jù)所述第i個任務的索引確定與所述第i個任務對應的規(guī)則,與所述第i個任務對應的規(guī)則用于表示所述第i個任務與所述m類任務中的其它任務的依賴關系;根據(jù)與所述第i個任務對應的規(guī)則,檢查所述第i個任務的當前狀態(tài),以便引導所述第i個任務的繼續(xù)執(zhí)行。在一個實施例中,任務確定模塊701具體可以用于:將所述不規(guī)則應用中的m個循環(huán)識別為所述m類任務。在一個實施例中,所述索引具有m元組的形式,其中,在用于表示所述第x類任務中的所述第i個任務的m元組中,第x個元素用于表示所述第i個任務在所述第x類任務中的迭代計數(shù),在所述第x個元素之前的(x-1)個元素分別用于表示所述m類任務中在所述第x類任務之前執(zhí)行的(x-1)類任務,所述(x-1)個元素的順序與所述(x-1)類任務在所述不規(guī)則應用中出現(xiàn)的順序相對應。在一個實施例中,任務執(zhí)行模塊702具體可以用于按如下方式根據(jù)所述第i個任務的索引確定與所述第i個任務對應的規(guī)則:至少基于所述第i個任務的索引對預先定義的通用規(guī)則進行實例化,以創(chuàng)建與所述第i個任務對應的規(guī)則,其中,所述通用規(guī)則用于表示所述不規(guī)則應用的任務之間的依賴關系。在一個實施例中,所述通用規(guī)則包括正常路徑和退出路徑,所述正常路徑是利用事件-條件-動作語法而定義的。在一個實施例中,任務執(zhí)行模塊702具體可以用于按如下方式根據(jù)與所述第i個任務對應的規(guī)則,檢查所述第i個任務的當前狀態(tài),以便引導所述第i個任務的繼續(xù)執(zhí)行:當根據(jù)與所述第i個任務對應的規(guī)則的正常路徑而產生正常返回值時,根據(jù)所述正常返回值來檢查所述第i個任務的當前狀態(tài),以便引導所述第i個任務的繼續(xù)執(zhí)行;當根據(jù)與所述第i個任務對應的規(guī)則的正常路徑無法產生正常返回值時,根據(jù)與所述第i個任務對應的規(guī)則的退出路徑,退出與所述第i個任務對應的規(guī)則的運行,以便根據(jù)所述退出路徑所產生的設定值來繼續(xù)執(zhí)行所述第i個任務。在一個實施例中,所述第i個任務是在約定點處等待的任務中索引最小的任務。在一個實施例中,任務執(zhí)行模塊702具體可以用于按如下方式并行地執(zhí)行所述m類任務:將所述m類任務分別分配在n個任務隊列中,n是正整數(shù);生成k個數(shù)據(jù)通路,k為正整數(shù);在所述k個數(shù)據(jù)通路上并行地執(zhí)行所述n個任務隊列,其中,所述n個任務隊列中的每個任務隊列中的任務被并行地執(zhí)行。在一個實施例中,任務執(zhí)行模塊702具體可以用于按如下方式將所述m類任務分別分配在n個任務隊列中:將所述m類任務劃分為n個任務集,其中,每個任務集中的任務具有相同的函數(shù);將所述n個任務集分別分配給所述n個任務隊列,其中,每個任務集對應于一個任務隊列。圖8是根據(jù)本發(fā)明另一實施例的處理不規(guī)則應用的裝置的示意框圖。如圖8所示,該裝置可以包括處理系統(tǒng)801、存儲器802及存儲在所述存儲器802上并可在所述處理系統(tǒng)801上運行的計算機程序,所述處理系統(tǒng)801與所述存儲器802相耦合,所述處理系統(tǒng)801執(zhí)行所述計算機程序時實現(xiàn)上述處理不規(guī)則應用的方法。在一個實施例中,圖8所示的處理不規(guī)則應用的裝置可以是任何能夠實現(xiàn)其功能的設備,例如該設備可以是臺式計算機、膝上型計算機、移動設備等,本發(fā)明對此不作限定。其中的處理系統(tǒng)801可以包括處理器、可重構硬件或者二者的組合,其中處理器例如可以采用通用處理器、控制器等實現(xiàn),如英特爾的xeon處理器等;可重構硬件例如可以包括現(xiàn)場可編程門陣列等,本發(fā)明對此不作限定,相關的變化例均應落入本發(fā)明的保護范圍。存儲器802可以包括任何適用的存儲器,例如動態(tài)隨機存取存儲器等,本發(fā)明對此也不作限定,相關的變化例也應落入本發(fā)明的保護范圍。在本發(fā)明實施例中,還提供一種計算機可讀存儲介質,所述計算機可讀存儲介質存儲有可執(zhí)行上述處理不規(guī)則應用的方法的計算機程序。綜上所述,在本發(fā)明實施例中,通過劃分出不規(guī)則應用的m類任務,使這m類任務并行地執(zhí)行,能夠提高不規(guī)則應用的執(zhí)行性能和效率;而在任務被執(zhí)行到約定點時,依據(jù)其與其它任務的依賴關系來檢查該任務的當前狀態(tài),根據(jù)該當前狀態(tài)來引導該任務的繼續(xù)執(zhí)行,由此能夠確保任務并行執(zhí)行結果的正確性。因此,通過本發(fā)明實施例,能夠以細粒度流水并行化的方式高效地、正確地、自動地執(zhí)行不規(guī)則應用。本領域內的技術人員應明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產品。因此,本發(fā)明可采用完全硬件實施例、完全軟件實施例、或結合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限于磁盤存儲器、cd-rom、光學存儲器等)上實施的計算機程序產品的形式。本發(fā)明是參照根據(jù)本發(fā)明實施例的方法、設備(系統(tǒng))、和計算機程序產品的流程圖和/或方框圖來描述的。應理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設備的處理器以產生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設備的處理器執(zhí)行的指令產生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。這些計算機程序指令也可存儲在能引導計算機或其他可編程數(shù)據(jù)處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設備上,使得在計算機或其他可編程設備上執(zhí)行一系列操作步驟以產生計算機實現(xiàn)的處理,從而在計算機或其他可編程設備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。以上所述的具體實施例,對本發(fā)明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發(fā)明的具體實施例而已,并不用于限定本發(fā)明的保護范圍,凡在本發(fā)明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內。當前第1頁12