專利名稱:靈活通信算子的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及靈活通信算子。
背景技術(shù):
計算機系統(tǒng)通常包括一個或多個通用處理器(例如,中央處理單元(CPU))以及一個或多個專用數(shù)據(jù)并行計算節(jié)點(例如,圖形處理單元(GPU)或CPU中的單指令多數(shù)據(jù) (SIMD)執(zhí)行單元)。通用處理器通常在計算機系統(tǒng)上執(zhí)行通用處理,并且數(shù)據(jù)并行計算節(jié)點通常在計算機系統(tǒng)上執(zhí)行數(shù)據(jù)并行處理(例如圖形處理)。通用處理器通常具有實現(xiàn)數(shù)據(jù)并行算法的能力,但這樣做卻沒有在數(shù)據(jù)并行計算節(jié)點中發(fā)現(xiàn)的優(yōu)化的硬件資源。結(jié)果, 通用處理器在執(zhí)行數(shù)據(jù)并行算法時可能比數(shù)據(jù)并行計算節(jié)點低效得多。數(shù)據(jù)并行計算節(jié)點傳統(tǒng)地在計算機系統(tǒng)上執(zhí)行程序方面扮演通用處理器的輔助角色。隨著為數(shù)據(jù)并行算法優(yōu)化的硬件的角色由于數(shù)據(jù)并行計算節(jié)點處理能力的增強而增加,增強程序員對數(shù)據(jù)并行計算節(jié)點進行編程的能力并使對數(shù)據(jù)并行計算節(jié)點進行編程變得更為容易可能是合乎需要的。數(shù)據(jù)并行算法經(jīng)常對可能跨多個計算平臺分布的大數(shù)據(jù)集進行操作。大數(shù)據(jù)集在表示與跟蹤描述該數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)以及跨多個平臺移動該數(shù)據(jù)上帶來了挑戰(zhàn)。結(jié)果是,管理跨多個計算平臺的大數(shù)據(jù)集的過程經(jīng)常是復(fù)雜的且難以實現(xiàn)。
發(fā)明內(nèi)容
提供本發(fā)明內(nèi)容以便以簡化的形式介紹將在以下的具體實施方式
中進一步描述的一些概念。本發(fā)明內(nèi)容并不旨在標識出所要求保護的主題的關(guān)鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。一種高級編程語言提供了靈活通信算子,該靈活通信算子基于資源圖(resource map)來生成分段的計算空間以跨各計算節(jié)點來分布該計算空間。該靈活通信算子將該計算空間分解為片段,使這些片段被指派給各計算節(jié)點,并允許用戶集中管理并自動化在各計算節(jié)點間的這些片段的移動。可以使用這些片段的完整全局視圖表示或局部全局視圖表示來管理片段移動。
包括附圖來提供對各實施例的進一步理解,且這些附圖被合并在本說明書內(nèi)并構(gòu)成其一部分。附圖示出各實施例,并且與說明書一起用于解釋各實施例的原理。其他實施例和各實施例的許多預(yù)期優(yōu)點將隨著參考下面的詳細描述進行更好的理解而被認識到。附圖的元素不一定相對于彼此而縮放。相同的附圖標記指代對應(yīng)的類似部分。圖I是示出具有靈活通信算子的代碼的實施例的計算機代碼圖。圖2是示出了將靈活通信算子應(yīng)用到輸入可索引類型的實施例的框圖。圖3A-3C是示出了生成并使用靈活可索引類型的示例的框圖。
圖4是示出被配置成編譯并執(zhí)行包括靈活通信算子的數(shù)據(jù)并行代碼的計算機系統(tǒng)的實施例的框圖。
具體實施例方式在以下具體實施例中,對附圖進行了參考,附圖構(gòu)成了實施例的一部分且在其中作為示例示出了可在其中實踐本發(fā)明的各特定實施例。就此,諸如“頂部”、“底部”、“前方”、 “后方”、“前導(dǎo)”、“尾部”等的方向性術(shù)語參考正在描述的附圖的方向來使用。因為實施例的各組件可位于多個不同的方向,所以方向性術(shù)語出于說明的目的來使用而不是限制。可以理解,可以使用其它實施例并且可以做出結(jié)構(gòu)上或邏輯上的改變而不背離本發(fā)明的范圍。 因此,以下詳細描述并不旨在限制,并且本發(fā)明的范圍由所附權(quán)利要求來限定。應(yīng)該理解, 此處描述的各示例性實施例的特征可相互組合,除非另外具體注明。圖I是示出具有靈活通信算子12的代碼10的實施例的計算機代碼圖。當(dāng)被編譯并執(zhí)行時,靈活通信算子12基于資源圖來生成分段的計算空間以跨各計算節(jié)點(例如,在圖4中示出并在下面更詳細描述的計算節(jié)點121)來分布計算空間。靈活通信算子將計算空間(由圖I的實施例中的輸入可索引類型14表示的)分解成靈活可索引類型18(在圖 3B的示例中也示出了)的片段20,致使片段20被指派給計算節(jié)點,并允許用戶集中管理并自動化在計算節(jié)點間的片段20的移動??梢允褂眠@些片段的完整全局視圖表示或局部全局視圖表示來管理片段移動,如下面更詳細描述的。代碼10包括來自高級通用或數(shù)據(jù)并行編程語言的指令序列,該指令序列可被編譯成一個或多個可執(zhí)行代碼(例如,圖4中所示的DP可執(zhí)行代碼138)以由一個或多個DP 最優(yōu)計算節(jié)點(例如,圖4所示的DP最優(yōu)計算節(jié)點121)執(zhí)行。在一個實施例中,代碼10包括來自具有數(shù)據(jù)并行擴展的高級通用編程語言(之后稱為GP語言)的指令序列,所述指令序列形成存儲在一個或多個模塊的集合中的程序。GP 語言可允許程序被編寫在不同部分(即模塊)中,使得每個模塊都可以被存儲在可以由計算機系統(tǒng)訪問的分開的文件或者位置中。GP語言提供用于對包括一個或多個通用處理器和一個或多個專用的DP最優(yōu)計算節(jié)點的計算環(huán)境進行編程的單個語言。DP最優(yōu)計算節(jié)點通常是通用處理器的圖形處理單元(GPU)或SMD單元,但也可包括通用處理器的標量或矢量執(zhí)行單元、場可編程門陣列(FPGA)或一些計算環(huán)境中的其他合適設(shè)備。通過使用GP語言, 程序員可將通用處理器和DP源代碼兩者包含在代碼10中以便由通用處理器和DP計算節(jié)點分別執(zhí)行,并協(xié)調(diào)通用處理器和DP源代碼的執(zhí)行。在該實施例中,代碼10可以表示任何合適類型的代碼,諸如應(yīng)用、庫函數(shù)或操作系統(tǒng)服務(wù)。GP語言可以通過擴展諸如C或C++之類的廣泛適用的高級且通用的編程語言以包括數(shù)據(jù)并行特征來形成。其中可出現(xiàn)DP特征的通用功能語言的其他示例包括JavaTM,PHP, Visual Basic, Perl, Python , CU, Ruby, Delphi, Fortran, VB, F#,OCaml, Haskell, Erlang, NESL,Chapel,以及JavaScript 。GP語言實現(xiàn)可包括允許程序的不同部分被包括在不同模塊中的豐富鏈接能力。數(shù)據(jù)并行特征提供了利用DP最優(yōu)計算節(jié)點的專用體系結(jié)構(gòu)來允許數(shù)據(jù)并行操作比使用通用處理器(即,非DP最優(yōu)計算節(jié)點)更快或更有效地執(zhí)行的編程工具。GP語言也可以是允許程序員對通用處理器和DP最優(yōu)計算節(jié)點兩者均進行編程的另一合適的高級通用編程語言。
在另一個實施例中,代碼10包括來自高級數(shù)據(jù)并行編程語言(此后稱DP語言) 的形成程序的指令序列。DP語言提供了用于對具有一個或多個DP最優(yōu)計算節(jié)點的計算環(huán)境中的DP最優(yōu)計算節(jié)點進行編程的專用語言。通過使用DP語言,程序員在代碼10中生成旨在供在DP最優(yōu)計算節(jié)點上執(zhí)行的DP源代碼。DP語言提供了利用DP最優(yōu)計算節(jié)點的專用體系結(jié)構(gòu)來允許數(shù)據(jù)并行操作比使用通用處理器更快或更有效地執(zhí)行的編程工具。DP 語言可以是現(xiàn)有的 DP 編程語言,諸如 HLSL、GLSL、Cg、C、C++、NESL、Chapel、CUDA、OpenCL、 Accelerator> Ct> PGI GPGPU Accelerator> CAPS GPGPU Accelerator> Brook+> CAL> APL> Fortran 90 (以及更高版本)、Data Parallel C (數(shù)據(jù)并行C)、DAPPLE或APL。在該實施例中,代碼10可以表示任何合適類型的DP源代碼,諸如應(yīng)用、庫函數(shù)或操作系統(tǒng)服務(wù)。代碼10包括被指定為在DP最優(yōu)計算節(jié)點上執(zhí)行的代碼部分。在使用GP語言來編寫代碼10的圖I的實施例中,GP語言允許程序員在定義矢量函數(shù)時使用注釋26(例如, —declspec (vector)...)來指定GP源代碼。注釋26與旨在供在DP最優(yōu)計算節(jié)點上執(zhí)行的矢量函數(shù)的函數(shù)名27 (例如vector_func)相關(guān)聯(lián)。代碼10還可包括在調(diào)用點(諸如,forall, reduce, scan,或sort)處對矢量函數(shù)的一個或多個調(diào)用28 (例如,forall..., vector_func,...)。對應(yīng)于調(diào)用點的矢量函數(shù)被稱為內(nèi)核函數(shù)。內(nèi)核函數(shù)可調(diào)用代碼10 中的其他矢量函數(shù)(即,其他DP源代碼),并可被視為矢量函數(shù)調(diào)用圖中的根。內(nèi)核函數(shù)還可使用由代碼10所定義的類型(例如,類或結(jié)構(gòu)體)。這些類型可以被注釋為DP源代碼或可以不被注釋成DP源代碼。在其他實施例中,可使用其他合適的編程語言構(gòu)造來將代碼 10的各部分指定為DP源代碼和/或通用處理器代碼。此外,在使用DP語言來編寫代碼10 的實施例中,注釋26可以被省略。圖2是示出將靈活通信算子12應(yīng)用于輸入可索引類型14以生成靈活可索引類型 18的實施例的框圖。如此處所使用的,可索引類型是實現(xiàn)帶有為非負整數(shù)的秩以及被表示為element_type的類型的一個或多個下標算子(subscriptoperator)的任何數(shù)據(jù)類型。如果indeX〈N>是表示整數(shù)的N元組的類型(即,任何類型的整數(shù)數(shù)據(jù)類型),那么index〈N> 的實例就是N個整數(shù)的集合U0,il,. . .,im},其中m等于N-I (即,N元組)。秩N的索引算子采用indeX〈N>的N元組實例,并將該實例與被稱為元素類型的類型的另一實例相關(guān)聯(lián),其中元素類型定義了可索引類型中的每個元素。在一個實施例中,可索引類型定義以下算子中的一個或多個
element—type operator[] {index declarator)',
const element—type operator[] (index declarator) const; element—type& operator[] (index declarator)', const element—type& operator[] {index declarator) const; element—type&& operator□ {index declarator); or
const element—type&& operator[] {index declarator) const;其中index_declarator采用以下至少一種的形式const index<rank>&idx ;const index<rank>idx ;
index<rank>&idx ;index<rank>idx.在其他實施例中,算子可以是函數(shù)、函子或更通用的表示??伤饕愋偷男螤钍巧鲜鱿聵怂阕又槐欢x的indeX〈rank>的集合??伤饕愋鸵话憔哂卸嗝骟w的形狀-即, 可索引類型可被代數(shù)地表示為由坐標軸的線性函數(shù)所形成的有限數(shù)量個半空間的交點。參考圖I和2,在一個實施例中,代碼10的高級語言提供了靈活通信算子12以在數(shù)據(jù)并行計算環(huán)境中的輸入可索引類型14上使用。輸入可索引類型14具有秩(例如,圖I 的實施例中的秩N)和元素類型(例如,圖I的實施例中的元素類型T)并且定義了可由靈活通信算子12對其操作的計算空間。靈活通信算子12接收輸入可索引類型14和資源圖
16(例如,圖I的示例中的resource_map)。從輸入可索引類型14和資源圖16,靈活通信算子12生成帶有由資源圖16 (也在圖3B的示例中示出)指定的片段20 (也被稱為子網(wǎng)格) 的靈活可索引類型18如代碼10中所示,靈活通信算子12可用于將靈活可索引類型18傳遞到DP調(diào)用點(即,圖I的示例中的forall)。通過這樣做,靈活通信算子12致使被該調(diào)用點指定的矢量函數(shù)被在所有計算節(jié)點上復(fù)制(例如,圖4中示出的計算節(jié)點121),其中每個計算節(jié)點接收被指派給該計算節(jié)點的片段20。靈活通信算子12致使輸入可索引類型14被分解為片段20并且將每個片段20指派給如由資源圖16所指定的計算節(jié)點。資源圖16提供對跨至少一個計算節(jié)點將存儲器 (即,輸入可索引類型14)存儲在何處的指定。資源圖16指定各片段20以使得各片段20 的集合覆蓋靈活可索引類型18而不重疊。資源圖16允許片段20被指定有相同或不同的塊大小和/或正規(guī)或不正規(guī)的塊組合。圖3A-3C是示出了生成并使用靈活可索引類型18(1)的示例的框圖。在圖3A-3C 的示例中,靈活通信算子12將具有編號為O到35的元素的6x6矩陣(例如,輸入可索引類型14 (I))劃分為圖3B中示出的9個類型為靈活可索引類型18 (I)的片段20,如由相應(yīng)資源圖16所指定的(在圖2中示出)。在圖3B中每個片段20由不同陰影表示。例如,第一片段20(1)包括元素0、1、6、和7,第二片段20(2)包括元素2、3、8和9,等等。靈活通信算子12還致使片段20 (I) -20 (9)被指派給一組一個或多個計算節(jié)點121 (I)-121 (Q),其中Q 是大于或等于I的整數(shù),如由資源圖16中的協(xié)議所指定并由圖3C的箭頭30所指示的。資源圖18可以合并任何適當(dāng)?shù)闹概蓞f(xié)議,如塊分解、環(huán)分解、塊-塊分解、或塊-環(huán)分解。以下協(xié)議示例假定存在3個計算節(jié)點121(1)-121(3)(即Q = 3)或4個計算節(jié)點121⑴-121 (4)(即Q = 4)并且假定片段20從第一行(即,頂行)開始從左到右在橫跨的行中編號為20⑴-20 (9)。在行塊分解且Q = 3的情況下,輸入可索引類型14(1)的36個元素被除以3以使得向每個計算節(jié)點121指派12個元素。因此,資源圖18致使元素O到11 ( S卩,片段 20(1)-20(3))被指派給計算節(jié)點121 (I),元素12到23 ( S卩,片段20 (4)-20 (6))被指派給計算節(jié)點121 (2),而元素24-35(即,片段20(7)-20(9))被指派給計算節(jié)點121(3)。在行塊分解且Q = 4的情況下,輸入可索引類型14(1)的36個元素被除以4以使得向每個計算節(jié)點121指派9個元素。相應(yīng)地,資源圖18致使元素O到8被指派給計算節(jié)點121 (I),元素9到17被指派給計算節(jié)點121 (2),元素18到26被指派給計算節(jié)點121 (3), 而元素27到36被指派給計算節(jié)點121 (4)。
在列塊分解且Q = 3的情況下,資源圖18致使第一和第二列片段20( S卩,片段 20 (I)、20 (4)和20 (7))被指派給計算節(jié)點121 (I),第三和第四列片段20 (即,片段20 (2)、 20(5)和20(8))被指派給計算節(jié)點121 (2),第五和第六列片段20 (即,片段20 (3)、20 (6) 和20(9))被指派給計算節(jié)點121 (3)。在行環(huán)分解且Q = 3的情況下,資源圖18致使元素(3*k)(對于k = O到11)被指派給計算節(jié)點121(1),元素(3*k+l)被指派給計算節(jié)點121 (2),元素(3*k+2)被指派給計算節(jié)點121(3)。在行環(huán)分解且Q = 4的情況下,資源圖18致使元素(4*k)(對于k = O到8)被指派給計算節(jié)點121(1),元素(4*k+l)被指派給計算節(jié)點121 (2),元素(4*k+2)被指派給計算節(jié)點121 (3),且元素(4*k+3)被指派給計算節(jié)點121(4)。在行塊-環(huán)分解且Q = 3的情況下,分解是對圖3B中示出的片段20 (I)-20 (9)的環(huán)分解。相應(yīng)地,資源圖18致使片段20 (I)、20 (4)和20 (7)被指派給計算節(jié)點121(1),片段20 (2)、20 (5)和20 (8)被指派給計算節(jié)點121 (2),并且片段20 (3)、20 (6)和20 (9)被指派給計算節(jié)點121 (3)。在行塊-環(huán)分解且Q = 4的情況下,資源圖18致使片段20⑴、20 (5)和20 (9) 被指派給計算節(jié)點121 (I),片段20 (2)和20 (6)被指派給計算節(jié)點121 (2),片段20 (3)和 20 (7)被指派給計算節(jié)點121 (3),并且片段20 (4)和20 (8)被指派給計算節(jié)點121 (4)。在行塊-塊分解并且Q = 3的情況下,資源圖18致使片段20 (I) -20 (3)被指派給計算節(jié)點121 (I),片段20 (4) -20 (6)被指派給計算節(jié)點121 (2),片段20 (7) -20 (9)被指派給計算節(jié)點121⑶。資源圖16的行或列分解決策可以取決于存儲器布局。例如,以列為主的存儲器布局可能意味著使用適當(dāng)?shù)膮f(xié)議進行列分解。在一個實施例中,資源圖16包括資源片段的集合,其中每個資源片段將片段20與資源視圖(即,計算節(jié)點的抽象)(未示出)相關(guān)聯(lián)。例如,對于由如下語句所定義的可索引類型14:gri d<rank>parent_gri d ;其中g(shù)rid〈rank>包含兩個數(shù)據(jù)成員extent〈rank>—M—extent ;index〈rank>—M—offset ;例如,圖3Β中的第二片段20(2),該形狀或網(wǎng)格具有—Μ—extent = {2,2}和—Μ— offset = {0,1},且第六片段 20 (6)具有—M—extent = {2,2}和—M—offset = {1,2}。相應(yīng)地,可以使用如下語句來分解parent—grid grid〈rank>algorithmic—blocks [Ml];grid<rank>memory_blocks [M2];grid〈rank>compute—nodes[M3];其中Ml,M2,M3 > 0 且 Ml > = M2 > = M3。通常,M3 分割 M2 且 M2 分割 Ml。 algorithmic—blocks (算法塊)、memory—blocks (存儲器—塊)和 compute—nodes (計算— 節(jié)點)所有這三個覆蓋parent—grid(父—網(wǎng)格)而沒有重疊。algorithmic—blocks表示在所實現(xiàn)的算法中使用的分解。memory—blocks表示在必要時在各節(jié)點間移動的存儲器的粒度。Compute_nodes表示被指派給計算節(jié)點以存儲相應(yīng)數(shù)據(jù)的粒度。假定存在關(guān)聯(lián)使得每個algorithmic_block或memory_block可查找它被存儲在compute_node上的何處,并且使得每個algorithmic_block可查找它被存儲在memory_ block上的何處??缮删哂衦esource_segments (資源_片段)的被稱為resource_map (資源_圖)的類,所述resource_segments形成子網(wǎng)格和resource_view (資源_視圖)之間
的關(guān)聯(lián)。
template <int rank〉 struct resource segment { int —M—id;
grid<rank> —M—child; // 表不某個 k 的 compute—nodes[k] resource—view —M—resource—view;
};通過使用靈活通信算子12,可無縫地訪問靈活可索引類型18的數(shù)據(jù)而無需用戶知曉該數(shù)據(jù)當(dāng)前所駐留的計算節(jié)點。對于示例可索引類型14,具有形狀parent_grid的A, A的存儲是由resource_segment的實例確定的。為了訪問A在如下語句所述處的元素index〈rank>—Index ;首先找到包含—Index的child-grid(子-網(wǎng)格),然后確定偏移(offset)index〈rank>—Offset ;以使得_Index = child-grid-offset+—Offset。在resource—segment注釋的情況下,該關(guān)系為_Index = —Resource—segment. —M—child. —M—offset+—Offset。為了提高查找的速度,執(zhí)行以下檢查以確定—Index(當(dāng)—Index改變時)是否仍屬于 _Resource_segment. —M—child
index<rank> _Local_offset = —Index - _Resource_segment._M_child._M_offset; extent<rank> —Local—bounds = _Resource_segment._M_child._M_extent;
if ( Local offset < Local bounds ) {
//訪問數(shù)據(jù)寫入機器_M_resource_view ... local_array[ Local offset ]...
}給定—Index所屬的子網(wǎng)格或—Resource—segment的確定取決于分解模式。在最壞情況下,可以使用但是可以不避免每個維度中的二分搜索。然而,在所有小塊具有相等范圍的 2048x2048 小塊分解(tile decomposition)的情況下,例如,尋找—M—child.—M—offset等于下式的 _Resource_segment index〈2>_Tile(2048,2048);(_Index+_Tile-l)/_Tile.可使用 _Resource_segment ( S卩,當(dāng)前的 resource_segment),直到if (_Local_offset < _Local_bounds) . . }被違反,在這種情況下再次用_Tile分割新的_Index并重復(fù)。此機制對于具有只需要不頻繁地尋找新包含的resource_segments的局部的算法是最優(yōu)的。在下面描述的局部全局視圖表示中,用戶索引算子可省略該是否檢查(if-check) (在此處稱為邊界檢查)if (_Local_offset < _Local_bounds) . . },因為用戶被信任為在每次訪問時處于邊界內(nèi)。如果給定resource_segment被耗盡且將使用另外一個,則該用戶被信任以調(diào)用重新設(shè)定當(dāng)前resource_segment的函數(shù)。在局部全局視圖的最簡單形式中,所有三個分解grid<rank>algorithmic_blocks [Ml];grid<rank>memory_bl°cks [M2];grid<rank>compute_nodes[M3];是正規(guī)的,具有相同大小的塊或小塊(tile)。將可索引類型分區(qū)成小塊的小塊通信算子可被應(yīng)用于第一分解以產(chǎn)生algorithmic_tiles個體小塊是algorithmic_tiles (_tile_index)。當(dāng)擁有者復(fù)制在如下語句上啟動時algorithmic_tiles (_tile_index)確定所包含的memory_blocks[kl]和compute_nodes[k2]。接下來確定擁有者 compute_nodes [k3],然后將 memory_blocks [kl]從 compute_nodes [k2]移至Ij compute_ nodes[k3]。自動化存儲器移動粒度通常比片段20的子網(wǎng)格分解在更細的粒度上。例如,假定圖3A的矩陣表示一個6144x6144元素矩陣,即,每個被編號的算法塊表示1024x1024數(shù)據(jù)元素。假定該6144x6144矩陣被分解成2048x2048compute_nodes塊,諸如在圖3B中。 此外,假定Q = 4且計算節(jié)點121 (1),121 (2),121 (3)和121 (4)被根據(jù)塊-環(huán)分解指派給 2048x2048塊(即,片段20 (I)-20 (9))。然后片段20 (I)、20 (5)和20 (9)被指派給計算節(jié)點121 (I),片段20 (2)和20 (6)被指派給計算節(jié)點121 (2),片段20 (3)和20 (7)被指派給計算節(jié)點121 (3),并且片段20 (4)和20 (8)被指派給計算節(jié)點121 (4)。在此示例中存儲器可在1024x1024塊中移動。相應(yīng)地,如果計算尋求將單個數(shù)據(jù)元素從1024x1024塊移動單個數(shù)據(jù)元素,則整個1024x1024塊被移動。靈活通信算子12允許用靈活可索引類型18的片段20的完整全局視圖表示或局部全局視圖表示來編碼數(shù)據(jù)并行(DP)算法以管理片段20在各計算節(jié)點間的移動。完整全局視圖表示允許DP算法就像它們將要在單個計算節(jié)點上運行而自動化擁有者復(fù)制存儲器移動在后臺進行一樣被編碼。作為矩陣加法的一個示例,假定A、B和C每個是如圖3A所示的6144x6144矩陣,其中每個所編號的塊表示1024x1024數(shù)據(jù)元素。A和 B攜帶有效數(shù)據(jù),但是C被分配但不必然攜帶任何數(shù)據(jù)。進一步假定A、B和C每個被指派在計算節(jié)點121 (1)-121 (Q)上,其中在此情況下Q等于4且其中A、B和C中的每一個的片段20⑴-20 (9)分別被存儲在計算節(jié)點121⑴-121 (Q)上。使用以下的計算C = A+B :其中 C(i, j) = A(i, j)+B(i, j) 0 <= i, j <6每個(i,j)表示 1024x1024 元素。擁有者復(fù)制意味著如果必須的話則數(shù)據(jù)被移動到計算節(jié)點121,在計算節(jié)點121 處計算答案,即C。在此示例中,A和B的塊被移動到計算節(jié)點121,在計算節(jié)點121處C的相應(yīng)塊作為計算規(guī)定而被存儲。然而,對于簡單的矩陣加法,不需要任何移動,因為A和B 的塊和C的相應(yīng)塊被存儲在相同計算節(jié)點121上。如下計算C(l,2) = A(l,2)+B(l,2)為A、B和C中的每一個使用圖3B中的塊8。塊8是對于A、B和C中的每一個存儲在計算節(jié)點121(2)上的片段20(2)的一部分,所以不發(fā)生數(shù)據(jù)移動。類似地,對相應(yīng)片段20和計算節(jié)點121進行如下計算
2048x1024,而compute_nodes具有范圍2048x2048。因此,矩陣加法是非常典型的示例。在使用上述假定的另一示例中,B的轉(zhuǎn)置被加到A以產(chǎn)生C,如下C = Α+Βτ :其中 C(i,j) = A(i,j)+B(j, i)T :0 <= i,j < 6其中每個(i,j)表示1024x1024元素而B(j,i)T是底層1024x1024塊的轉(zhuǎn)置。在此情況下,B(j,i)被移動到計算節(jié)點121上,其中對于除片段20⑴、20(5)和 20(9)中的那些塊之外的所有塊存儲C(i,j)(和A(i,j))。例如,片段20(1)的塊不需要被移動,因為C的片段20 (I)的塊的計算是C(0,0) = A (O, O)+B (O, O)τC(0,1) = A(0,1)+B(1,0):C(1,0) = A(1,0)+B(0,I):C(l, I) = A(l, 1)+B(1,1)T然而,對于C的片段segment 20⑷的塊
上:c(o,o)==A(00)+B (0,0)上:C(1,0)==A(10)+B(l,0)上:C(2,0)==A(20)+B(2,0)上:C(3,0)==A(30)+B(3,0)上:C(4,0)==A(40)+B (4,0)上:C(5,0)==A(50)+B(5,0)
這里片段是指分解的一個元素 grid〈2>compute_nodes[9]。
事實上
grid〈2>algorithmic_blocks[36]; grid〈2>memory_blocks[18]; grid〈2>compute_nodes[9];
其中 algorithmic_blocks 具有范圍 1024x1024, memory_blocks 具有范圍
/8(1,(^在8的片段20(1)中 /B (0,1)τ在B的片段20 (I)中
C (2,0) = A (2,0)+B (O, 2)τC(2,1) = A(2,1)+B(1,2)TC (3,0) = A (3,0)+B (0, 3)τC(3,I) = A(3,1)+B(1,3)TB塊來自存儲在計算節(jié)點121(2)上的片段20⑵的塊,而C塊來自存儲在計算節(jié)點121(4)上的片段20 (4)的塊。相應(yīng)地,B的塊2(即,Β(0,2)τ)的1024x1024元素被移動到計算節(jié)點121(4)、加到六(2,0)、并指派給((2,0),B的塊8(即,Β(1,2)τ)的1024x1024 元素被移動到計算節(jié)點121⑷、加到A (2,I)、并指派給C (2,I),B的塊3 (即,Β(0,3)τ)的 1024x1024元素被移動到計算節(jié)點121(4)、加到六(3,0)、并指派給((3,0),B的塊9(即, Β(1,3)τ)的1024x1024元素被移動到計算節(jié)點121⑷、加到A (3,I)、并指派給C (3,I)。使用完整全局視圖表示,存儲器移動自動進行,因為每個塊都攜帶哪個計算節(jié)點 121存儲該塊的信息。這些計算可從計算節(jié)點121中的任何一個或一主機(如在圖4中示出并在下面更詳細地描述的主機101)指導(dǎo)。在上面的示例的其他變型中,多個片段20可被指派給同一計算節(jié)點121,其中計算節(jié)點121的數(shù)量少于片段20的數(shù)量。此外,計算節(jié)點121的處理能力可被加權(quán)以使得可以相比較慢的計算節(jié)點121,向較快的計算節(jié)點121指派更多的片段20。所述指派可根據(jù)上述協(xié)議中的一個或多個來執(zhí)行。在上面的變型中還可實現(xiàn)使用工作竊取(work-stealing)的自動負載平衡。當(dāng)計算節(jié)點121完成其計算時,計算節(jié)點121嘗試竊取指派給其他節(jié)點121的計算。指導(dǎo)計算的計算節(jié)點121,或者有可能是主機,可存儲工作項目(work-item)的工作竊取隊列,其中這些隊列包含表示擁有者矩陣(例如,C)上的存儲器移動粒度(例如,1024x1024)的計算的任務(wù)。在來自上面的矩陣的A、B和C加上B的轉(zhuǎn)置的示例中,使用四個權(quán)重相等的計算節(jié)點121(1)-121(4)和塊-環(huán)分解協(xié)議,下面的四個工作竊取隊列可被存儲如下。因此在上述圖像、且C = Α+Βτ、且存儲器移動粒度=1024x1024、且4個機器被相等加權(quán)(w0 = wl = w2 = w3 = I)、且塊-環(huán)分解的情況下由12個任務(wù)組成的queueO (隊列O)——片段20(1)、20(5)和20 (9)中的每一個的 4 個 1024x1024 塊;由8個任務(wù)組成的queue I (隊列1)_ 1024x1024 塊;由8個任務(wù)組成的queue2 (隊列2)-1024x1024 塊;由8個任務(wù)組成的queue3(隊列3)-1024x1024 塊。例如,queue2包括如下任務(wù)C (0,4) = A (0,4)+B (4,0)τC (O, 5) = A (O, 5)+B (5,0)τC(l,4) = A(l,4)+B(4,1)τC(l,5) = Α(1,5)+Β(5,1)τ
-片段20⑵和20 (6)中的每一個的4個 -片段20 (3)和20 (7)中的每一個的4個 -片段20⑷和20⑶中的每一個的4個
C (4,0) = A (4,0)+B (0,4)τC(4,1) = A(4,1)+B(1,4)TC (5,0) = A (5,0)+B (0, 5)τC(5,I) = A(5,1)+B(1,5)T每個計算節(jié)點121從其相應(yīng)工作竊取隊列的頂部獲取一個任務(wù),直到完成來自該工作竊取隊列的所有任務(wù)。當(dāng)計算節(jié)點121的工作竊取隊列為空時,計算節(jié)點121從與另一計算節(jié)點121相對應(yīng)的工作竊取隊列的底部竊取任務(wù)。通常在粒度級algorithmic_blocks 通過該小塊通信算子來啟用局部全局視圖。假定正規(guī)小塊分解,該小塊通信算子被應(yīng)用于第一個以產(chǎn)生algorithmic_tiles個體小塊是algorithmic_tiles (_tile_index).當(dāng)擁有者復(fù)制在下式上啟動時algorithmic_tiles (_tile_index)確定所包含的memory_blocks[kl]和compute_nodes[k2]。接下來確定擁有者 compute_nodes [k3],然后將 memory_blocks [kl]從 compute_nodes [k2]移至Ij compute_ nodes [k3]。這都是在algorithmic_tiles (_tile_index)訪問級別上進行的。當(dāng)實現(xiàn)該算法時,一元素(或,遞歸地,更細的塊)被訪問為algorithmic_tiles(tile_index)(local_index)與完整全局視圖表示不同,局部全局視圖表示允許存儲器移動由用戶明確指定。 在上述完整全局視圖表示示例中,存儲器移動粒度是1024x1024塊,以使得如果計算節(jié)點 121訪問該塊中的單個元素則整個1024x1024塊被移動到該計算節(jié)點121。在一些計算中,計算的粒度比存儲器移動粒度更細,并且局部全局視圖表示與用戶明確指導(dǎo)每個存儲器塊要被移動到何處相比提供了優(yōu)點。例如,假定在完整全局視圖表示示例中存儲器移動粒度是2048x1024,即,只要從兩個塊中的任何一個移動元素,則這兩個塊都被移動。所以對于C = A+BT, C的片段20 (4)的塊的計算是C (2,0) = A (2,0)+B (O, 2)τC(2,1) = A(2,1)+B(1,2)TC (3,0) = A (3,0)+B (0, 3)τC(3,I) = A(3,1)+B(1,3)T在每種情況下,B塊被存儲在計算節(jié)點121(2)上,而C塊和A塊(C是擁有者)被存儲在計算節(jié)點121(4)上。因此,通過明確指導(dǎo)B的塊2(8卩,Β(0,2)τ)的任何元素移動到計算節(jié)點121 (4)來執(zhí)行上述語句中的前兩個。由于2048x1024存儲器粒度,B的塊2和塊 8(即,Β(0,2)τ和Β(1,2)τ)兩者都被移動到計算節(jié)點121 (4)以允許前兩個語句的加法由計算節(jié)點121(4)執(zhí)行。同樣,通過明確指導(dǎo)B的塊3(S卩,Β(0,3)τ)的任何元素移動到計算節(jié)點121 (4)來執(zhí)行上述語句中的后兩個。由于2048x1024存儲器粒度,B的塊3和塊9 (即, Β(0,3)τ和Β(1,3)τ)兩者都被移動到計算節(jié)點121(4)以允許后兩個語句的加法由計算節(jié)點121(4)執(zhí)行。如這些示例所示,計算的粒度可以比存儲器移動粒度(其可比計算節(jié)點粒度更細)更細,以使得可存在使用一種或多種算法在給定存儲器移動塊上執(zhí)行的許多任務(wù)。移動塊的元素的單個指示允許對該塊進行操作的任務(wù)被更高效地執(zhí)行。用戶和實現(xiàn)兩者都可省略為了查看存儲器是否需要被移動而進行的檢查,直到指導(dǎo)算法開始在另一存儲器移動塊上工作,并且,如上面所見,與algorithmic_blocks分解相對應(yīng)的小塊通信算子實際上在必要時指導(dǎo)存儲器移動。如果1024x1024小塊(例如,塊3)要被移動,則包含的 2048x1024存儲器移動塊(例如,存儲器移動塊3)被從包含的2048x2048計算節(jié)點塊(例如,片段20(2))移動到擁有者復(fù)制確定的2048x2048塊(例如,片段20 (4))。如果現(xiàn)在塊 9被移動,則訪問相應(yīng)的小塊將查找它的包含的存儲器移動塊并且確定它已被移動到片段 20(4),所以不需要任何移動。上面闡述的邊界檢查可被省略,因為在小塊中的實際數(shù)據(jù)元素訪問之前已經(jīng)在小塊級別上進行了正確的存儲器移動。也就是說algorithmic_tiles (_tile_index).生成任何必需的存儲器移動,則algorithmic_tiles(_tile_index)(_local_index)可被訪問而無需對每個localjndex進行邊界檢查。例如,在上述計算中,每個存儲器移動塊有兩個算法任務(wù)。在實踐中,對擁有者存儲器上的給定存儲器塊(例如,C)執(zhí)行的所有計算可被分組成一個大任務(wù)并且該任務(wù)中的第一個語句可以是單個存儲器移動指示。在一個實施例中,該指示的形式可以是如下的對任務(wù)的標準C++注釋[ [move_memory (C,B)]]void kernel(field<2, double>&C, const field<2, double>&A, const field<2, double>&B);通過使用此注釋,編譯器可優(yōu)化并交錯存儲器移動和計算。以下代碼提供了一個實施例中的靈活通信算子12的實現(xiàn)的概覽。
Il
Il resource—view是物理計算引擎的句柄。
//唯一的硬要求是在其中實現(xiàn)數(shù)據(jù)的存儲器分層結(jié)構(gòu)。
//resource—view的基礎(chǔ)屬性是—Buffer<T>,其實質(zhì)上是
//類型T的具體的I維陣列。struct resource—view;
Il
//給定具有將其表不為—Rank維陣列(即,字段,參見卜文)的結(jié)構(gòu)的 //存儲器的分配,
// 構(gòu)造它的分區(qū)(partioning)或分段(segmentation)。
//存儲器的分配具有作為具有偏移的矩形集合中的整數(shù)點的索引,如由網(wǎng)格 //所述的(參見下文)。
//
template <int —Rank〉 struct index {
//過載的下標和ctor int m base[ Rank];
};
template <int —Rank〉 struct extent {
//過載的函數(shù)調(diào)用、下標和ctor unsigned int M base[ Rank];
};
template <int _Raiik> struct grid {
static—assert(—Rank > 0,"rank must be > On); unsigned int total—extent() const {
unsigned int total—extent = —M—extent
; for (int i = I; i < —Rank; ++i) total extent *= M extent[i]; return total extent;
}
Il各種過載
extent<_Rank> —M—extent; index<—Rank〉—M—offset.//這里是DPC++的基礎(chǔ)數(shù)據(jù)類型。
Il各種可索引類型從字段或其他可索引類型繼承。
Il每種可索引類型僅給出其父(即,基本類)的不同視圖且 //該數(shù)據(jù)物理上不改變。
//過載的下標算了表示不同視圖。
//例如,轉(zhuǎn)置吋索引類型將具有—Rank=2中的下標算了
Il
Il template <typename —Parent—type>
Il struct transpose—range : public —Parent—type {
Il element—type& operator[] (const index<2>& Index) {
Il —Parent—type& base = *static_cast<_Parent_type*>(this);
// return (* this) [index<2>(_Index[ I ], Index
);
// }
//};
Il
template <int Rank, typename —Element—type> struct field {
//基本可索引類型特征
const static int rank = Rank; typedef —Element—type element—type;
//
// 構(gòu)造—M—multiplier 以使得它映射—Rank-dimensional => I-dimensional。
//
field(const extent< Rank>& Extent,const resource view& Resource view)
:M grid( Extent),
VI store( Buffer< Element type>( Grid.total extent())) {
Il創(chuàng)建以行為主的乘數(shù)向量 _M_multiplier
= I; if ( Rank > I)_M_multiplier[ I] = _M_grid
; if ( Rank > 2)
for (int i = 2; i < Rank; ++i)
—M—multiplier [i] = _M_grid[i- l]*_M_multiplier[i-1];
}
II
//從另·了字段構(gòu)造了字段 //
template <typename _Other>
field(const grid<_Rank>& Grid, const _Other& —Parent)
:Mgrid(Grid),_M_store(_Parent.get_store()),
_M_multiplier(_Parent.get_multiplier()) {
}
//
//檢查—Index在—M—grid內(nèi),目前省略。
//
element—type& operator] (const index<_Rank>& Index) { return _Buffer[ flatten( Index)];
}
private:
grid<—Rank〉—M—grid; extent<_Raiik> —M—multiplier;
—Buffer<—Element—type〉ms tore;
//
// 映射—Rank-dimensional => I-dimensional
Il
unsigned int flatten(const index< Rank>& Index) { unsigned int Flat index = lndex
; if ( Rank > I)
Flat index += Index[I]* M multiplier[I]; if ( Rank > 2)for (int i = 2; i < Rank; ++i)
—Flat—index += —Index[i]*—M—multiplier [i]; return Flat index:
Il
Il給定一網(wǎng)格,定義grid—segment以表示該分段中的單個片段。
Il
//
//—M_parent是被分段的網(wǎng)格(g卩,分區(qū)的)。
// M child描述f必須在父內(nèi)的所擁有的網(wǎng)格片段的范圍和偏移。 // M id是此grid—segment的標識符。
Il
template <int _Rank> struct grid—segment { int M id;
grid<—Rank〉—M—child; grid<—Rank〉_M_parent;
};
Il
// resource segment 將 grid—segment 與 resource—view 相關(guān)耳關(guān)。
//
template <int _Rank> struct resource segment {
grid—segment<—Rank〉—M—segment; resource view M resource view;
//resource—map是覆蓋父網(wǎng)格的資源片段的集合。 //resource—map不被編組到設(shè)備。
//它是完全駐留在單個計算節(jié)點或主機上的結(jié)構(gòu)。//resource—map可以是為塊、環(huán)和塊-環(huán)分解專用的,以及稀疏的、
Il跨步的(strided)、關(guān)聯(lián)的以及非結(jié)構(gòu)化的。
Il
template <int —Rank〉 struct resource—map {
//
Il通過指定拆分點和父網(wǎng)格來創(chuàng)建resource—map。
//為!= - I的—Split_points 111的每個拆分點的第i個槽確定 //第!個軸上的分區(qū)點。讓這樣的點的數(shù)量是NG)。
Il則存在Ν(0)*Ν⑴Rank - I)個資源片段。
Il
Il 例如,rank=2,
// parent—grid. —M—extent={36,36},
// _Split_points
= {16},
//—Split_points[l] = {16},則存在范圍為{16,16}的 4 = (1+1)*(1+1)個片段。
Il
Il 這指定了 compute—nodes 分解。
Il還存在允許對memory—blocks和算法塊的指定的方法/ctor。
Il
Il resource map為每個數(shù)據(jù)元素和每個算法小塊兩者提供機制 Il以確定包含的存儲器移動塊和包含的resource—segment。
Il這對靈活字段確定何時移動存儲器以及何時僅Θ由地訪問(局部全局視圖) Il而言足夠了。
Il或者對于全局視圖,只要違反了上面闡述的if-check (g卩,邊界檢查),每個數(shù)據(jù)元素找到包含的resource—segment的足夠信息。
Il現(xiàn)在創(chuàng)建靈活可索引類型 SS
template〈typename —Parent—type〉
1struct agile—range : public —Parent—type { const static int rank = —Parent—type: :rank; typedef typename —Parent—type:: element—type element—type;
agile_range(const —Parent—type& Parent, const resource_map<rank>& Resource—map)
:Parent type( Parent), M resource map( Resource map) {
private:
resource—map<rank> —M—resource—map;
Il靈活通信算子12是改變資源視圖(通常是對于多個資源視圖)的標準方式。
template <typename —Parent—type>
agile—range<—Parent—type〉 agile(const —Parent—type& Parent, const resource—map<rank>& —Resource—map) {
return agile_range<_Parent_type>(_Parent, Resource map);
}圖4是示出被配置成編譯并執(zhí)行包括靈活通信算子12的數(shù)據(jù)并行代碼10的計算機系統(tǒng)100的實施例的框圖。計算機系統(tǒng)100包括主機101,主機101具有容納在一個或多個處理器封裝(未示出)中的一個或多個處理元件(PE) 102、以及存儲器系統(tǒng)104。計算機系統(tǒng)100還包括零個或更多個輸入/輸出設(shè)備106、零個或更多個顯示設(shè)備108、零個或更多個外圍設(shè)備110和零個或更多個網(wǎng)絡(luò)設(shè)備112。計算機系統(tǒng)100還包括具有一個或多個DP最優(yōu)計算節(jié)點121 的計算引擎120,其中每一 DP最優(yōu)計算節(jié)點121包括一組一個或多個處理元件(PE) 122和存儲DP可執(zhí)行代碼138的存儲器124。主機101、輸入/輸出設(shè)備106、顯不設(shè)備108、外圍設(shè)備110、網(wǎng)絡(luò)設(shè)備112和計算
引擎120使用包括任何合適的類型、數(shù)量和配置的控制器、總線、接口、和/或其他有線或無線連接的一組互連114來進行通信。計算機系統(tǒng)100表示出于通用或?qū)S媚康亩渲玫娜魏魏线m的處理設(shè)備。計算機系統(tǒng)100的示例包括服務(wù)器、個人計算機、膝上型計算機、圖形輸入板計算機、智能電話、個人數(shù)字助理(PDA)、移動電話、和音頻/視頻設(shè)備。計算機系統(tǒng)100的組件(即,主機101、 輸入/輸出設(shè)備106、顯不設(shè)備108、外圍設(shè)備110、網(wǎng)絡(luò)設(shè)備112、互連114和計算引擎120)可包含在公共外殼(未不出)中或任何合適數(shù)量的分立外殼(未不出)中。處理元件102各自形成被配置成執(zhí)行存儲在存儲器系統(tǒng)104中的指令(即軟件) 的執(zhí)行硬件。每一處理器封裝中的處理元件102可具有相同或不同的體系結(jié)構(gòu)和/或指令集。例如,處理元件102可以包括順序執(zhí)行元件、超標量執(zhí)行元件、以及數(shù)據(jù)并行執(zhí)行元件 (例如GPU執(zhí)行元件)的任何組合。每一處理元件102被配置為訪問并執(zhí)行存儲在存儲器系統(tǒng)104中的指令。這些指令可包括基本輸入輸入系統(tǒng)(BIOS)或固件(未示出)、操作系統(tǒng)(OS) 132、代碼10、編譯器134、GP可執(zhí)行代碼136以及DP可執(zhí)行代碼138。每一處理元件102可以結(jié)合或響應(yīng)于從輸入/輸出設(shè)備106、顯示設(shè)備108、外圍設(shè)備110、網(wǎng)絡(luò)設(shè)備112 和/或計算引擎120接收到的信息來執(zhí)行指令。主機101引導(dǎo)并執(zhí)行OS 132。OS 132包括可以由處理元件執(zhí)行以管理計算機系統(tǒng)100的組件并提供允許程序訪問并使用這些組件的一組功能的指令。在一實施例中,OS 132是Windows操作系統(tǒng)。在其他實施例中,OS 132是適于和計算機系統(tǒng)100 —起使用的
另一操作系統(tǒng)。當(dāng)計算機系統(tǒng)執(zhí)行編譯器134來編譯代碼10時,編譯器134生成一個或多個可執(zhí)行代碼一例如,一個或多個GP可執(zhí)行代碼136和一個或多個DP可執(zhí)行代碼138。在其他實施例中,編譯器134可生成一個或多個GP可執(zhí)行代碼136以使每個GP可執(zhí)行代碼136 包括一個或多個DP可執(zhí)行代碼138,或可生成一個或多個DP可執(zhí)行代碼138而不生成任何GP可執(zhí)行代碼136。GP可執(zhí)行代碼136和/或DP可執(zhí)行代碼138是響應(yīng)于為了編譯代碼10的全部或所選部分對具有數(shù)據(jù)并行擴展的編譯器134的調(diào)用來生成的。該調(diào)用可以由例如程序員或計算機系統(tǒng)100的其他用戶或者計算機系統(tǒng)100中的其他代碼或另一個計算機系統(tǒng)(未示出)中的其他代碼來生成。GP可執(zhí)行代碼136表示旨在供在一個或多個通用處理元件102 (例如中央處理單元(CPU))上執(zhí)行的程序。GP可執(zhí)行代碼136包括來自一個或多個通用處理元件102的指令集的低級指令。DP可執(zhí)行代碼138表示旨在并被優(yōu)化成在一個或多個數(shù)據(jù)并行(DP)最優(yōu)計算節(jié)點121上執(zhí)行的數(shù)據(jù)并行程序或算法(例如著色器)。在一個實施例中,DP可執(zhí)行代碼138 包括DP字節(jié)代碼或者在DP最優(yōu)計算節(jié)點121上被執(zhí)行之前使用設(shè)備驅(qū)動程序(未示出) 被轉(zhuǎn)換成來自DP最優(yōu)計算節(jié)點121的指令集的低級指令的某種其他中間表示(IL)。在其他實施例中,DP可執(zhí)行代碼138包括來自一個或多個DP最優(yōu)計算節(jié)點121的指令集的低級指令,其中該低級指令是由編譯器134插入的。因此,GP可執(zhí)行代碼136可以由一個或多個通用處理器(諸如,CPU)直接執(zhí)行,并且DP可執(zhí)行代碼138或可以由一個或多個DP最優(yōu)計算節(jié)點121直接執(zhí)行或可以在被轉(zhuǎn)換成DP最優(yōu)計算節(jié)點121的低級指令以后由一個或多個DP最優(yōu)計算節(jié)點121來執(zhí)行。計算機系統(tǒng)100可使用一個或多個處理元件102來執(zhí)行GP可執(zhí)行代碼136,并且計算機系統(tǒng)100可使用下文中更詳細描述的一個或多個PE 122來執(zhí)行DP可執(zhí)行代碼138。存儲器系統(tǒng)104包括被配置成存儲指令和數(shù)據(jù)的任何合適的類型、數(shù)量和配置的易失性或非易失性存儲設(shè)備。存儲器系統(tǒng)104的儲存設(shè)備表示儲存包括OS 132、代碼10、 編譯器134、GP可執(zhí)行代碼136以及DP可執(zhí)行代碼138的計算機可執(zhí)行指令(即軟件)的計算機可讀儲存介質(zhì)。指令可由計算機系統(tǒng)100執(zhí)行以履行此處所述的OS 132、代碼10、編譯器134、GP可執(zhí)行代碼136以及DP可執(zhí)行代碼138的函數(shù)和方法。存儲器系統(tǒng)104存儲從處理元件102、輸入/輸出設(shè)備106、顯示設(shè)備108、外圍設(shè)備110、網(wǎng)絡(luò)設(shè)備112和計算引擎120接收的指令和數(shù)據(jù)。存儲器系統(tǒng)104將所存儲的指令和數(shù)據(jù)提供給處理元件102、 輸入/輸出設(shè)備106、顯不設(shè)備108、外圍設(shè)備110、網(wǎng)絡(luò)設(shè)備112和計算引擎120。存儲器系統(tǒng)104中的存儲設(shè)備的示例包括硬盤驅(qū)動器、隨機存取存儲器(RAM)、只讀存儲器(ROM)、 閃存驅(qū)動器和卡、以及諸如⑶和DVD之類的磁盤和光盤。輸入/輸出設(shè)備106包括被配置成將指令或數(shù)據(jù)從用戶輸入到計算機系統(tǒng)100并將指令或數(shù)據(jù)從計算機系統(tǒng)100輸出到用戶的任何合適的類型、數(shù)量和配置的輸入/輸出設(shè)備。輸入/輸出設(shè)備106的示例包括鍵盤、鼠標、觸摸墊、觸摸屏、按鈕、撥盤、旋鈕和開關(guān)。顯示設(shè)備108包括被配置成向計算機系統(tǒng)100的用戶輸出文本和/或圖形信息的任何合適的類型、數(shù)量和配置的顯示設(shè)備。顯示設(shè)備108的示例包括監(jiān)視器、顯示屏和投影儀。外圍設(shè)備110包括被配置成用計算機系統(tǒng)100中的一個或多個其他組件來操作以執(zhí)行通用或?qū)S锰幚砉δ艿娜魏魏线m的類型、數(shù)量和配置的外圍設(shè)備。網(wǎng)絡(luò)設(shè)備112包括被配置成允許計算機系統(tǒng)100跨一個或多個網(wǎng)絡(luò)(未示出)進行通信的任何合適的類型、數(shù)量和配置的網(wǎng)絡(luò)設(shè)備。網(wǎng)絡(luò)設(shè)備112可根據(jù)任何合適的網(wǎng)絡(luò)協(xié)議和/或配置來操作以允許計算機系統(tǒng)100將信息發(fā)送給網(wǎng)絡(luò)或者從網(wǎng)絡(luò)接收信息。計算引擎120被配置成執(zhí)行DP可執(zhí)行代碼138。計算引擎120包括一個或多個計算節(jié)點121。每一計算節(jié)點121是共享一存儲器分層結(jié)構(gòu)的計算資源的集合。每一計算節(jié)點121包括一組一個或多個PE 122以及存儲DP可執(zhí)行代碼138的存儲器124。PE 122執(zhí)行DP可執(zhí)行代碼138并將由DP可執(zhí)行代碼138生成的結(jié)果儲存在存儲器124中。具體而言,PE 122執(zhí)行DP可執(zhí)行代碼138以將靈活通信算子12應(yīng)用于輸入可索引類型14以生成如圖4所示且如上文中詳細描述的輸出可索引類型18。具有一個或多個計算資源且該資源具有為數(shù)據(jù)并行計算(即,執(zhí)行DP程序或算法)而優(yōu)化的硬件體系結(jié)構(gòu)的計算節(jié)點121被稱為DP最優(yōu)計算節(jié)點121。DP最優(yōu)計算節(jié)點121的示例包括其中該組PE 122包括一個或多個GPU的節(jié)點121,以及其中該組PE 122 包括通用處理器封裝中的該組SMD單元的節(jié)點121。不具有帶有為數(shù)據(jù)并行計算而優(yōu)化的硬件體系結(jié)構(gòu)的任何計算資源的計算節(jié)點121 (例如,僅僅具有通用處理元件102的處理器封裝)被稱為非DP最優(yōu)計算節(jié)點121。在每一計算節(jié)點121中,存儲器124可與存儲器系統(tǒng)104 (諸如,GPU所使用的GPU存儲器)分開,或可以是存儲器系統(tǒng)104的一部分(例如, 通用處理器封裝中的SMD單元所使用的存儲器)。主機101形成被配置成將DP可執(zhí)行代碼138提供給計算節(jié)點121以供執(zhí)行并且使用互連114接收由DP可執(zhí)行代碼138生成的結(jié)果的主機計算節(jié)點。主機計算節(jié)點包括共享一存儲器分層結(jié)構(gòu)(即,存儲器系統(tǒng)104)的通用計算資源(即,通用處理元件102)的集合。主機計算節(jié)點可被配置成具有對稱多處理體系結(jié)構(gòu)(SMP),并且還可被配置為使用例如非均勻存儲器存取(NUMA)體系結(jié)構(gòu)來最大化存儲器系統(tǒng)104的存儲器局部性。主機計算節(jié)點的OS 132被配置為執(zhí)行DP調(diào)用點以使DP可執(zhí)行代碼138被DP最優(yōu)計算節(jié)點或非DP最優(yōu)計算節(jié)點121執(zhí)行。在其中存儲器124與存儲器系統(tǒng)104分開的實施例中,主機計算節(jié)點使DP可執(zhí)行代碼138以及一個或多個可索引類型14從存儲器系統(tǒng)104復(fù)制到存儲器124。在其中存儲器系統(tǒng)104包括存儲器124的實施例中,主機計算節(jié)點可將存儲器系統(tǒng)104中的DP可執(zhí)行代碼138和/或一個或多個可索引類型14的副本指定為存儲器124,和/或?qū)P可執(zhí)行代碼138和/或一個或多個可索引類型14從存儲器系統(tǒng)104的一部分復(fù)制到形成存儲器124的存儲器系統(tǒng)104的另一部分中。在計算節(jié)點121 和主機計算節(jié)點之間的復(fù)制過程可以是同步點,除非它被指定為是異步的。主機計算節(jié)點和每一計算節(jié)點121可并發(fā)地彼此獨立地執(zhí)行代碼。主機計算節(jié)點和每一計算節(jié)點121可在同步點處進行交互以協(xié)調(diào)節(jié)點計算。在一個實施例中,計算引擎120表示圖形卡,其中一個或多個圖形處理單元(GPU) 包括PE 122以及與存儲器系統(tǒng)104分開的存儲器124。在該實施例中,圖形卡的驅(qū)動程序 (未示出)可以將DP可執(zhí)行代碼138的字節(jié)代碼或某種其他中間表示(IL)轉(zhuǎn)換成GPU的指令集以供GPU的PE 122執(zhí)行。在另一實施例中,從一個或多個GPU ( S卩,PE 122)的組合中形成計算引擎120,該一個或多個GPU被包括在具有一個或多個通用處理元件102以及包括存儲器124的存儲器系統(tǒng)104的一部分的處理器封裝中。在該實施例中,可以在計算機系統(tǒng)100上提供附加軟件來將DP可執(zhí)行代碼138的字節(jié)代碼或某種其他中間表示(IL)轉(zhuǎn)換成處理器封裝中的GPU 的指令集。在另一實施例中,從一個或多個處理器封裝中的一個或多個SMD單元的組合中形成計算引擎120,該一個或多個處理器封裝包括處理元件102以及包括存儲器124的存儲器系統(tǒng)104的一部分。在該實施例中,可以在計算機系統(tǒng)100上提供附加軟件來將DP可執(zhí)行代碼138的字節(jié)代碼或某種其他中間表示(IL)轉(zhuǎn)換成處理器封裝中的SMD單元的指令集。在又一實施例中,從一個或多個處理器封裝中的一個或多個標量或矢量處理流水線的組合中形成計算引擎120,該一個或多個處理器封裝包括處理元件102以及包括存儲器124的存儲器系統(tǒng)104的一部分。在該實施例中,可以在計算機系統(tǒng)100上提供附加軟件來將DP可執(zhí)行代碼138的字節(jié)代碼或某種其他中間表示(IL)轉(zhuǎn)換成處理器封裝中的標量處理流水線的指令集。盡管此處說明并描述了具體實施例,但本領(lǐng)域技術(shù)人員可以理解,可用各種替換和/或等價實現(xiàn)來替換所示出并描述的具體實施例而不背離本發(fā)明的范圍。本申請旨在覆蓋此處討論的具體實施例的任何改編或變型。因此,本發(fā)明旨在僅由權(quán)利要求書及其等效方案來限制。
權(quán)利要求
1.一種存儲計算機可執(zhí)行指令的計算機可讀存儲介質(zhì),所述計算機可執(zhí)行指令在由計算機系統(tǒng)(100)執(zhí)行時使得所述計算機系統(tǒng)執(zhí)行一種方法,所述方法包括響應(yīng)于被配置成用于在一個或多個數(shù)據(jù)并行計算節(jié)點(121)上執(zhí)行的數(shù)據(jù)并行源代碼(10)中的靈活通信算子(12),從輸入可索引類型(14)和資源圖(16)生成靈活可索引類型(18);以及使用所述靈活可索引類型來執(zhí)行數(shù)據(jù)并行算法(138)。
2.如權(quán)利要求I所述的計算機可讀存儲介質(zhì),其特征在于,所述靈活輸出可索引類型具有由所述資源圖定義的多個片段。
3.如權(quán)利要求I所述的計算機可讀存儲介質(zhì),其特征在于,還包括使用在所述一個或多個數(shù)據(jù)并行計算節(jié)點中的第一節(jié)點上的所述靈活可索引類型的第一片段和在所述一個或多個數(shù)據(jù)并行計算節(jié)點中的第二節(jié)點上的所述靈活可索引類型的第二片段來執(zhí)行所述數(shù)據(jù)并行算法。
4.如權(quán)利要求I所述的計算機可讀存儲介質(zhì),其特征在于,所述數(shù)據(jù)并行算法是用所述靈活可索引類型的完整全局視圖表示來編碼的。
5.如權(quán)利要求I所述的計算機可讀存儲介質(zhì),其特征在于,所述數(shù)據(jù)并行算法是用所述靈活可索引類型的局部全局視圖表示來編碼的。
6.如權(quán)利要求I所述的計算機可讀存儲介質(zhì),其特征在于,所述數(shù)據(jù)并行源代碼是用具有數(shù)據(jù)并行擴展的編程語言編寫的。
7.如權(quán)利要求I所述的方法,其特征在于,所述數(shù)據(jù)并行源代碼是用高級數(shù)據(jù)并行編程語言編寫的。
8.如權(quán)利要求I所述的計算機可讀存儲介質(zhì),其特征在于,所述一個或多個數(shù)據(jù)并行計算節(jié)點包括至少一個圖形處理單元。
9.如權(quán)利要求I所述的計算機可讀存儲介質(zhì),其特征在于,所述一個或多個數(shù)據(jù)并行計算節(jié)點包括至少一個通用處理器。
10.一種由計算機系統(tǒng)(100)中的編譯器(134)執(zhí)行的方法,所述方法包括在被配置成用于在一個或多個數(shù)據(jù)并行計算節(jié)點(121)上執(zhí)行的數(shù)據(jù)并行源代碼(10)中標識靈活通信算子(12);以及從所述數(shù)據(jù)并行源代碼生成數(shù)據(jù)并行可執(zhí)行代碼(138),以使得所述數(shù)據(jù)并行可執(zhí)行代碼通過從輸入可索引類型(14)和資源圖(16)生成靈活可索引類型(18)來實現(xiàn)所述靈活通信算子。
11.如權(quán)利要求10所述的方法,其特征在于,所述靈活輸出可索引類型具有由所述資源圖定義的多個片段。
12.如權(quán)利要求10所述的方法,其特征在于,還包括從所述數(shù)據(jù)并行源代碼生成所述數(shù)據(jù)并行可執(zhí)行代碼,以使得所述數(shù)據(jù)并行可執(zhí)行代碼通過使用在所述一個或多個數(shù)據(jù)并行計算節(jié)點中的第一節(jié)點上的所述靈活可索引類型的第一片段和在所述一個或多個數(shù)據(jù)并行計算節(jié)點中的第二節(jié)點上的所述靈活可索引類型的第二片段來實現(xiàn)所述靈活通信算子。
13.如權(quán)利要求10所述的方法,其特征在于,所述數(shù)據(jù)并行源代碼是用所述靈活可索引類型的完整全局視圖表示來編碼的。
14.如權(quán)利要求10所述的方法,其特征在于,所述數(shù)據(jù)并行源代碼是用所述靈活可索引類型的局部全局視圖表示來編碼的。
15.如權(quán)利要求10所述的方法,其特征在于,所述數(shù)據(jù)并行源代碼是用帶有數(shù)據(jù)并行擴展的高級通用編程語言和高級數(shù)據(jù)并行編程語言之一編寫的。
全文摘要
本發(fā)明涉及靈活通信算子。一種高級編程語言提供了靈活通信算子(12),該靈活通信算子基于資源圖(16)來生成分段的計算空間以跨各計算節(jié)點(121)分布該計算空間。該靈活通信算子將該計算空間分解為片段(20),使這些片段被指派給各計算節(jié)點,并允許用戶集中管理并自動化在各計算節(jié)點間的這些片段的移動??梢允褂眠@些片段的完整全局視圖標識或局部全局視圖表示來管理片段移動。
文檔編號G06F9/38GK102609244SQ20111043400
公開日2012年7月25日 申請日期2011年12月21日 優(yōu)先權(quán)日2010年12月22日
發(fā)明者P·F·林塞斯 申請人:微軟公司