運(yùn)算控制裝置、運(yùn)算控制方法、存儲(chǔ)有程序的非瞬時(shí)計(jì)算機(jī)可讀介質(zhì)以及OpenCL設(shè)備的制造方法
【專利說明】運(yùn)算控制裝置、運(yùn)算控制方法、存儲(chǔ)有程序的非瞬時(shí)計(jì)算機(jī)可讀介質(zhì)以及OpenCL設(shè)備
[0001]相關(guān)申請(qǐng)的交叉引用
[0002]本申請(qǐng)基于并且要求于2014年2月10日提交的日本專利申請(qǐng)N0.2014-23044的優(yōu)先權(quán)利益,其公開內(nèi)容通過引用整體被包含在此。
技術(shù)領(lǐng)域
[0003]本發(fā)明涉及一種并行處理器,更具體涉及一種OpenCL設(shè)備的運(yùn)算控制技術(shù)。
【背景技術(shù)】
[0004]近來,由于防止處理器過熱的需求,通過增加執(zhí)行并行處理的處理器核(下文簡稱為“核”)的數(shù)量而不是增加處理器的工作頻率來改進(jìn)性能的趨勢已經(jīng)變得很顯著。具有多個(gè)核的處理器被稱為多核處理器,具有大量核的多核處理器尤其被稱為眾核處理器(many-core processor) ο在此說明書中,多核處理器和眾核處理器并不特別彼此區(qū)分,包括執(zhí)行并行處理的多個(gè)核的處理器通常被稱為“并行處理器”。
[0005]并行處理器用在各種領(lǐng)域作為加速器。但是,因?yàn)楦鞣N類型的加速器是各種制造商制造的且處于各種領(lǐng)域并且開發(fā)了用于加速器的進(jìn)一步的各種語言和框架,在加速器之間共享程序代碼較為困難。
[0006]為了解決這一問題,OpenCL(開放計(jì)算語言)被定義為用于并行處理器的標(biāo)準(zhǔn)框架(非專利文獻(xiàn) 1:The OpenCL Specicat1n, Ver: 1.0, Document Revis1n:43, KhronosOpenCL Working Group (2009))。在下面描述了 OpenCL 的概述。
[0007]圖17是在上述非專利文獻(xiàn)I的圖3.1中添加附圖標(biāo)記的圖,其示出了典型OpenCL系統(tǒng)的平臺(tái)模型。
[0008]如圖17中所示,OpenCL系統(tǒng)10包括主機(jī)12和一個(gè)或多個(gè)計(jì)算設(shè)備(下文中被稱為“OpenCL設(shè)備” )14。OpenCL設(shè)備14對(duì)應(yīng)于上述的加速器。
[0009]每個(gè)OpenCL設(shè)備14包括一個(gè)或多個(gè)計(jì)算單元(下文中被縮寫為“⑶”)16,并且每個(gè)⑶16包括一個(gè)或多個(gè)處理元件(下文中被縮寫為“PE”)18。注意:處理元件PE 18對(duì)應(yīng)于上述的核。
[0010]OpenCL應(yīng)用由在主機(jī)12上運(yùn)行的程序代碼和在作為加速器的OpenCL設(shè)備14上運(yùn)行的程序代碼組成。在主機(jī)12上運(yùn)行的程序代碼被稱為“主機(jī)代碼”,并且在OpenCL設(shè)備14上運(yùn)行的程序代碼被稱為“內(nèi)核”。
[0011]主機(jī)12調(diào)用API (應(yīng)用程序接口)并且指示運(yùn)算處理。OpenCL設(shè)備14執(zhí)行所指示的運(yùn)算處理。主機(jī)12生成用于管理資源的環(huán)境并進(jìn)一步生成命令隊(duì)列用于通過OpenCL調(diào)停設(shè)備操作。“設(shè)備操作”包括執(zhí)行運(yùn)算處理、操作存儲(chǔ)器、獲取同步等。
[0012]在OpenCL中,內(nèi)核在N(1彡N彡3)維索引空間中執(zhí)行作為工作項(xiàng)目(其被簡稱為“項(xiàng)目”)。例如,如果(4, 6)被規(guī)定為二維索引空間,總共24(4X6)項(xiàng)目被執(zhí)行。
[0013]為了執(zhí)行一個(gè)項(xiàng)目,使用一個(gè)PE。相應(yīng)地,在并行執(zhí)行的項(xiàng)目的數(shù)目和現(xiàn)有PE的數(shù)目相同的情況下,內(nèi)核在四行乘六列的總共24個(gè)PE上執(zhí)行。
[0014]注意:在現(xiàn)有PE的數(shù)目小于并行執(zhí)行的項(xiàng)目的數(shù)目的情況下,項(xiàng)目的并行執(zhí)行在現(xiàn)有PE上重復(fù)。例如,在規(guī)定上述(4,6)索引空間的情況下,當(dāng)只有兩行乘三列的總共六個(gè)PE時(shí),六個(gè)項(xiàng)目的并行執(zhí)行需要由六個(gè)PE重復(fù)四次。
[0015]進(jìn)一步,在OpenCL中,引入工作組的概念。工作組是在相同⑶16上執(zhí)行并且彼此相關(guān)的項(xiàng)目的組。相同工作組中的各個(gè)項(xiàng)目執(zhí)行相同的內(nèi)核并且共享下文將描述的CU16的局部存儲(chǔ)器。
[0016]唯一組ID被賦予每個(gè)工作組,工作組中唯一的局部ID被賦予每個(gè)工作組中的項(xiàng)目。進(jìn)一步,唯一全局ID也被賦予項(xiàng)目。項(xiàng)目可以被全局ID或組ID與局部ID的組合來標(biāo)識(shí)。
[0017]OpenCL設(shè)備14執(zhí)行運(yùn)算處理的方法是以下面的順序步驟通過調(diào)用API來實(shí)現(xiàn)的。
[0018]<步驟1>:從主機(jī)12向OpenCL設(shè)備14傳送用于運(yùn)算處理的參考數(shù)據(jù)。
[0019]<步驟2>:由“內(nèi)核開始命令”開始在OpenCL設(shè)備14上執(zhí)行內(nèi)核。
[0020]<步驟3>:在完成在OpenCL設(shè)備14上執(zhí)行內(nèi)核之后,從OpenCL設(shè)備14的存儲(chǔ)器空間向主機(jī)12傳送運(yùn)算處理的結(jié)果數(shù)據(jù)。
[0021]結(jié)合圖18來描述包括存儲(chǔ)器空間的OpenCL設(shè)備14的配置。圖18是在非專利文獻(xiàn)I的圖3.3中加入?yún)⒖挤系膱D。如較早前所述,OpenCL設(shè)備14包括一個(gè)或多個(gè)⑶16且每個(gè)⑶16包括一個(gè)或多個(gè)PE 18。
[0022]在上述步驟2中執(zhí)行內(nèi)核時(shí),可以在OpenCL設(shè)備14中進(jìn)行對(duì)四個(gè)不同存儲(chǔ)器的訪問。這四個(gè)存儲(chǔ)器是:專用存儲(chǔ)器20、局部存儲(chǔ)器22、全局存儲(chǔ)器32和常數(shù)存儲(chǔ)器34。首先,結(jié)合圖19,基于項(xiàng)目和工作組來描述這四個(gè)存儲(chǔ)器。注意:圖19是非專利文獻(xiàn)I中的表3.10
[0023]專用存儲(chǔ)器20對(duì)應(yīng)于一個(gè)項(xiàng)目且僅用于該項(xiàng)目的執(zhí)行。為專用存儲(chǔ)器20定義的對(duì)應(yīng)于一個(gè)項(xiàng)目的變量不能用于另一個(gè)項(xiàng)目。
[0024]局部存儲(chǔ)器22對(duì)應(yīng)于一個(gè)組且可以由組中的項(xiàng)目共享。這樣,使用局部存儲(chǔ)器22的例子是分配由組中項(xiàng)目共享的變量給局部存儲(chǔ)器22。
[0025]全局存儲(chǔ)器32和常數(shù)存儲(chǔ)器34可以由全部的組中的全部的項(xiàng)目存取。注意:盡管全局存儲(chǔ)器32可以被項(xiàng)目存取用于讀和寫,常數(shù)存儲(chǔ)器34僅可以被項(xiàng)目存取用于讀。下文中,全局存儲(chǔ)器32和常數(shù)存儲(chǔ)器34被統(tǒng)稱為設(shè)備存儲(chǔ)器30。
[0026]根據(jù)項(xiàng)目和PE 18之間的——對(duì)應(yīng),上述四個(gè)存儲(chǔ)器和⑶16和PE 18之間的對(duì)應(yīng)關(guān)系如下。
[0027]專用存儲(chǔ)器20與PE 18 一一對(duì)應(yīng)并且僅能夠由對(duì)應(yīng)PE 18存取。
[0028]局部存儲(chǔ)器22與⑶16——對(duì)應(yīng)并且能夠由對(duì)應(yīng)⑶16中的全部的PE 18存取。
[0029]設(shè)備存儲(chǔ)器30能夠由全部的⑶16中的全部的PE 18,即OpenCL設(shè)備14中的全部的PE,來存取。
[0030]進(jìn)一步,取決于OpenCL設(shè)備14,存在這樣一種情況:進(jìn)一步提供功能為設(shè)備存儲(chǔ)器30的高速緩存存儲(chǔ)器的高速緩存24。
[0031]如上所述,不同層級(jí)中的多個(gè)存儲(chǔ)器包括在OpenCL設(shè)備14中。這些存儲(chǔ)器能夠由PE以更高速度存取,因?yàn)樗鼈兲幱诟呒?jí)別。層級(jí)級(jí)別以設(shè)備存儲(chǔ)器30 (最低)、局部存儲(chǔ)器22 (中等)和專用存儲(chǔ)器20 (最高)的次序提高,來自PE的存取速度在此次序中變得更尚。
[0032]為了完全帶來OpenCL設(shè)備14的性能,有必要設(shè)計(jì)一種機(jī)制來在設(shè)備存儲(chǔ)器30和專用存儲(chǔ)器20/局部存儲(chǔ)器22之間移動(dòng)數(shù)據(jù),諸如參考在例如移動(dòng)到高速存儲(chǔ)器空間之后頻繁使用的數(shù)據(jù)。
[0033]在控制方法與OpenCL設(shè)備不同的串行處理器的情況下,也執(zhí)行全局存儲(chǔ)器空間與專用存儲(chǔ)器空間之間的數(shù)據(jù)的移動(dòng)。這結(jié)合圖20中所示的串行處理器的示例來描述。
[0034]圖20中所示的串行處理器50包括作為處理元件的PE 52、專用存儲(chǔ)器54、全局存儲(chǔ)器56和高速緩存控制機(jī)制58。
[0035]如其中所示,串行處理器50的存儲(chǔ)設(shè)備被分為專用存儲(chǔ)器54和全局存儲(chǔ)器56。專用存儲(chǔ)器54是低容量存儲(chǔ)器,其物理上為片上,而全局存儲(chǔ)器56是高容量存儲(chǔ)器,其物理上為片外。
[0036]盡管在串行處理器50中,存儲(chǔ)設(shè)備被分為專用存儲(chǔ)器54和全局存儲(chǔ)器56,由位于專用存儲(chǔ)器54和全局存儲(chǔ)器56之間的高速緩存控制機(jī)制58來自動(dòng)地進(jìn)行專用存儲(chǔ)器54和全局存儲(chǔ)器56之間的數(shù)據(jù)移動(dòng),串行處理器50的用戶將其視為一個(gè)大存儲(chǔ)器空間。換句話說,串行處理器50的用戶容易開發(fā)用戶程序用于PE 52來執(zhí)行運(yùn)算處理而不考慮數(shù)據(jù)怎樣在全局存儲(chǔ)器56和專用存儲(chǔ)器54之間移動(dòng)。
[0037]在并行處理器中,特別是如圖18中所示包括大量核(PE)作為OpenCL設(shè)備14的并行處理器中,存在與核的數(shù)目具有相同數(shù)目的專用存儲(chǔ)器20,進(jìn)一步存在與CU 16的數(shù)目具有相同數(shù)目的局部存儲(chǔ)器22。由于高硬件成本,由一個(gè)高速緩存控制機(jī)制一起管理全部的這些存儲(chǔ)器通常是不可行的。
[0038]另一方面,沒有高速緩存控制機(jī)制,多個(gè)存儲(chǔ)器空間被OpenCL系統(tǒng)10的用戶(下文簡稱為“用戶”)所看見。如較早前所述,為了通過諸如參考在移動(dòng)到高速存儲(chǔ)器空間(是更高層級(jí)存儲(chǔ)器空間)之后頻繁使用的數(shù)據(jù)的方案帶來更好的性能,有必要由用戶程序明確指示運(yùn)算處理所涉及的不同層級(jí)中的存儲(chǔ)器之間的數(shù)據(jù)的移動(dòng)。為了正確獲取它,用戶需要知道上述存儲(chǔ)器之間在速度、容量、功能等上的差別。結(jié)合圖21來描述具體示例。
[0039]圖21是圖示說明執(zhí)行運(yùn)算處理以從多個(gè)數(shù)據(jù)塊(數(shù)據(jù)塊A到D)獲得數(shù)據(jù)塊A’和B’的例子的圖。注意:在圖21中,省略了從主機(jī)到設(shè)備的內(nèi)核傳送的圖示。進(jìn)一步,數(shù)據(jù)塊A到D是上述步驟I中從主機(jī)12傳送到OpenCL設(shè)備14的參考數(shù)據(jù)并且存儲(chǔ)在全局存儲(chǔ)器32中。數(shù)據(jù)塊A’和B’是上述步驟2中針對(duì)數(shù)據(jù)塊A到D執(zhí)行運(yùn)算處理的結(jié)果并且寫入到全局存儲(chǔ)器32并且隨后在步驟3中傳送到主機(jī)12。
[0040]下面描述步驟2的處理,即執(zhí)行內(nèi)核的運(yùn)算處理。注意:在本說明書中,在可以存在多個(gè)專用存儲(chǔ)器的情況下,它們被稱為“專用存儲(chǔ)器組”。
[0041]如果不追求運(yùn)算處理的性能,可以利用在運(yùn)算處理中僅使用全局存儲(chǔ)器32而不使用專用存儲(chǔ)器組/局部存儲(chǔ)器22的技術(shù)。在此情況下,在全局存儲(chǔ)器32和專用存儲(chǔ)器組/局部存儲(chǔ)器22之間沒有數(shù)據(jù)傳送。
[0042]該技術(shù)控制簡單但性能不好。為了獲得更好的運(yùn)算處理性能,如上所述,利用在將要處理的數(shù)據(jù)從全局存儲(chǔ)器32傳送到專用存儲(chǔ)器組/局部存儲(chǔ)器22之后執(zhí)行運(yùn)算處理、然后將運(yùn)算處理的結(jié)果存儲(chǔ)到專用存儲(chǔ)器組/局部存儲(chǔ)器22之后再傳送到全局存儲(chǔ)器32的技術(shù)。
[0043]對(duì)于使用該技術(shù)的情況,首先描述當(dāng)全部的項(xiàng)目可以同時(shí)并行執(zhí)行時(shí)的流程(步驟A到C)。注意:“全部的項(xiàng)目可以同時(shí)并行執(zhí)行”意指PE的數(shù)目等于或多于項(xiàng)目的總數(shù)目,且專用存儲(chǔ)器組和局部存儲(chǔ)器的容量能夠存儲(chǔ)全部的要處理的數(shù)據(jù),而且,在這種情況下,要處理的數(shù)據(jù)從全局存儲(chǔ)器32到專用存儲(chǔ)器組/局部存儲(chǔ)器22的傳送、每個(gè)PE 18的運(yùn)算處理的并行執(zhí)行、處理結(jié)果從專用存儲(chǔ)器組/局部存儲(chǔ)器22到全局存儲(chǔ)器32的傳送僅執(zhí)行一次。
[0044]〈步驟A>:將存儲(chǔ)在全局存儲(chǔ)器32中的數(shù)據(jù)塊A到D傳送到專用存儲(chǔ)器組/局部存儲(chǔ)器22。
[0045]例如,該傳送是將要處理的數(shù)據(jù)中僅由PE 18使用的數(shù)據(jù)傳送到PE 18的專用存儲(chǔ)器并且將多個(gè)PE 18共享的數(shù)據(jù)傳送到局部存儲(chǔ)器22。
[0046]注意:從全局存儲(chǔ)器32到專用存儲(chǔ)器組/局部存儲(chǔ)器22的數(shù)據(jù)傳送下面被稱為“讀傳送”。進(jìn)一步,讀傳送的數(shù)據(jù)塊,諸如數(shù)據(jù)塊A到D,被稱為“讀取塊RB”。
[0047]〈步驟B〉:對(duì)每個(gè)PE18執(zhí)行運(yùn)算處理并且將運(yùn)算處理的結(jié)果存儲(chǔ)到可由PE 18存取的專用存儲(chǔ)器/局部存儲(chǔ)器22中。
[0048]<步驟C〉:將步驟B中由運(yùn)算處理獲得且存儲(chǔ)在專用存儲(chǔ)器組/局部存儲(chǔ)器22中的數(shù)據(jù)塊A’和B’傳送到全局存儲(chǔ)器32。
[0049]注意:從專用存儲(chǔ)器組/局部存儲(chǔ)器22到全局存儲(chǔ)器32的數(shù)據(jù)傳送下面被稱為“寫傳送”。進(jìn)一步,存儲(chǔ)在專用存儲(chǔ)器組/局部存儲(chǔ)器22中的且被寫傳送的數(shù)據(jù)塊,諸如數(shù)據(jù)塊A’和B’被稱為“寫入塊WB”。
[0050]全部的這三個(gè)步驟需要在由用戶創(chuàng)建的內(nèi)核中明確規(guī)定。這個(gè)規(guī)定包括運(yùn)算處理的內(nèi)容和取決于OpenCL設(shè)備14的配置的內(nèi)容(PE數(shù)目(=專用存儲(chǔ)器數(shù)目)、每個(gè)專用存儲(chǔ)器的容量、局部存儲(chǔ)器的容量等等)。
[0051]例如,在存在多個(gè)要被處理的讀取塊RB且由于全部的項(xiàng)目不能存儲(chǔ)在一個(gè)工作組中的專用存儲(chǔ)器組/局部存儲(chǔ)器22中,每個(gè)讀取塊RB需要被分段為子塊的情況下,有必要在步驟A中為多個(gè)讀取塊RB規(guī)定子塊之間的關(guān)聯(lián)方法。讀取塊RB的子塊之間的“關(guān)聯(lián)方法”意指多個(gè)讀取塊RB的子塊中的讀取塊RB的哪些子塊要被傳送到相同工作組中的專用存儲(chǔ)器組或者相同工作組中的局部存儲(chǔ)器22。這取決于運(yùn)算處理的內(nèi)容,將它們進(jìn)行分段的方式取決于OpenCL設(shè)備14的配置。
[0052]類似地,在存在多個(gè)寫入塊WB作為運(yùn)算處理結(jié)果的情況下,也有必要規(guī)定關(guān)聯(lián)方法,意指在讀取塊RB的子塊的什么組合之下獲得多個(gè)寫入塊WB的各個(gè)子塊作為處理結(jié)果。注意:寫入塊WB中每個(gè)子塊的內(nèi)容是作為處理結(jié)果存儲(chǔ)在每個(gè)工作組的專用存儲(chǔ)器組或局部存儲(chǔ)器22中的數(shù)據(jù)。寫入塊WB到全局存儲(chǔ)器32的傳送意指將數(shù)據(jù)寫入全局存儲(chǔ)器32中的寫入塊WB的每個(gè)子塊位置。就像讀取塊RB的關(guān)聯(lián)方法,寫入塊WB的關(guān)聯(lián)方法也取決于運(yùn)算處理的內(nèi)容和OpenCL設(shè)備14的配置。
[0053]除了如上所述的全部的所需數(shù)據(jù)塊不能存儲(chǔ)在工作組中的存儲(chǔ)器中的情況,在PE總數(shù)目小于索引空間大小的情況下,例如,全部的項(xiàng)目不能同時(shí)并行執(zhí)行且因此PE對(duì)項(xiàng)目的并行執(zhí)行需要重復(fù)多次。結(jié)果,因?yàn)椴⑿袌?zhí)行被重復(fù),讀傳送和寫傳送也需要被重復(fù)。在此情況下,有必要根據(jù)運(yùn)算處理的內(nèi)容和OpenCL設(shè)備14的配置來規(guī)定數(shù)據(jù)塊的分段方法以及通過劃分?jǐn)?shù)據(jù)而獲得的子塊的關(guān)聯(lián)方法。
[0054]數(shù)據(jù)塊的“分段方法”意指怎樣將數(shù)據(jù)塊分段為子塊。“子塊SB”是讀傳送和寫傳送的單位。此后,當(dāng)有必要區(qū)分讀和寫時(shí),通過分段讀取塊RB而獲得的子塊被稱為“子讀取塊SRB”,而通過分段寫入塊WB而獲得的子塊被稱為“子寫入塊SWB”。
[0055]子塊SB之間的“關(guān)聯(lián)方法”意指包括在不同讀取塊或?qū)懭雺K中的哪些子塊SB是同時(shí)駐