亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

數(shù)據(jù)平行代碼中的映射變換的制作方法

文檔序號:6439311閱讀:225來源:國知局
專利名稱:數(shù)據(jù)平行代碼中的映射變換的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計算機系統(tǒng),尤其涉及計算機系統(tǒng)中代碼的映射變換。背景計算機系統(tǒng)通常包括一個或多個通用處理器(例如,中央處理單元(CPU))和一個或多個專有數(shù)據(jù)平行計算節(jié)點(例如,圖形處理單元(GPU)或CPU中的單指令多數(shù)據(jù) (SIMD)執(zhí)行單元)。通用處理器一般執(zhí)行計算機系統(tǒng)上的通用處理,而數(shù)據(jù)平行計算節(jié)點一般執(zhí)行計算機系統(tǒng)上的數(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)上扮演了對執(zhí)行計算機系統(tǒng)上的程序的通用處理器的支持角色。隨著由于數(shù)據(jù)平行計算節(jié)點處理能力的增強而造成的為數(shù)據(jù)平行算法優(yōu)化的硬件角色的增加,將需要增強程序員編程數(shù)據(jù)平行計算節(jié)點以及使數(shù)據(jù)平行計算節(jié)點的編程更加簡單的能力。數(shù)據(jù)平行計算節(jié)點一般執(zhí)行例如被稱為內(nèi)核或者著色器的指定的數(shù)據(jù)平行算法。 為了執(zhí)行多個數(shù)據(jù)平行算法,一般消耗明顯的計算開銷以啟動每一數(shù)據(jù)平行算法。此外,當數(shù)據(jù)平行計算節(jié)點具有和對應(yīng)的主存計算節(jié)點不同的存儲器層級結(jié)構(gòu)時,將消耗額外的開銷來將不同數(shù)據(jù)平行算法的中間結(jié)果復(fù)制到主存計算節(jié)點或者從主存計算節(jié)點復(fù)制。

發(fā)明內(nèi)容
提供本發(fā)明內(nèi)容以便以簡化的形式介紹將在以下具體實施方式
中進一步描述的一些概念。本發(fā)明內(nèi)容并不旨在標識出所要求保護的主題的關(guān)鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。高層編程語言提供了映射變換,該映射變換采用數(shù)據(jù)平行算法并且將一組一個或多個輸入可索引類型作為自變量。映射變換將數(shù)據(jù)平行算法應(yīng)用于該組輸入可索引類型, 以生成輸出可索引類型,并且返回該輸出可索引類型。映射變換可用于將一個或多個數(shù)據(jù)平行算法與另一數(shù)據(jù)平行算法融合。


