專利名稱:小塊通信算子的制作方法
技術領域:
本發(fā)明涉及計算機技術,尤其涉及小塊通信算子。
背景技術:
計算機系統(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)化的硬件資源。結果, 通用處理器在執(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ù)中的一種常見技術是小塊或塊分解算法,其中,將計算空間劃分成各子空間并且通過將每一小塊或塊如同它是一個點那樣進行處理來遞歸地實現(xiàn)算法。然而,這樣的分解涉及對索引的詳細跟蹤以及小塊和塊的相對幾何學。結果,創(chuàng)建索引和幾何學的過程可能是易于出錯且難以實現(xiàn)的。
發(fā)明內(nèi)容
提供本發(fā)明內(nèi)容是為了以簡化的形式介紹將在以下具體實施方式
中進一步描述的一些概念。本發(fā)明內(nèi)容并不旨在標識出所要求保護的主題的關鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。高級編程語言提供了一種將計算空間分解成可被映射到數(shù)據(jù)并行計算節(jié)點的各執(zhí)行結構(例如,線程組)的各子空間(即,小塊)的小塊通信算子。具有秩和元素類型的可索引類型定義了計算空間。對于輸入可索引類型,小塊通信算子產(chǎn)生具有與輸入可索引類型相同的秩以及作為輸入可索引類型的小塊的元素類型的輸出可索引類型。輸出可索引類型提供了計算空間的局部視圖結構,其使得能夠在數(shù)據(jù)并行計算節(jié)點中接合全局存儲器存取。
包括附圖來提供了對各實施例的進一步理解,且這些附圖被合并在本發(fā)明書內(nèi)并構成其一部分。附圖示出各實施例,并且與說明書一起用于解釋本發(fā)明的原理。其他實施例和各實施例的許多預期優(yōu)點將隨著參考下面的詳細描述進行更好的理解而得到認識。附圖的元素不一定相對于彼此而縮放。相同的附圖標記指代對應的類似部分。圖1是示出具有小塊通信算子的代碼的實施例的計算機代碼圖。
圖2是示出了將小塊通信算子應用到輸入可索引類型的實施例的框圖。圖3是示出生成具有小塊通信算子的輸出可索引類型的實施例的框圖。圖4是示出實現(xiàn)小塊通信算子的代碼的實施例的計算機代碼圖。圖5是示出被配置成編譯并執(zhí)行包括小塊通信算子的數(shù)據(jù)并行代碼的計算機系統(tǒng)的實施例的框圖。
具體實施例方式在以下具體實施方式
中,對附圖進行了參考,附圖構成了實施例的一部分且在其中作為示例示出了可在其中實踐本發(fā)明的各特定實施例。就此,諸如“頂部”、“底部”、“前方”、“后方”、“前導”、“尾部”等的方向性術語參考正在描述的附圖的方向來使用。因為實施例的各組件可位于多個不同的方向,所以方向性術語出于說明的目的來使用而不是限制。 可以理解,可以使用其它實施例并且可以做出結構上或邏輯上的改變而不背離本發(fā)明的范圍。因此,以下詳細描述并不旨在限制,并且本發(fā)明的范圍由所附權利要求來限定。應該理解,此處描述的各示例性實施例的特征可相互組合,除非另外具體注明。圖1是示出具有小塊通信算子12的代碼10的實施例的計算機代碼圖。在被編譯和執(zhí)行時,小塊通信算子12將計算空間(由圖1的實施例中的indexable_type<N,T>表示)分解成由程度(由圖1的實施例中的_EXtent表示)定義的子空間(即小塊)。各小塊可被映射到數(shù)據(jù)并行(DP)最優(yōu)計算節(jié)點的執(zhí)行結構(例如,線程組(DirectX)、線程塊 (CUDA)、工作組(OpenCL)或載波(AMD/ATI)),諸如圖5所示的且在下文中更詳細地描述的 DP最優(yōu)計算節(jié)點121。節(jié)點10包括來自高級通用編程語言或數(shù)據(jù)并行編程語言的可被編譯成一個或多個可執(zhí)行代碼(例如,DP可執(zhí)行代碼138)以便由一個或多個DP最優(yōu)計算節(jié)點(例如,圖5 所示的DP最優(yōu)計算節(jié)點)執(zhí)行的指令序列。在一個實施例中,代碼10包括來自具有數(shù)據(jù)并行擴展的高級通用編程語言(之后稱為GP語言)的指令序列,所述指令序列形成存儲在一個或多個模塊的集合中的程序。GP 語言可允許程序被編寫在不同部分(即模塊)中,使得每個模塊都可以被存儲在可以由計算機系統(tǒng)訪問的分開的文件或者位置中。GP語言提供用于對包括一個或多個通用處理器和一個或多個專用的DP最優(yōu)計算節(jié)點的計算環(huán)境進行編程的單個語言。DP最優(yōu)計算節(jié)點通常是通用處理器的圖形處理單元(GPU)或SIMD單元,但也可包括通用處理器的標量或矢量執(zhí)行單元、場可編程門陣列(FPGA)或一些計算環(huán)境中的其他合適設備。使用GP語言,程序員可將通用處理器和DP源代碼均包含在代碼10中以便由通用處理器和DP計算節(jié)點分別執(zhí)行,并協(xié)調(diào)通用處理器和DP源代碼的執(zhí)行。在該實施例中,代碼10可以表示任何合適類型的代碼,諸如應用、庫函數(shù)或操作系統(tǒng)服務。GP語言可以通過擴展諸如C或C++之類的廣泛適用的高級且通用的編程語言以包括數(shù)據(jù)并行特征來形成。其中可出現(xiàn)DP特征的通用語言的其他示例包括Java 、PHP、 Visual Basic、Perl、Python 、C#、Ruby、Delphi、Fortran、VB、F#、OCaml、Haskell、Erlang、 NESLXhapel以及Jav必cript 。GP語言可包括允許程序的不同部分被包括在不同模塊中的豐富鏈接能力。數(shù)據(jù)并行特征提供了利用DP最優(yōu)計算節(jié)點的專用體系結構來允許數(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é)點的專用體系結構來允許數(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、DAPPLE或APL。在該實施例中,代碼10可以表示任何合適類型的DP源代碼,諸如應用、庫函數(shù)或操作系統(tǒng)服務。代碼10包括被指定為在DP最優(yōu)計算節(jié)點上執(zhí)行的代碼部分。在使用GP語言來編寫代碼10的圖1的實施例中,GP語言允許程序員在定義矢量函數(shù)時使用注解沈(例 ^,_declspec(vector)···)來指定GP源代碼。注釋沈與旨在供在DP最優(yōu)計算節(jié)點上執(zhí)行的矢量函數(shù)的函數(shù)名27(例如vect0r_fUnc)相關聯(lián)。代碼10還可包括在調(diào)用點(諸如,forall, reduce, scan,或sort)處對矢量函數(shù)的一個或多個調(diào)用沘(例如,forall···, vector_func,…)。對應于調(diào)用點的矢量函數(shù)被稱為內(nèi)核函數(shù)。內(nèi)核函數(shù)可調(diào)用代碼10 中的其他矢量函數(shù)(即,其他DP源代碼),并可被視為矢量函數(shù)調(diào)用圖中的根。內(nèi)核函數(shù)還可使用由代碼10所定義的類型(例如,類或結構體)。這些類型可以被注釋為DP源代碼或可以不被注釋成DP源代碼。在其他實施例中,可使用其他合適的編程語言結構體來將代碼 10的各部分指定為DP源代碼和/或通用處理器代碼。此外,在使用DP語言來編寫代碼10 的實施例中,注釋26可以被省略。圖2是示出將小塊通信算子12應用于輸入可索引類型14以產(chǎn)生輸出可索引類型 18的實施例的框圖。如此處所使用的,可索引類型是實現(xiàn)帶有為非負整數(shù)的秩以及被表示為elementtype的類型的一個或多個指標算子的任何數(shù)據(jù)類型。如果indeX<N>是表示整數(shù)的N元組的類型(即,任何類型的整數(shù)數(shù)據(jù)類型),那么indeX<N>的實例就是N個整數(shù)的集合U0,il,…,im},其中m等于N-I (即,N元組)。秩N的索引算子采用indeX<N>的 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 ;其中index—declarator釆用以下中的至少一個形式const index<rank>&idx ;const index<rank>idx ;index<rank>&idx ;index<rank>idx.在其他實施例中,算子可以是函數(shù)、函子或更通用的表示。具有給定秩和元素類型的可索引類型的種類具有被稱為字段的初始對象。可索引類型具有多面體的形狀一即,可索引類型可被代數(shù)地表示為由坐標軸的線性函數(shù)所形成的有限數(shù)量個半平面的交點。參考圖1和2,代碼10的高級語言提供了小塊通信算子12以便在數(shù)據(jù)并行計算環(huán)境中的輸入可索引類型14上使用。輸入可索引類型14具有秩(例如,圖1的實施例中的秩N)和元素類型(例如,圖1的實施例中的元素類型T)并且定義了可由小塊通信算子12 分解的計算空間。對于每一個輸入可索引類型14,小塊通信算子產(chǎn)生具有與輸入可索引類型14相同的秩以及作為輸入可索引類型14的小塊的元素類型的輸出可索引類型18。圖3是示出生成具有小塊通信算子12的輸出可索引類型18的實施例的框圖。在圖3的示例中,小塊通信算子12使用2x2小塊將4x4輸入可索引類型14劃分成2x2輸出可索引類型18。作為另一示例(未示出),給定ΙΟΜχΙΟΜ矩陣的輸入可索引類型14和 64x64的小塊,輸出可索引類型18表示16x16小塊(64*16 = 1024)。小塊通信算子12表示數(shù)據(jù)分解的范圍模式。范圍模式涉及可索引類型的集合。使 Indexable<N>為秩N的任何輸入可索引類型14,這意味著索引算子作用于類型indeX<N> 的實例。指標算子的返回類型(即,元素類型)^ Indexable<N>: :element_type0小塊通信算子12的演算得到以下同構關系。對于小塊tile<grid_tile>: Indexable<N>->range<N, Indexable<N>> 并且 range<N, Indexable<N>> 是被限于由 Indexable<N>/grid_tile 索引的 grid_tile 的 Indexable<N> 的集合。更具體地,如果網(wǎng)格描述 Indexable<N> 的形狀,則 range<N,Indexable<N 是被限于由 grid_range = (grid+grid_tile-l)/grid_tile 中的偏置所解釋的 grid_tile 的 hdexable<N> 的集合。因
tile<grid_tile>(Indexable<N>) ^JMW, grid_range ^ range<N, Indexable<N>>
的形狀。由小塊通信算子12構造的所有‘范圍(range) ’實例采用具有hdeXable<N>的定義或形狀的原始域,該原始域被稱為hdexablKNXgrid而不丟失通用性。根據(jù)定義, Indexable<N>的索引算子作用于由hdexable<N>. grid描述的每一個hdex<N>。在形成 range<Nl, Indexable<N2>> 的過程中,形成 Indexable<N>. grid 的劃分,且由 range<Nl, Indexable<N2 定義的集合是限于N2_維度劃分的原始hdexable<N>-由index<m>的 Nl-維度集合參數(shù)化的集合。編譯時由編譯器推斷的優(yōu)化是range<N,Indexable<N>>是原始hdexable<N>的劃分。在輸入可索引類型14被定義為“范圍”的一個示例中,在以下代碼部分中可使用小塊通信算子12 “小塊”將范圍輸入可索引類型14分塊成輸出可索引類型18。 7//
//小塊通信算子。 Il
template <int —Rank, typename —Parent—type> 一DECLSPEC_VECTOR
tile_range<_Rank, —Parent—type> tile
— Γ — —
const _Parent_type& 一Parent, const extent< Rank>& Tile
extent<_Rank> e(—Parent.get_grid() . get—extent ()+—Tile-l/_Tile); return tile—rangec—Rank, _Parent_type> (grid<_Rank>(e),
_Tile7
_Parent_type (grid<—Ranks· (_Tile) , —Parent));
} “ _在以上代碼部分中,gricKRankMe)描述了作為小塊集合的tile_range的形狀。 _Tile是tile_range采用的增加值或階,即,‘下一小塊’遞增量為_Tile。最后一個參數(shù)Parent_type (grid<_Rank> (_Tile),一Parent) ^ 一Parent 白勺 _Tile
的表示。實際上,為使可索引類型允許分塊,這意味著對于‘tile(…)’通信算子是有效的, 它具有簽名 Parent—type (const grid〈—Rank>&—Sub—grid,const—Parent—type&—Parent) 的構造器就足夠了。在輸入可索引類型14被定義為字段初始對象(即“字段”)的另一示例中,可使用以下代碼部分中的小塊通信算子12 “小塊”來將字段輸入可索引類型14分塊成輸出可索引類型18。
Il
//小塊通信算子。 //
template <int —Rank, typename _Element_type> 一DECLSPEC_VECTOR
tile_range<_Rank, field<_Rank, —Element一type>> tile
— 「 ~ ~ ~
const field<—Rank, _Element_type>& —Parent, const extent<_Rank>& —Tile
) — —
{
extent<_Rank> e(—Parent. get—grid () . get—extent ()+一Tile-1/一Tile); return tile_range<_Rank, field<_Rank, _Element_type>> (grid<_Rank>(e), —Tile,—
field<_Rank, —Element—type〉 (grid<_Rank> (_Tile) , 一Parent) ),-
在以上代碼部分中,grid<_Rank>(e)描述了作為小塊集合的tile_range的形狀。 _Tile是tile_range采用的增加值或階,即,‘下一小塊’遞增量為_Tile。最后一個參數(shù)field<_Rank, _Element_type> (grid<_Rank> (Tile),一Parent) ^ field<_Rank, _ Element_type>的_Tile形狀的子對象的表示。圖4是示出實現(xiàn)小塊通信算子12和輸出可索引類型18的代碼的實施例的計算機代碼圖示。在圖4所示的代碼中,數(shù)據(jù)結構“tile_range”為小塊通信算子12 “小塊”形成輸出可索引類型18(也被稱為“偽字段”)。tile_range的索引算子采用
const index<_Rank>&_Index并形成其程度為_Tile的字段或偽字段且其偏置為從中構建該字段或偽字段的_Parent內(nèi)的Jndex*m_multiplier。輸出可索引類型18提供了能夠在DP最優(yōu)計算代碼中接合全局存儲器存取的數(shù)據(jù)并行算法的計算空間(即,輸入可索引類型14)的局部視圖結構。數(shù)據(jù)并行算法的局部結構形成了與DP最優(yōu)計算節(jié)點的執(zhí)行結構(例如,線程組、線程塊、工作組或波)相對應的調(diào)度模式。對于包括流SIMD擴展(SSE)計算引擎的DP最優(yōu)計算節(jié)點,該局部結構與通過循環(huán)分小塊或循環(huán)分塊形成的帶狀挖掘程度相似。局部結構與DP最優(yōu)計算節(jié)點的快速局部或共享存儲器(例如,高效的高速暫存存儲器或高速緩存)交互以產(chǎn)生對全局存儲器存儲的更高的算法存取。局部結構與分塊的關系如下——小塊可被設為局部結構常量的倍數(shù)以使得適合小塊的局部結構的數(shù)量確定了執(zhí)行結構的隱式循環(huán)維度的展開因子。這一關系可在局部視圖分解中看見—index = _tileIndex*thread_group_dimensions+_localIndex其中jilelndex表示包的小塊(即,輸入可索引類型14)的坐標而_ IocalIndex該小塊內(nèi)的偏置。局部結構常量thread_group_dimensions可被設為與_Tile 相同或者被這樣設置以使得thread_group_dimensions的倍數(shù)(例如16)等于_Tile以使得能夠在DP最優(yōu)計算節(jié)點中接合全局存儲器存取。由此,小塊通信算子12提供了直接的、 無差錯且直觀的DP最優(yōu)計算節(jié)點的小塊分解。小塊通信算子12可被遞歸地應用并且可與在可索引類型上操作的其他通信算子進行組合。現(xiàn)在將參照矩陣乘法來說明小塊通信算子12的使用。不使用小塊通信算子12,可如以下代碼所示地對全局視圖結構執(zhí)行矩陣乘法。
_declspec(vector)
void mxm_ke;rriel—naive (index<2> idx, field<2, float>& mC,
read—only_range<field<2, float>>& mA, read—only—range<field<2, float>>& mB){ float c = 0.0f;
for (int k = 0; k < mA.get—extent (1) ; k++) c += mJV(id:>c(0), k) * mB (k, idx(l));mC(i, j) = c;
}
void mxm(float* C, const grid<2> g(N, N); field<2, float> mA(g) mA.copy一in(A, N*N); mB.copy一in(B, N*N); forall(mC. get—grid (), mC, read_only(mA) mC.copy一out(B, N*N);
} 假定存在由16x16線程組維度確定的局部視圖結構。類似地,將矩陣A、B和C分塊成16x16的小塊。(暫時假定N被16整除——一般情況,檢查邊界條件并且當小塊未完全地被包含在原始數(shù)據(jù)中時內(nèi)核提前退出。)帶狀挖掘以下循環(huán)for(int k = 0 ;k < mA. get_extent (1) ;k++)c+ = mA (idx (0),k) *mB (k, idx (1));以得到for (int k = 0 ;k < mA. get_extent (1)/16 ;k++)for (int χ = 0 ;x < 16 ;χ++)c+= mA(idx(0),k*16+x)*mB(k*16+x,idx(l));為對以上進行分塊,分解idx = _tileIdx*_Tile+_localIdx.隨后將tiled_mA和tiled_mB進行組合以得到for (int k = 0 ;k < tiled_mA. get_extent (1) ;k++)for (int χ = 0 ;x < 16 ;χ++)c+ = tiled_mA(_tileldx(0),k) (_localIdx(0),χ)*tiled_mB(k,_tileldx(l)) (x,_localIdx(l));從以上分解中,可以看到mA(idx(0),k*16+x) == tiled_mA (_tiIeIdx (0), k) (_localIdx (0), χ);以及mB(k*16+x,idx (1)) == tiled_mB(k,_tileldx(l)) (x, _localIdx (1)).對應關系從以下得出idx = _tileIdx*_Tile+_localIdx,換言之,矩陣中的每一點具有到包含該點的小塊以及小塊內(nèi)的偏置的唯一分解。
為完成這一示例,可執(zhí)行貫穿共享存儲器的存儲器接合。假設以上全局視圖矩陣乘法形成了對于16x16的線程組維度分派的內(nèi)核,這意味著256個線程在邏輯上同時執(zhí)行該內(nèi)核。只要一個線程需要來自其自己線程組的另一線程的結果,就可插入同步障礙group—barrier ();它阻塞線程組中的所有線程直到所有線程都到達了該障礙。
float* A, const float* B, size_t N) { t mB(g), mC(g);
mxm—kernel—naive, t read_only(mB));
考慮存儲器加載mA(idx (0), k)mB(k,idx(l))//固定的 k線程組具有線程(i,j)其中0 <= i, j < 16。對于任意i,線程(i,0),(i,l),…,(i,15)從全局存儲器中讀取連續(xù)的4字節(jié)地址以便完全地接合存取。具體地,線程(i,0) 讀取第一組4字節(jié),線程(i,l)讀取第二組4字節(jié),線程(id)讀取第三組4字節(jié),以此類推。按64或1 字節(jié)組塊從全局存儲器存取存儲器,并且實際上使用被存取的所有存儲器是最優(yōu)的。然而mA(idx (0), k)只為線程((i,0),(i,l),…,(i,15))中的任何一行使用了 4字節(jié),所以大部分的全局存儲器取數(shù)未被使用。而mB(k,idx(l)) = mB(k,_tileldx(1)*16+_localIdx(1))為 64字節(jié)組塊完全接合, 因為,IocalIdx按(i,0),(i,1),…,(i,15)準確地變化。類似地,假定線程組和_Tile組維度為8x32,則mB(k, idx(l)) = mB(k, _tileldx (1) *32+_localIdx (1))為 1 字節(jié)組塊完全接合,因S_loCalIdX 按(i,0),(i,l),…,(i,31)準確地變化。為了迫使所有存儲器存取被完全接合,則按接合的方式來將全局存儲器讀入共享存儲器中,因為接合的次序不是用來執(zhí)行計算的次序,在組障礙處進行同步之后按所需次序從共享存儲器進行存取。這導致存儲器存取被完全接合以及一種值得的優(yōu)化,因為DP最優(yōu)計算節(jié)點中的共享存儲器實質(zhì)上具有單元存取速度。sharedALlocalIdx] = tiled_mA(_tiIeIdx(0), k) [_localIdx];以及sharedB[_localIdx] = tiled_mB(k, tileldx(l)) [_localIdx];將其全部組合在一起得到local_field<float, 16, 16> sharedA, sharedB;
for (int i = 0; i < tiled—mA.get—extent (0) ; i + +) {
sharedA[_localIdx] = tiled_mA(—tile工dx
, i)[—localldx]; sharedB[—localldx] = tiled_mB(i, 一tileldx[1])[—localldx];
group—barrier ();
for (int k = 0; k < 16; k++)
tempC += shareciA (_localIdx
, k) * sharedB (k, —IocalIdx [1]);
group—barrier ();
}
mC(tileldx)(local工dx〉 = tempC/或
_declspec(vector)
void mxm—kernel—tiling (index—group<2> idx, field<2, float> & mC,
read—only_range<tile_range<2, field<2, float>>>& mA, read—only—range<tile_range<2, field<2, float>>>& mB)
{
float tempC = O.Of;local_field<float, 16, 16> sharedA, sharedB?
for (int i = 0/ i < mA.get_extent(1); i++) {
sharedA[idx.local ()] = mA(idx. group (O), i) [idx.local O]; sharedB[idx.local () ] = mB(i, idx.group(1)) [idx.local ()];
group—barrier ();
for (int k = 0; k < 16; k++}
tempC += sharedA(idx. local (0} , k) * sharedB(k, idx.local(1));
group_barrier();
}
mC[idx.global ()] = tempC;
}其中調(diào)用點
void mxm(float* C, const float* A, const float* B, size—t N) { grid<2> g(N, N);
field<2, floats mA(g), mB(g), mC(g); extent<2> _Tile(16,16);
mA.copy—in(A, N*N); mB. copy—in(B, N*N);
forall<16 ,16> (mC . get—grid () , τηχτη—kernel—tiling,
mC, read—only(tile(mA, —Tile)), read_only(tile(mB, _Tile)));
mC. copy—out(B, N*N);
}小塊通信算子12的使用基于完全接合的存儲器存取可顯著提高執(zhí)行矩陣乘法的速度。另外,如果矩陣中的一個作為乘法的一部分被轉置,小塊通信算子12的使用基于完全接合的存儲器存取可動態(tài)地提高執(zhí)行矩陣乘法的速度。在A*轉置(B)的情況下,存儲器存取完全未接合以得到在不分塊的情況下大約100次的執(zhí)行命中。圖5是示出被配置成編譯并執(zhí)行包括小塊通信算子12的數(shù)據(jù)并行代碼10的計算機系統(tǒng)100的實施例的框圖。計算機系統(tǒng)100包括具有容納在一個或多個處理器封裝(未示出)中的一個或多個處理元件(PE) 102以及存儲器系統(tǒng)104的主機101。計算機系統(tǒng)100還包括零個或更多個輸入/輸出設備106、零個或更多個顯示設備108、零個或更多個外圍設備110和零個或更多個網(wǎng)絡設備112。計算機系統(tǒng)100還包括具有一個或多個DP最優(yōu)計算節(jié)點121的計算引擎120,其中每一 DP最優(yōu)計算節(jié)點121包括一組一個或多個處理元件(PE) 122和存儲DP 可執(zhí)行代碼138的存儲器124。主機101、輸入/輸出設備106、顯示設備108、外圍設備110、網(wǎng)絡設備112和計算
引擎120使用包括任何合適的類型、數(shù)量和配置的控制器、總線、接口、和/或其他有線或無線連接的一組互連114來進行通信。計算機系統(tǒng)100表示出于通用或?qū)S媚康亩渲玫娜魏魏线m的處理設備。計算機系統(tǒng)100的示例包括服務器、個人計算機、膝上型計算機、圖形輸入板計算機、智能電話、個人數(shù)字助理(PDA)、移動電話、和音頻/視頻設備。計算機系統(tǒng)100的組件(即,主機101、 輸入/輸出設備106、顯示設備108、外圍設備110、網(wǎng)絡設備112、互連114和計算引擎120) 可包含在公共外殼(未示出)中或任何合適數(shù)量的分立外殼(未示出)中。處理元件102各自形成被配置成執(zhí)行存儲在存儲器系統(tǒng)104中的指令(即軟件) 的執(zhí)行硬件。每一處理器封裝中的處理元件102可具有相同或不同的體系結構和/或指令集。例如,處理元件102可以包括順序執(zhí)行元件、超標量執(zhí)行元件、以及數(shù)據(jù)并行執(zhí)行元件 (例如GPU執(zhí)行元件)的任何組合。每一處理元件102被配置為訪問并執(zhí)行存儲在存儲器系統(tǒng)104中的指令。這些指令可包括基本輸入輸入系統(tǒng)(BIOS)或固件(未示出)、操作系統(tǒng)(0 132、代碼10、編譯器134、GP可執(zhí)行代碼136以及DP可執(zhí)行代碼138。每一處理元件102可以結合或響應于從輸入/輸出設備106、顯示設備108、外圍設備110、網(wǎng)絡設備112 和/或計算引擎120接收到的信息來執(zhí)行指令。主機101引導并執(zhí)行OS 132。OS 132包括可以由處理元件執(zhí)行以管理計算機系統(tǒng)100的組件并提供允許程序訪問并使用這些組件的一組功能的指令。在一實施例中,OS 132是Windows操作系統(tǒng)。在其他實施例中,OS 132是適于和計算機系統(tǒng)100 —起使用的
另一操作系統(tǒ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是響應于為了編譯代碼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í)行之前使用設備驅(qū)動程序(未示出) 被轉換成來自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í)行或可以在被轉換成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ù)量和配置的易失性或非易失性存儲設備。存儲器系統(tǒng)104的儲存設備表示儲存包括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的功能和方法。存儲器系統(tǒng)104存儲從處理元件102、輸入/輸出設備106、顯示設備108、外圍設備110、網(wǎng)絡設備112和計算引擎120接收的指令和數(shù)據(jù)。存儲器系統(tǒng)104將所存儲的指令和數(shù)據(jù)提供給處理元件102、 輸入/輸出設備106、顯示設備108、外圍設備110、網(wǎng)絡設備112和計算引擎120。存儲器系統(tǒng)104中的存儲設備的示例包括硬盤驅(qū)動器、隨機存取存儲器(RAM)、只讀存儲器(ROM)、 閃存驅(qū)動器和卡、以及諸如⑶和DVD之類的磁盤和光盤。輸入/輸出設備106包括被配置成將指令或數(shù)據(jù)從用戶輸入到計算機系統(tǒng)100并將指令或數(shù)據(jù)從計算機系統(tǒng)100輸出到用戶的任何合適的類型、數(shù)量和配置的輸入/輸出設備。輸入/輸出設備106的示例包括鍵盤、鼠標、觸摸墊、觸摸屏、按鈕、撥盤、旋鈕和開關。顯示設備108包括被配置成向計算機系統(tǒng)100的用戶輸出文本和/或圖形信息的任何合適的類型、數(shù)量和配置的顯示設備。顯示設備108的示例包括監(jiān)視器、顯示屏和投影儀。外圍設備110包括被配置成用計算機系統(tǒng)100中的一個或多個其他組件來操作以執(zhí)行通用或?qū)S锰幚砉δ艿娜魏魏线m的類型、數(shù)量和配置的外圍設備。網(wǎng)絡設備112包括被配置成允許計算機系統(tǒng)100跨一個或多個網(wǎng)絡(未示出)進行通信的任何合適的類型、數(shù)量和配置的網(wǎng)絡設備。網(wǎng)絡設備112可根據(jù)任何合適的網(wǎng)絡協(xié)議和/或配置來操作以允許計算機系統(tǒng)100將信息發(fā)送給網(wǎng)絡或者從網(wǎng)絡接收信息。計算引擎120被配置成執(zhí)行DP可執(zhí)行代碼138。計算引擎120包括一個或多個計算節(jié)點121。每一計算節(jié)點121是共享一存儲器分層結構的計算資源的集合。每一計算節(jié)點121包括一組一個或多個PE 122以及存儲DP可執(zhí)行代碼138的存儲器124。PE 122 執(zhí)行DP可執(zhí)行代碼138并將由DP可執(zhí)行代碼138生成的結果儲存在存儲器124中。具體地,PE 122執(zhí)行DP可執(zhí)行代碼138以將小塊通信算子12應用于輸入可索引類型14以生成如圖5所示的且如上文中詳細描述的輸出可索引類型18。具有一個或多個計算資源且該資源具有為數(shù)據(jù)并行計算(即,執(zhí)行DP程序或算法)而優(yōu)化的硬件體系結構的計算節(jié)點121被稱為DP最優(yōu)計算節(jié)點121。DP最優(yōu)計算節(jié)點121的示例包括其中一組PE 122包括一個或多個GPU的節(jié)點121,以及其中一組PE 122 包括通用處理器封裝中的一組SIMD單元的節(jié)點121。不具有帶有為數(shù)據(jù)并行計算而優(yōu)化的硬件體系結構的任何計算資源的計算節(jié)點121 (例如,僅僅具有通用處理元件102的處理器封裝)被稱為非DP最優(yōu)計算節(jié)點121。在每一計算節(jié)點121中,存儲器IM可與存儲器系統(tǒng)104(諸如,GPU所使用的GPU存儲器)分開,或可以是存儲器系統(tǒng)104的一部分(例如, 通用處理器封裝102中的SIMD單元所使用的存儲器)。主機101形成被配置成將DP可執(zhí)行代碼138提供給計算節(jié)點121以供執(zhí)行并且使用互連114接收由DP可執(zhí)行代碼138生成的結果的主機計算節(jié)點。主機計算節(jié)點包括共享一存儲器分層結構(即,存儲器系統(tǒng)104)的通用計算資源(即,通用處理元件102)的集合。主機計算節(jié)點可被配置成具有對稱多處理體系結構(SMP),并且還可被配置為使用例如非均勻存儲器存取(NUMA)體系結構來最大化存儲器系統(tǒng)104的存儲器局部性。主機計算節(jié)點的OS 132被配置為執(zhí)行DP調(diào)用點以使DP可執(zhí)行代碼138被DP最優(yōu)計算節(jié)點或非DP最優(yōu)計算節(jié)點121執(zhí)行。在其中存儲器IM與存儲器系統(tǒng)104分開的實施例中,主機計算節(jié)點使DP可執(zhí)行代碼138以及一個或多個可索引類型14從存儲器系統(tǒng)104復制到存儲器124。在其中存儲器系統(tǒng)104包括存儲器IM的實施例中,主機計算節(jié)點可將存儲器系統(tǒng)104中的DP可執(zhí)行代碼138和/或一個或多個可索引類型14的副本指定為存儲器124,和/或?qū)P可執(zhí)行代碼138和/或一個或多個可索引類型14從存儲器系統(tǒng)104的一部分復制到形成存儲器124的存儲器系統(tǒng)104的另一部分中。在計算節(jié)點121 和主機計算節(jié)點之間的復制過程可以是同步點,除非它被指定為是異步的。主機計算節(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)轉換成GPU的指令集以供GPU的PE 122執(zhí)行。在另一實施例中,從一個或多個GPU(即,PE 122)的組合中形成計算引擎120,該一個或多個GPU被包括在具有一個或多個通用處理元件102以及包括存儲器IM的存儲器系統(tǒng)104的一部分的處理器封裝中。在該實施例中,可以在計算機系統(tǒng)100上提供附加軟件來將DP可執(zhí)行代碼138的字節(jié)代碼或某種其他中間表示(IL)轉換成處理器封裝中的GPU 的指令集。在另一實施例中,從一個或多個處理器封裝中的一個或多個SIMD單元的組合中形成計算引擎120,該一個或多個處理器封裝包括處理元件102以及包括存儲器IM的存儲器系統(tǒng)104的一部分。在該實施例中,可以在計算機系統(tǒng)100上提供附加軟件來將DP可執(zhí)行代碼138的字節(jié)代碼或某種其他中間表示(IL)轉換成處理器封裝中的SIMD單元的指令集。在又一實施例中,從一個或多個處理器封裝中的一個或多個標量或矢量處理流水線的組合中形成計算引擎120,該一個或多個處理器封裝包括處理元件102以及包括存儲器124的存儲器系統(tǒng)104的一部分。在該實施例中,可以在計算機系統(tǒng)100上提供附加軟件來將DP可執(zhí)行代碼138的字節(jié)代碼或某種其他中間表示(IL)轉換成處理器封裝中的標量處理流水線的指令集。盡管此處說明并描述了具體實施例,但本領域技術人員可以理解,可用各種替換和/或等價實現(xiàn)來替換所示出并描述的具體實施例而不背離本發(fā)明的范圍。本申請旨在覆蓋此處討論的具體實施例的任何改編或變型。因此,本發(fā)明旨在僅由權利要求書及其等效方案來限制。
權利要求
1.一種存儲計算機可執(zhí)行指令的計算機可讀存儲介質(zhì),所述計算機可執(zhí)行指令在由計算機系統(tǒng)(100)執(zhí)行時使得所述計算機系統(tǒng)執(zhí)行一種方法,所述方法包括響應于被配置成供在一個或多個數(shù)據(jù)并行計算節(jié)點(121)上執(zhí)行的數(shù)據(jù)并行源代碼 (10)中的小塊通信算子(12),從輸入可索引類型(14)中生成輸出可索引類型(18);以及使用所述輸出可索弓I類型來執(zhí)行數(shù)據(jù)并行算法。
2.如權利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述輸入可索引類型具有秩和第一元素類型,且所述輸出可索引類型具有所述秩和作為所述輸入可索引類型的小塊的第二元素類型。
3.如權利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述輸入可索引類型具有秩和第一形狀,且所述輸出可索引類型具有所述秩和作為所述輸入可索引類型的小塊的第二形狀。
4.如權利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述輸出可索引類型映射到所述一個或多個數(shù)據(jù)并行計算節(jié)點的執(zhí)行結構。
5.如權利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述輸出可索引類型提供所述一個或多個數(shù)據(jù)并行計算節(jié)點上的輸入可索引類型的局部視圖結構。
6.如權利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述數(shù)據(jù)并行源代碼是用具有數(shù)據(jù)并行擴展的編程語言編寫的。
7.如權利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述一個或多個數(shù)據(jù)并行計算節(jié)點包括至少一個圖形處理單元。
8.如權利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述一個或多個數(shù)據(jù)并行計算節(jié)點包括至少一個通用處理器。
9.一種由計算機系統(tǒng)(100)中的編譯器(134)執(zhí)行的方法,所述方法包括在被配置成供在一個或多個數(shù)據(jù)并行計算節(jié)點(121)上執(zhí)行的數(shù)據(jù)并行源代碼(10) 中標識小塊通信算子(12);以及從所述數(shù)據(jù)并行源代碼中生成數(shù)據(jù)并行可執(zhí)行代碼(138),以使得所述數(shù)據(jù)并行可執(zhí)行代碼通過將輸入可索引類型(14)分解成輸出可索引類型(18)來實現(xiàn)小塊通信算子。
10.如權利要求9所述的方法,其特征在于,所述輸入可索引類型具有秩和第一元素類型,且所述輸出可索引類型具有所述秩和作為所述輸入可索引類型的小塊的第二元素類型。
11.如權利要求9所述的方法,其特征在于,所述輸入可索引類型具有秩和第一形狀, 且所述輸出可索引類型具有所述秩和作為所述輸入可索引類型的小塊的第二形狀。
12.如權利要求9所述的方法,其特征在于,所述輸出可索引類型映射到所述一個或多個數(shù)據(jù)并行計算節(jié)點的執(zhí)行結構。
13.如權利要求9所述的方法,其特征在于,所述輸出可索引類型提供所述一個或多個數(shù)據(jù)并行計算節(jié)點上的輸入可索引類型的局部視圖結構。
14.一種存儲計算機可執(zhí)行指令的計算機可讀存儲介質(zhì),所述計算機可執(zhí)行指令在由計算機系統(tǒng)(100)執(zhí)行時執(zhí)行一種方法,所述方法包括應用小塊通信算子(1 來將具有秩和第一元素類型的輸入可索引類型(14)分解成具有所述秩和作為所述輸入可索引類型的第二元素類型的輸出可索引類型(18);以及使用所述輸出可索弓I類型來對所述輸入可索弓I類型執(zhí)行數(shù)據(jù)并行算法; 其中所述小塊通信算子被包括在用帶有數(shù)據(jù)并行擴展的高級通用編程語言編寫的數(shù)據(jù)并行源代碼(10)中,其中所述輸出可索引類型映射到被配置成執(zhí)行所述數(shù)據(jù)并行算法的一個或多個數(shù)據(jù)并行計算節(jié)點(121)的執(zhí)行結構,且其中所述一個或多個數(shù)據(jù)并行計算節(jié)點包括至少一個圖形處理單元(122)。
15.如權利要求14所述的計算機可讀存儲介質(zhì),其特征在于,所述第一元素類型具有第一形狀,且所述第二元素類型具有作為小塊的第二形狀。
全文摘要
本發(fā)明公開了小塊通信算子。高級編程語言提供了一種將計算空間分解成可被映射到數(shù)據(jù)并行計算節(jié)點的各執(zhí)行結構(例如,線程組)的子空間(即,小塊)的小塊通信算子。具有秩和元素類型的可索引類型定義計算空間。對于輸入可索引類型,小塊通信算子產(chǎn)生具有與輸入可索引類型相同的秩以及作為輸入可索引類型的小塊的元素類型的輸出可索引類型。輸出可索引類型提供了計算空間的局部視圖結構,這使得能夠在數(shù)據(jù)并行計算節(jié)點中接合全局存儲器存取。
文檔編號G06F9/38GK102495723SQ20111032024
公開日2012年6月13日 申請日期2011年10月11日 優(yōu)先權日2010年10月12日
發(fā)明者P·F·林塞斯 申請人:微軟公司