所附附圖被包括以提供對各實施例的進一步理解,并且被并入和組成本發(fā)明的一部分。附圖示出各實施例,并且與說明書一起用于解釋各實施例的原理。其他實施例以及許多各實施例的預(yù)期優(yōu)點將隨著其通過參考以下詳細描述變得更好理解而被容易地明白。 附圖的元素不需要相對于彼此而縮放。相同的標號指明對應(yīng)的類似部分。圖1是示出具有映射變換的數(shù)據(jù)平行代碼的實施例的計算機代碼圖。圖2是示出將映射變換應(yīng)用于一組輸入可索引類型的實施例的框圖。圖3A-3C是示出使用映射變換的各實施例的框圖。圖4是示出被配置為編譯和執(zhí)行包括了映射變換的數(shù)據(jù)平行代碼的計算機系統(tǒng)的實施例的框圖。詳細描述在以下詳細描述中,對附圖進行了參考,附圖構(gòu)成了實施例的一部分,并且在其中作為示例示出了其中能夠?qū)嵺`本發(fā)明的特定實施例。出于這一考慮,參考所述附圖的方向來使用諸如“頂部”、“底部”、“前”、“后”、“在前的”、“在后的”等方向術(shù)語。由于可以以眾多不同的方向來放置各實施例的組件,因此方向術(shù)語僅用于示例的目的,而不作為限制??梢岳斫?,可使用其他實施例并且可做出結(jié)構(gòu)上或邏輯的改變而不背離本發(fā)明的范圍。因此,以下詳細描述并不旨在限制,并且本發(fā)明的范圍由所附權(quán)利要求來限定??梢岳斫?,除非特別指明,此處描述的各示例性實施例的特征可以互相結(jié)合。圖1是示出具有通用映射變換12的數(shù)據(jù)平行(DP)代碼10的實施例的計算機代碼圖。映射變換12采用DP算法14并且將一組一個或多個輸入可索引類型作為自變量,如箭頭16所指示將DP算法14應(yīng)用于該組輸入可索引類型以生成輸出可索引類型,并且如箭頭18所指示返回輸出可索引類型。如以下更加詳細描述的,映射變換12可用于將一個或多個DP算法14與另一 DP算法M融合。如此處所使用的,可索引類型是與非負整數(shù)的秩一起實現(xiàn)一個或多個下標操作符的任意數(shù)據(jù)類型,并且是由elementjype (元素_類型)表示的類型。如果索引<N>是表示 N-元整數(shù)的類型(S卩,任意類型的整數(shù)數(shù)據(jù)類型),則索引<N>的實例為一組N個整數(shù)U0, il,. . .,im},其中m等于N-I ( S卩,N-元)。秩N的索引操作符采用索引<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);或const element_type&&operator[](index_declarator)const ;其中indetdeclarator (索引_聲明符)采用以下至少一種形式const index<rank>&idx ;const index<rank>idx ;index<r£ink>&idx ;index<rank>idx。在其他實施例中,操作符可以是函數(shù)、函子或更一般的表示??伤饕愋偷男螤钍菫槠涠x以上下標操作符中的一個的indeX<rank>(索引〈秩 >)的集合??伤饕愋鸵话憔哂卸嗝骟w的形狀,-即可索引類型可由有限數(shù)量的由坐標軸的線性函數(shù)組成的半空間的交點來代數(shù)地表示。代碼10包括來自高層通用或數(shù)據(jù)平行編程語言的一系列指令,所述指令可被編譯為由一個或多個DP最優(yōu)計算節(jié)點(例如,圖4所示并且在以下更加詳細描述的DP最優(yōu)計算節(jié)點121)執(zhí)行的一個或多個可執(zhí)行文件(例如,DP可執(zhí)行文件138)。代碼10被配置成用于在一個或多個數(shù)據(jù)平行(DP)最優(yōu)計算節(jié)點(諸如圖4所示并且在以下更為詳細描述的DP最優(yōu)計算節(jié)點121)上進行最優(yōu)執(zhí)行。 在一個實施例中,代碼10包括來自具有數(shù)據(jù)平行擴展的高層通用編程語言(此后記為GP語言)的一系列指令,所述指令形成存儲在一組一個或多個模塊中的程序。GP語言可允許程序被寫入不同的部分(即,模塊)中,從而每個模塊可被存儲在計算機系統(tǒng)可訪問的單獨的文件或位置中。GP語言為對計算環(huán)境進行編程提供單一語言,該計算環(huán)境包括一個或多個通用處理器以及一個或多個專用DP最優(yōu)計算節(jié)點。DP最優(yōu)計算節(jié)點一般是圖形處理單元(GPU)或通用處理器的SIMD單元,但是還可包括通用處理器的標量或矢量執(zhí)行單元、現(xiàn)場可編程門陣列(FPGA)、或者某些計算環(huán)境中其他合適的設(shè)備。使用GP語言,程序員可將通用處理器和DP源代碼兩者包括在代碼10中以分別用于由通用處理器和DP計算節(jié)點執(zhí)行,并且協(xié)調(diào)通用處理器和DP源代碼的執(zhí)行。在這一實施例中,代碼10可表示任意合適類型的代碼,諸如應(yīng)用程序、庫函數(shù)、或者操作系統(tǒng)服務(wù)。 可通過擴展諸如C或C++等廣泛適應(yīng)、高層以及通用的編程語言來形成GP語言以包括數(shù)據(jù)平行特征。其中DP特征可展現(xiàn)的通用語言的其他示例包括Java 、PHP、Visual Basic、Perl,Python 、C#、Ruby、Delphi、Fortran、VB、F#、OCaml、Haskell、Erlang、NESLΛ Chapel以及Jav必cript 。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語言,程序員生成用于在DP最優(yōu)計算節(jié)點上執(zhí)行的代碼10中的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、DAPPLE或者APL。在這一實施例中,代碼10可表示任意合適類型的DP源代碼,諸如應(yīng)用程序、庫函數(shù)、或者操作系統(tǒng)服務(wù)。代碼10包括指定用于在DP最優(yōu)計算節(jié)點上執(zhí)行的代碼部分。在用GP語言編寫代碼10的圖1的實施例中,GP語言允許程序員在定義矢量函數(shù)時使用注釋(例如,— declspec (vector_func) ···)來指定DP源代碼。該注釋與用于在DP最優(yōu)計算節(jié)點上執(zhí)行的矢量函數(shù)的函數(shù)名(例如,vector_func)相關(guān)聯(lián)。代碼10包括具有DP算法M的調(diào)用 22的調(diào)用站點20(例如,對于所有(forall)、縮小、掃描、或分類)。對應(yīng)于調(diào)用站點的矢量函數(shù)被稱為內(nèi)核或者內(nèi)核函數(shù)。內(nèi)核或者內(nèi)核函數(shù)可調(diào)用代碼10中其他矢量函數(shù)(即,其他DP源代碼),并且可被視為矢量函數(shù)調(diào)用圖的根。內(nèi)核函數(shù)還可使用由代碼10定義的類型(例如,類或結(jié)構(gòu))。這些類型可以被或者可以不被注釋為DP源代碼。在其他實施例中,其他合適的編程語言構(gòu)造可用于將代碼10的部分指定為DP源代碼和/或通用處理器代碼。此外,可在用DP語言編寫代碼10的實施例中省略注釋。調(diào)用站點20還包括一組輸入和輸出自變量沈,該組自變數(shù)包括一個或多個映射變換12。如圖2所示,在被編譯和執(zhí)行時,映射變換12采用DP算法14并且將一組一個或多個輸入可索引類型32作為自變量,如箭頭16所指示的將DP算法應(yīng)用于該組輸入可索引類型32以生成輸出可索引類型34,并且如箭頭18所指示的返回輸出可索引類型34。在一些實施例中,輸出可索引類型34可以與輸入可索引類型32相同。通過將映射變換12包括在調(diào)用站點20的該組自變量沈中,映射12允許DP算法14以及其他DP算法(未示出) 與DP算法M融合。通過融合DP算法14和24,DP算法14和M被組合以形成可在DP最優(yōu)計算設(shè)備上作為來自調(diào)用站點20的單個函數(shù)或內(nèi)核調(diào)用而執(zhí)行的單個算法。組合的算法可利用增強的空間和時間的數(shù)據(jù)局部性來提高性能。映射12可用任意合適的方式表達。例如,映射12的通用形式可表達為map (elementary_function) (IT1,…,ITN)其中elementary_function(基本的_函數(shù))是在一組輸入可索引類型IT1到ITn 上操作的內(nèi)核函數(shù)(例如,DP算法14)名,其中N是大于或等于1的整數(shù)(例如,圖2所示的輸入可索引類型32)。從該組輸入可索引類型,映射變換12返回輸出可索引類型(例如, 圖2所示的輸出可索引類型34)?,F(xiàn)在將描述通用形式的映射變換12的附加細節(jié)。令element_typei,. . . ,element, typen(元素_類型1...元素_類型η)是η數(shù)據(jù)平行(DP)標量類型,其中DP標量類型在一個實施例中為在C++P0D結(jié)構(gòu)操作(比較文檔N3126的9. 0. 9部分)下的基本C++類型的傳遞閉包(比較:C++0x工作標準草案-文檔N3126 :http://www. open-std. org/JTCl/ SC22/WG21/docs/papers/2010/n3126. pdf 的 3. 9. 1 部分)。但是,更一般的數(shù)據(jù)類型并沒有被排除,并且可用于其他實施例中。這些η個類型還是η個可索引類型indexable typei; ... , indexablejypA(可索引_類型1...可索引_類型η)的元素類型。換句話說,Indexable^ype1 element_type, . . . , indexab 1 e_typen: : element_type 與 element_ typei,.. .,elementjypK相同。假設(shè)這些可索引類型都具有相同的秩N。(記號indexable typq可以指類型或者可以指對應(yīng)類型的實例,但是用法在上下文中是不含糊的。)考慮函數(shù)return_type elementary_function (element^ype^Arg!,…,element_typen_ Argn).映射 12 的通用形式提升 elementary_function 以對 IndexableJype1,..., indexable_typen的實例起作用,以形成秩為N的可索引類型。新的可索引類型變?yōu)閙ap (elementary_function) (indexable—type” . . . , indexab 1 e_typen)其中索引操作符采用以下形式。
ret—type operator口 (const <index<N>& _Index) {
returnelementary_function(indexable_typeiLIn<iex],·.·,
indexable_typen[_Index]); }對于給定的秩N,返回DP標量類型的DP標量類型的函數(shù)elementary_function可以被提升以對秩為N的可索引類型起作用,該可索引類型的元素類型是形成elementary,function的自變量的DP標量類型。elementary_function的提升形成秩為N的可索引類型,該可索引類型的元素類型與elementary_fUnction的返回類型相同。提升的動作是通過以上的索引操作符?,F(xiàn)在將參考一個實施例描述提升的實現(xiàn)。在這一實施例中,map(elementary_ function)倉丨J 建 map_abstract一type 類的實例。map—abstract_type 類有具有與 elementary—function相同數(shù)量的自變量的函數(shù)調(diào)用操作符。如果可索引類型具有與 elementary_function的對應(yīng)自變量相同的元素類型并且可索引類型都具有相同的秩,則函數(shù)調(diào)用操作符的自變量是允許任意可索引類型被傳遞進來的抽象模板參數(shù)類型。函數(shù)調(diào)用操作符的返回類型是可索引類型map_type。使用C++0x可變參量模板,map_abstract_ type的實現(xiàn)采用以下形式。
template〈typename _Kernel_type> class map_abstract_type { public:
//
//簡單構(gòu)造函數(shù) //
map_abstract_type(_Kernel_type_Kernel) : m_kernel(_Kernel) {}
//
//需要有關(guān)C++中可變參量模板的更多信息。 Il
// http://en.wikipedia.org/wiki/Variadic_Templates
// http://www.generic-programming.org/~dgregor/cpp/variadic-templates.pdfCN 102541612 A
6/22 頁
// http://www.open-std.org/JTC 1/SC22/WG2 l/docs/papers/2010/n3126.pdf
//
//這是映射-工廠操作符。 //
template <typename... _Kernel_argument_types>
map_type<_Kernel_type, _Kernel_argument_types...> operator() (_Kernel_argument_types... _Args)
{
return map_type<—Kernel—type, _Kernel_argument_types.. .>(m_kernel,
_Args...); }
private:
—Kernel—type m—kernel;
};以下工廠方法映射用于創(chuàng)建map_abstract_type的實例。
//
//映射工廠 Il
template〈typename _Kernel_type> map—abstract_type<add> map(_Kernel_type Kernel) { return map_abstract_type<_Kernel_type>(_Kernel);
}換句i舌說,map (elementary—function) (Indexable^ype1, · · ·,indexable_typen) : map—type 的[歹[J。 H一(elementary—function) /^t map—abstract—type 的實例,并且第二組自變量(Indexable^ype1,…,indexable_typen)調(diào)用 map_abstract_ type的函數(shù)調(diào)用操作符。該函數(shù)調(diào)用操作符返回與第一和第二組自變量兩者對應(yīng)的map_ type的實例。在map_type的實現(xiàn)中,通過如下的可變參量模板元編程,確定可索引類型的通用秩 ‘rank(秩)’,并且然后確定 elementary_function 的返回類型 _Return—type。static const int rank = get_rank<_Kernel_argument_types. . . >::rank ;typedef decltype(declval<_Kernel_type>()(declval<_Kernel_argument_types>()::element_type. ..))Ret_type ;
通過使用decltype來確定typedef_Ret_type以實現(xiàn)Kernel_type類型的部分實例的部分調(diào)用,_Kernel_type類型具有通過創(chuàng)建由模板參數(shù)包Kernelargumentjypes形成的可索引類型的elementjypes的部分實例形成的自變量列表。此外,get_rank從參數(shù)包Jfernel_argument_types中解包出第一模板自變量,并且返回生成的可索引類型的秩。 declval<T>()還創(chuàng)建適合于decltype類型推演中部分求值的T的部分實例。在將 map(elementary_function)應(yīng)用于可索弓I 類型實例中,map (elementary_ function) (indexable—type^ . . . , indexable_typen)是 map—type 構(gòu)造者i周用。自變量歹ll 表(Indexable^ype1,…,indexable_typen)是被轉(zhuǎn)化為 C++ 兀'std: tuple m_args,的函數(shù)參數(shù)包,以便于被存儲為map_type的成員。通過使用標準C++0x技術(shù)將m_args轉(zhuǎn)化為參數(shù)包(為了說明的簡便仍命名為m_args)來實現(xiàn)map_type的索引操作符。然后,在輸入自變量‘const index<rank>&Jndex’處將參數(shù)包的每一元素求值到索引操作符,產(chǎn)生類型 Glement^ype1,…,element_typen 的參數(shù)包。然后由 elementary_function 求值并且返回參數(shù)包。在map_type的實現(xiàn)的符號中,索引操作符返回如下。return m—kernel(m_args[_Index]...);在一個實施例中,完整的實現(xiàn)采用以下形式。
template〈typename _Kernel_type, typename... _Kernel_argument_types>
class map_type { public:
Il
//通過使用decltype來確定typedef_Ret_type以實現(xiàn)_Kemel_type的部分調(diào)用,_Kemel_type類型具有通過創(chuàng)建由參數(shù)包_Kemel_argument_types形成的可索引類型的element—types的部分實例形成的自變量列表。
//
//get_rank通過從參數(shù)包_Kernel_argument_types中解包出第一模板自變
量,并且返回生成的可索引類型的秩來工作。 Il
//declval<T>()通過創(chuàng)建適合于decltype類型推演中部分求值的T的部分
實例來工作。 //
static const int rank = get_rank<_Kernel_argument_types.. .>: :rank; typedef
decltype( declval<_Kernel_type>()( declval<_Kernel_argument_types>()::element_ type...)) _Ret_type;
//
//從map_abstract_type調(diào)用的構(gòu)造函數(shù)
//填充m—args—無法存儲函數(shù)參數(shù)包,因此用參數(shù)包初始化元
//
map_type(_Kernel_type Kernel, const _Kernel_argument_types&…—Args) :m_kernel(_Kernel), m_args(_Args...)
Il
//基本索引操作符(實際上有更多像這樣的操作符) //
一Ret—type operator[] (const index<rank>& Index) {Il
//由m—args元創(chuàng)建參數(shù)包,并且求值每一實例
//在[_Index]處的參數(shù)包中
Il 'return m_kernel(m_args [_Index]...);'
//
return tuple_proxy<_Ret_type>(m_kernel, Index, m_args);
private:
std: :tuple<_Kernel_argument_types.. ·> m—args; _Kernel_type m kernel;
};返回的映射變換的可索引類型可當作如圖3A所示的調(diào)用站點內(nèi)核(例如,DP算法24)的自變量沈,如圖:3B所示的調(diào)用站點內(nèi)核的輸出可索引類型,或者如圖3C所示的調(diào)用站點20中其他映射函數(shù)12’的自變量。如圖3A所示,映射變換12的輸出可索引類型34可用作DP算法M的輸入索引類型以及在調(diào)用站點20中被指定為自變量沈的一組零個或更多個其他輸入可索引類型40。 為了這樣做,調(diào)用站點20將該組輸入可索引類型32上的映射變換12指定為自變量26。DP 算法M由輸出可索引類型34和輸入可索引類型40生成輸出可索引類型42,并且返回輸出可索引類型42。每個輸入可索引類型32在被提供給映射變換12之前可經(jīng)歷一個或多個其他映射變換(未示出),每個輸入可索引類型40在被提供給DP算法M之前也可經(jīng)歷一個或多個其他映射變換(未示出),并且輸出可索引類型42在被DP算法M返回之前可經(jīng)歷一個或多個其他映射變換(未示出)。如圖;3B所示,由DP算法M從一組輸入可索引類型50生成的輸出可索引類型52 可用作映射變換12的一組輸入可索引類型32中的一個。為了這樣做,調(diào)用站點20在包括 DP算法M的輸出可索引類型52的該組輸入可索引類型32上指定映射變換12。DP算法 14由包括輸出可索引類型52的該組輸入可索引類型32生成輸出可索引類型34,并且返回輸出可索引類型34。每個輸入可索引類型50在被提供給DP算法M之前可經(jīng)歷一個或多個其他映射變換(未示出),每個輸入可索引類型32 (包括可索引類型5 在被提供給映射變換12之前也可經(jīng)歷一個或多個其他映射變換(未示出),并且輸出可索引類型34在被映射變換12返回之前可經(jīng)歷一個或多個其他映射變換(未示出)。圖3C示出在映射變換12的輸出可索引類型34上映射變換12’的使用。特別地, 映射變換12的輸出可索引類型34可用作映射變換12’的一組一個或多個輸入可索引類型 32’中的一個,以生成輸出可索引類型34’。更為一般地,圖3C示出可將多個映射變換12 應(yīng)用于調(diào)用站點20中每一個自變量沈的一組或多組輸入可索引類型32.現(xiàn)在將用若干示例示出映射變換12。在第一個示例中,為求值A(chǔ)* (sin (B) +exp (_C)而定義以下代碼部分,其中A、B和C是可索引類型。
field<2, double〉A(chǔ), B, C;
//
//調(diào)用站點內(nèi)核 //
auto _mxm = [=](const index<2>& idx, double& c, const field<2, double〉& argl, const field<2, double>& arg2)->void{
for (int k = 0; k < argl.get_extent(l); ++k) c += argl(idx
, k) * arg2(k, idx[l]);
};
Il
//映射內(nèi)核 //
auto add = [=](double x, double y)->double{ return χ + y;
auto uminus 二 [=] (double x)->double{ return -x;
};
auto _sin = [^(double x)->double{ return sin(x);
};
auto _exp = [=] (double x)->double{ return exp(x);用以上注指出的通用形式來使用映射變換12 -C 可被表達為 map (_uminus) (C);exp (-C)可被表達為 map (_exp) (map (_uminus) (C));sin(B)可被表達為map(_Sin)⑶;并且,因此,
sin(B)+exp(_C)可被表達為map (_add) (map (_sin) (B),map (_exp) (map (_uminus) (C))因此,以下調(diào)用站點可使用映射變換以融合由_uminuS、_eXp、_Sin*_add定義的內(nèi)核來計算 A* (sin (B) +exp (_C)。forall (A. get_extent (), _mxm, D, A, map (_add) (map (_sin) (B),map (_exp) (map (_uminus) (C))));作為另一示例,可定義以下矩陣乘法內(nèi)核。
void mxm(index<2>& idx, float& c, read_only_range<field<2, float & A, read_only_range<field<2, float & B) { int max = A.get_extent( 1); for (int k = 0; k < max; ++k)
c += A(idx
, k) * B(k, idx[l]);
}
void add(float& c,float a, float b) { c = a + b;
}為了計算D = (A+B)*C,可定義以下映射變換12以形成第一矩陣加法內(nèi)核。struct morph—input public field<2, float> {
//構(gòu)造函數(shù)
morph_input(const field<2, float〉& —Parent,const field<2, float>& _Sum) :field<2, float>(_Parent), m_sum(_Sum) {
//
//索弓I ops
//
const float operator[] (const index<2>& _Index) const { return m_sum[_Index] + base[ Index ];
private:
float<2, float> m_sum;
};使用這一映射變換12以及以上矩陣乘法內(nèi)核,以下調(diào)用站點可用于通過將矩陣乘法內(nèi)核與由映射變換12定義的第一矩陣加法內(nèi)核融合來計算D = (A+B)*C。forall (D. get_grid(),mxm,D,morph_input (A, B),C);為了計算D = A*B+C,可定義以下映射變換12以形成第二矩陣加法內(nèi)核。
/struct morph output public field<2, float〉{
//構(gòu)造函數(shù)
morph_output(const field<2, float>& _Parent, const field<2, float〉& _Sum) :field<2, float>(_Parent), m_sum(^Sum) {
Il
//索引ops
//
void set_value(const index<2>& —Index,float _Value) {
field<2, float〉& base = *static—cast<field<2, float>*> (this); base[ Index ] = _Value + m sum[ Index];
}
float& get_value(const index<2>& _Index) {
field<2, float〉& base = *static_cast<field<2, float〉*〉(this); return base[ Index ];
}
—declspec(property(get=get_value, put=set_value)) float _value[];
//
//當 operator[]被用作 rvalue 時,調(diào)用 get—value。
//當 operator[]被用作 lvalue 時’調(diào)用 set_value。
Ilfloat& operator[] (const index<2>& _Index) { return value[ Index ];
private:
float<2, float〉 m sum;
};使用這一映射變換12以及以上矩陣乘法內(nèi)核,以下調(diào)用站點可用于通過將矩陣乘法內(nèi)核與由映射變換12定義的第二矩陣加法內(nèi)核融合來計算D = A*B+C。forall (D. get_grid(), mxm, morph_output (D, C), A, B);在以上示例中,morph_input的索引操作符const float operator[](const index<2>&_Index)const ;返按值返回。反之,morph_output的索引操作符float&operator[] (const index<2>&_Index);按參考返回(S卩,按lvalue參考返回)。當由映射變換提升的內(nèi)核的輸出類型(即,morphjnput或m0rph_0utput)按 Ι-value參考返回時,內(nèi)核的索引操作符可以按I-value參考返回。類似地,當由映射變換提升的內(nèi)核的輸出類型按r-value參考返回時,內(nèi)核的索引操作符可以按r-value參考返回。同樣地,當由映射變換提升的內(nèi)核的輸出類型按值返回時,內(nèi)核的索引操作符可以按值返回。使用模板元編程技術(shù),特別地有SFINAE以及CRTP,分析提升內(nèi)核的返回特征,并且適當?shù)馗淖兲峁┧鞴璉操作符的實現(xiàn)的基本類。更為一般地,假設(shè)被封裝的操作是函數(shù)element_type_transformation(const index<rank>&idx,element_type_Value).從而,輸入映射變換12(m0rph_input)的封裝可索引類型如下template <typename _Parent_type, typename —Transformer〉 class byvalue_morph—input: public Parent type { public:
static const int rank = _Parent_type: :rank;
typedef typename _Parent_type: :element_type element—type;
typedef typename Parent type Base;
//
//通信操作符ctor //
byvalue_morph_input(const _Parent_type& —Parent, const Transformer& _transformer)
:m_transformer(_transformer), _Base(_Parent) {
}
Il
//限制操作符ctor,用于對可索引類型進行平鋪或分子集 //
template〈typename _Other_parent_type>
byvalue_morph_input(const grid<rank>& —Grid, const _Other_parent—type& —Parent)
:m_transformer(_Parent.m_transformer), _Base(_Parent) {
//
//索引ops
■ Ilconst element—type operator[] (const index<rank>& 一Index) const { return m_transformer(_Index, base[ —Index ]);
}
private:
_Trans former m_trans former;
};對于輸入映射變換12(m0rph_input),封裝可索引類型如下
template <typename _Parent_type, typename —Transformer〉 class byvalue morph output: public _Parent_type { public:
static const int rank - Parent type: :rank;
typedef typename _Parent_type: :element_type element_type;
typedeftypename _Parent_type Base;
//
//通信操作符ctor
//
byvalue_morph_output(const _Parent_type& —Parent, const _Transformer& —transformer)
:m_transformer(_transformer), _Base(_Parent) {
}
Il
//限制操作符ctor,用于對可索引類型進行平鋪或分子集 //
template〈typename _Other_parent_type>
byvalue_morph_output(const grid<rank>& _Grid, const_Other_parent_type& _Parent)m_transformer(_Parent.m_transformer), _Base(_Parent) {
//
//索弓I Ops
//
void set_value(const index<rank>& 一Index, const element_type& _Value){ —Parent_type& base = *static_cast<_Parent_type*> (this); base[ Index ] = m_transformer(_Index, —Value);
}
element_type get_value(const index<rank>& —Index) {
_Parent_type& base = *static_cast<_Parent_type*> (this); return base[ Index ];
}
_declspec(property(get=get_value, put=set_value)) element_type _value[];
element—type operator[] (const index<rank>& _Index) { return _value[ _Index ];
private:
—Transformer m_transformer;
};用以上的封裝可索引類型,D = (A+B)*C的實現(xiàn)采用以下形式。
template〈typename _Parent_type, typename —Transformer〉byvalue_morph_input <_Parent—type, —Transformer〉 map(const —Parent—type& —Parent, —Transformer transformer) {
return byvaluemorphinput <_Parent_type, Transformer>(_Parent,
—transformer); }
auto lambda in = [=](const index<2>& idx, float fin)->float{ return (B [idx] + fin);
};
forall(D.get_grid(), mxm, D5 map(A, lambda_in), C);釆用這一實現(xiàn)形式,被映射的內(nèi)核是auto lambda—in = [ = ] (const index<2>&idx, float fin) ->fIoat {return (B [idx]+fin) ;},這是以下基本內(nèi)核的變換,其中變換的目的是在lambda表達式中獲取‘B’。auto_add = [ = ] (float in 1, float in2)->float{return inl+in2 ;}同樣地,D = A*B+C的實現(xiàn)采用以下形式。
template <typename 一Parent—type, typename ^Transformer〉 byvalue_morph—output <_Parent_type, Transformed map_output(const _Parent_type& —Parent, —Transformer —transformer) {
return byvalue_morph_output <_Parent_type, _Transformer>(_Parent,
_transformer); }
auto lambda out = [=](const index<2>& idx,float fin)->float{ return (C[idx] + fin);
forall(D.get_grid(), mxm, morph_output(D, lambda_out), A, B); 釆用這一實現(xiàn)形式,被映射的內(nèi)核是auto lambda_out =[=](constindex<2>&idx, float fin) ->fIoat {return (C[idx] +fin) ;},這是以下基本內(nèi)核的變換,其中變換的目的是在lambda表達式中獲取‘C’。auto_add = [ = ](float in 1, float in2)->float{return inl+in2 ;以上示例中的lambda表達式通過獲取所有已參考的數(shù)據(jù)來工作。因此,lambda_ in獲取B并且lambda_0ut獲取C。在其他實施例中,只要B或C的獲取是明確的,也可使用具有函數(shù)調(diào)用操作符的類。其主要目的是展示函數(shù)調(diào)用操作符的類被稱為函子。C++0x lambda表達式的實現(xiàn)是通過編譯器生成的函子類。由于性能的原因,morphjnput可索引類型類的索引操作符將按lvalue參考最優(yōu)地返回。但是這是以輸入函子按lvalue參考返回為條件的。下一個最優(yōu)的情況為按rvalue 參考返回,這同樣是以輸入函子按rvalue參考返回為條件的。最后,如果輸入函子按值返回,則morph輸入偽字段類按值返回。通過形成以下類自動地啟用這一功能。template<typename_Parent_type, typename_Transformer>class morph—input :public Conditional—Base{··· };其中 Conditional_Base 是以下之一lvalue_morph_inputrvalue_morph_inputbyvalue_morph_input取決于morphjnput專用的lambda表達式的返回類型。圖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使用一組互連114通信,該組互連包括任意合適類型、數(shù)量以及配置的控制器、 總線、接口、和/或其他有線或無線連接。計算機系統(tǒng)100表示被配置為通用或者專用的任意合適的處理設(shè)備。計算機系統(tǒng) 100的示例包括服務(wù)器、個人計算機、膝上型計算機、平板計算機、智能電話、個人數(shù)字助理 (PDA)、移動電話、和音頻/視頻設(shè)備。計算機系統(tǒng)100的組件(S卩,主機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è)備120 和/或計算引擎120處接收的信息來執(zhí)行指令。主機101啟動和執(zhí)行OS 132。OS 132包括處理元素可執(zhí)行以管理計算機系統(tǒng)100 的組件的指令,并且提供允許程序訪問和使用各組件的一組函數(shù)。在一個實施例中,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到每個包括一個或多個DP可執(zhí)行文件138,或者可生成一個或多個DP可執(zhí)行文件138而不生成任何GP可執(zhí)行文件136。 響應(yīng)于用數(shù)據(jù)平行擴展調(diào)用編譯器134以編譯所有或者選定部分的代碼10,生成GP可執(zhí)行文件136和/或DP可執(zhí)行文件138。調(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最優(yōu)計算節(jié)點121上執(zhí)行之前使用設(shè)備驅(qū)動器(未示出)轉(zhuǎn)換為來自DP最優(yōu)計算節(jié)點121的指令集的低層指令的DP字節(jié)代碼或者若干其他中間表示(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í)行可執(zhí)行文件136,并且計算機系統(tǒng)100可使用一個或多個PE 122來執(zhí)行DP可執(zhí)行文件138。存儲器系統(tǒng)104包括任意合適類型、數(shù)量以及配置的被配置為存儲指令和數(shù)據(jù)的易失性或非易失性存儲設(shè)備。存儲器系統(tǒng)104的存儲設(shè)備表示存儲包括OS 132、代碼10、 編譯器134、GP可執(zhí)行文件136以及DP可執(zhí)行文件138的計算機可執(zhí)行指令(即,軟件) 的計算機可讀存儲介質(zhì)。指令可由計算機系統(tǒng)100執(zhí)行以執(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向處理元素102、輸入/輸出設(shè)備 106、顯示設(shè)備108、外圍設(shè)備110、網(wǎng)絡(luò)設(shè)備112以及計算引擎120提供存儲的指令和數(shù)據(jù)。 存儲器系統(tǒng)104中的存儲設(shè)備的示例包括硬盤驅(qū)動器、隨機存取存儲器(RAM)、只讀存儲器 (ROM)、快閃式存儲器驅(qū)動器及卡、以及諸如CD和DVD等的磁盤和光盤。
輸入/輸出設(shè)備106包括任意合適類型、數(shù)量以及配置的被配置為由用戶輸入指令或數(shù)據(jù)至計算機系統(tǒng)100并且由計算機系統(tǒng)100輸出指令或數(shù)據(jù)至用戶的輸入/輸出設(shè)備。輸入/輸出設(shè)備106的示例包括鍵盤、鼠標、觸摸板、觸摸屏、按鍵、撥號盤、旋鈕和開關(guān)。顯示設(shè)備108包括任意合適類型、數(shù)量以及配置的被配置為將文本和/或圖形信息輸出至計算機系統(tǒng)100的用戶的顯示設(shè)備。顯示設(shè)備108的示例包括監(jiān)視器、顯示屏以及投影儀。外圍設(shè)備110包括任意合適類型、數(shù)量以及配置的被配置為用計算機系統(tǒng)100中的一個或多個其他組件操作以執(zhí)行一般或指定處理功能的外圍設(shè)備。網(wǎng)絡(luò)設(shè)備112包括任意合適類型、數(shù)量以及配置的被配置為允許計算機系統(tǒng)100 跨一個或多個網(wǎng)絡(luò)(未示出)通信的網(wǎng)絡(luò)設(shè)備。網(wǎng)絡(luò)設(shè)備112可根據(jù)任意合適的聯(lián)網(wǎng)協(xié)議和/或配置來操作,以允許信息由計算機系統(tǒng)100傳送到網(wǎng)絡(luò)或者由計算機系統(tǒng)100通過網(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并且存儲由存儲器IM中的DP可執(zhí)行文件138生成的結(jié)果。特別地, PE 122執(zhí)行DP可執(zhí)行文件138以將映射變換12應(yīng)用于一組輸入可索引類型32,以生成如圖4所示并且在以下更加詳細描述的一組輸出可索引類型34。具有有被優(yōu)化以用于數(shù)據(jù)平行計算(即,DP程序或算法的執(zhí)行)的硬件體系結(jié)構(gòu)的一個或多個計算資源的計算節(jié)點121被稱為DP最優(yōu)計算節(jié)點121。DP最優(yōu)計算節(jié)點121 的示例包括其中該組PE 122包括一個或多個GPU的節(jié)點121以及其中該組PE 122包括通用處理器包中的一組SIMD單元的節(jié)點121。不具有有被優(yōu)化以用于數(shù)據(jù)平行計算的硬件體系結(jié)構(gòu)的任何計算資源的計算節(jié)點121(例如,僅有通用處理元素102的處理器包)被稱為非DP最優(yōu)計算節(jié)點121。在每個計算節(jié)點121中,存儲器IM可與存儲器系統(tǒng)104分離 (例如,由GPU使用的GPU存儲器),或者可是存儲器系統(tǒng)104的一部分(例如,由通用處理器包中的SIMD單元使用的存儲器)。主機101形成被配置為向計算節(jié)點121提供用于執(zhí)行的DP可執(zhí)行文件138并且使用互連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)用站點以導(dǎo)致DP可執(zhí)行文件138被 DP最優(yōu)或非DP最優(yōu)計算節(jié)點121執(zhí)行。在其中存儲器IM與存儲器系統(tǒng)104分離的實施例中,主存計算節(jié)點導(dǎo)致DP可執(zhí)行文件138以及一個或多個可索引類型14從存儲器系統(tǒng) 104被復(fù)制到存儲器124。在其中存儲器系統(tǒng)104包括存儲器IM的實施例中,主存計算節(jié)點可將存儲器系統(tǒng)104中的DP可執(zhí)行文件138和/或一個或多個可索引類型14的副本指定為存儲器124,和/或可將DP可執(zhí)行文件138和/或一個或多個可索引類型14從存儲器系統(tǒng)104的一部分復(fù)制到形成存儲器124的存儲器系統(tǒng)104的另一部分。除非被指定為異步的,在計算節(jié)點121以及主存計算節(jié)點之間的復(fù)制過程可以是同步點。
主存計算節(jié)點和每個計算節(jié)點121可同時地互相獨立地執(zhí)行代碼。主存計算節(jié)點和每個計算節(jié)點121可在同步點交互以協(xié)作節(jié)點計算。在一個實施例中,計算引擎120表示其中一個或多個圖形處理單元(GPU)包括PE 122以及與存儲器系統(tǒng)104分離的存儲器124的圖形卡。在這一實施例中,圖形卡(未示出)的驅(qū)動可將字節(jié)代碼或者DP可執(zhí)行文件138的若干其他中間表示(IL)轉(zhuǎn)化為用于由 GPU的PE 122執(zhí)行的GPU的指令集。在另一實施例中,由被包括在處理器包中的具有一個或多個通用處理元素102的一個或多個GPU (即,PE 122)與包括存儲器124的存儲器系統(tǒng)104的一部分的組合形成計算引擎120。在這一實施例中,可在計算機系統(tǒng)100上提供附加的軟件以將字節(jié)代碼或者 DP可執(zhí)行文件138的若干其他中間表示(IL)轉(zhuǎn)化為處理器包中GPU的指令集。在進一步的實施例中,由包括處理元素102的一個或多個處理器包中的一個或多個SIMD單元與包括存儲器IM的存儲器系統(tǒng)104的一部分的組合形成計算引擎120。在這一實施例中,可在計算機系統(tǒng)100上提供附加的軟件以將字節(jié)代碼或者DP可執(zhí)行文件138 的若干其他中間表示(IL)轉(zhuǎn)化為處理器包中SIMD單元的指令集。在又一實施例中,由包括處理元素102的一個或多個處理器包中的一個或多個標量或矢量處理管道與包括存儲器1 的存儲器系統(tǒng)104的一部分的組合形成計算引擎120。 在這一實施例中,可在計算機系統(tǒng)100上提供附加的軟件以將字節(jié)代碼或者DP可執(zhí)行文件 138的若干其他中間表示(IL)轉(zhuǎn)化為處理器包中標量處理管道的指令集。盡管此處已經(jīng)示出和描述了特定的實施例,但是本領(lǐng)域的技術(shù)人員將明白可為示出和描述的特定實施例替換各種替代和/或等效實現(xiàn),而不背離本發(fā)明的范圍。本申請旨在涵蓋對此處討論的特定實施例的任何改編或變種。因此,本發(fā)明旨在僅由權(quán)利要求書以及其同等物限制。
權(quán)利要求
1.一種存儲在由計算機系統(tǒng)編譯和執(zhí)行時,執(zhí)行一種方法的計算機可執(zhí)行指令的計算機可讀存儲介質(zhì),所述方法包括響應(yīng)于第一映射變換(1 將第一數(shù)據(jù)平行算法(14)應(yīng)用(16)于第一組輸入可索引類型(3 以生成(18)第一輸出可索引類型(34),所述第一映射變換被包括為被配置成在一個或多個數(shù)據(jù)平行計算節(jié)點(121)上執(zhí)行的數(shù)據(jù)平行源代碼(10)中調(diào)用站點00)的自變量06);以及將由調(diào)用站點指定的第二數(shù)據(jù)平行算法04)應(yīng)用于第一輸出可索引類型以生成第二輸出可索引類型(42) 0
2.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述方法還包括將第二數(shù)據(jù)平行算法應(yīng)用于第一輸出可索引類型以及第二組輸入可索引類型,以生成第二輸出可索引類型。
3.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述方法還包括響應(yīng)于被包括為調(diào)用站點中的自變量的第二映射變換,將第三數(shù)據(jù)平行算法應(yīng)用于第二組輸入可索引類型,以生成第一組輸入可索引類型中的一個。
4.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述第一組輸入可索引類型中的每一個都包括對應(yīng)的秩以及對應(yīng)的元素類型。
5.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述第一映射變換使用按 Ι-value參考、按r-value參考或者按值中的一個來返回輸出可索引類型。
6.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述數(shù)據(jù)平行源代碼用具有數(shù)據(jù)平行擴展的高層通用編程語言編寫。
7.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述數(shù)據(jù)平行源代碼用高層數(shù)據(jù)平行編程語言編寫。
8.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述一個或多個數(shù)據(jù)平行計算節(jié)點包括至少一個圖形處理單元。
9.如權(quán)利要求1所述的計算機可讀存儲介質(zhì),其特征在于,所述一個或多個數(shù)據(jù)平行計算節(jié)點包括至少一個通用處理器。
10.一種由計算機系統(tǒng)(100)中的編譯器(134)執(zhí)行的方法,所述方法包括標識數(shù)據(jù)平行源代碼(10)中被配置為用于在一個或多個數(shù)據(jù)平行計算節(jié)點(121)上執(zhí)行的第一映射變換(12);以及通過數(shù)據(jù)平行源代碼生成數(shù)據(jù)平行可執(zhí)行代碼(138),從而數(shù)據(jù)平行可執(zhí)行代碼通過將第一數(shù)據(jù)平行算法(14)應(yīng)用于第一組一個或多個輸入可索引類型(3 來實現(xiàn)第一映射變換以生成第一輸出可索引類型(34)。
11.如權(quán)利要求10所述的方法,其特征在于,還包括標識數(shù)據(jù)平行源代碼中的第二映射變換;以及通過數(shù)據(jù)平行源代碼生成數(shù)據(jù)平行可執(zhí)行代碼,從而數(shù)據(jù)平行可執(zhí)行代碼通過將第二數(shù)據(jù)平行算法應(yīng)用于包括第一輸出可索引類型的第二組的一個或多個輸入可索引類型來實現(xiàn)第二映射變換以生成第二輸出可索引類型。
12.如權(quán)利要求10所述的方法,其特征在于,還包括標識數(shù)據(jù)平行源代碼中調(diào)用站點中的第一映射變換。CN 102541612 A
13.如權(quán)利要求12所述的方法,其特征在于,所述第一映射變換是調(diào)用站點中的自變量。
14.如權(quán)利要求12所述的方法,其特征在于,所述調(diào)用站點調(diào)用第二數(shù)據(jù)平行算法。
15.如權(quán)利要求10所述的方法,其特征在于,所述數(shù)據(jù)平行源代碼用具有數(shù)據(jù)平行擴展的高層通用編程語言編寫。
全文摘要
本發(fā)明涉及數(shù)據(jù)平行代碼中的映射變換。高層編程語言提供了映射變換(12),該映射變換采用數(shù)據(jù)平行算法(14)并且將一組一個或多個輸入可索引類型(32)作為參量(26)。映射變換將數(shù)據(jù)平行算法應(yīng)用于該組輸入可索引類型,以生成輸出可索引類型,并且返回該輸出可索引類型(34)。映射變換可用于將一個或多個數(shù)據(jù)平行算法(14)與另一數(shù)據(jù)平行算法(24)融合。
文檔編號G06F9/45GK102541612SQ20111038243
公開日2012年7月4日 申請日期2011年11月16日 優(yōu)先權(quán)日2010年11月17日
發(fā)明者P·F·林塞斯, Y·萊瓦諾尼, 朱偉榮 申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1