拼接器則可以直接從LaunchingBuffer中讀取該數(shù)據(jù)塊拼接到GPU,保證CPU的LaunchingBuffer和GPU對數(shù)據(jù)的存儲格式一致,保證GPU能夠正確讀取數(shù)據(jù)塊進(jìn)行運(yùn)算處理,避免將數(shù)據(jù)高位讀成低位,或?qū)?shù)據(jù)地位讀成高位導(dǎo)致運(yùn)算錯(cuò)誤。
[0083]在本發(fā)明實(shí)施例中,通過數(shù)據(jù)預(yù)處理器先從DirectBuffer中讀取到地址索引數(shù)組,根據(jù)地址索引數(shù)組中的數(shù)據(jù)元素從DirectBuffer中讀取到對應(yīng)的數(shù)據(jù)集合中的數(shù)據(jù),之后,根據(jù)預(yù)設(shè)解析函數(shù)實(shí)現(xiàn)對數(shù)據(jù)集合中的數(shù)據(jù)進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換,使得數(shù)據(jù)格式轉(zhuǎn)換后的數(shù)據(jù)能夠滿足邏輯運(yùn)算。將數(shù)據(jù)集合生成數(shù)據(jù)塊存儲到LaunchingBuffer中,由數(shù)據(jù)拼接器從LaunchingBuffer中讀取數(shù)據(jù)塊傳送給GPU。本發(fā)明實(shí)施例由CPU中的數(shù)據(jù)預(yù)處理器獨(dú)自完成,通過預(yù)設(shè)解析函數(shù)實(shí)現(xiàn)對數(shù)據(jù)自動解析,為GPU對數(shù)據(jù)塊的運(yùn)算提供方便,利用數(shù)據(jù)預(yù)處理器簡化從節(jié)點(diǎn)設(shè)備的編程工作,有利于以后優(yōu)化。
[0084]CPU 自動分配和回收 WorkingBuffer 和 LaunchingBuffer,其中,一個(gè)WorkingBuffer的生存周期為一個(gè)數(shù)據(jù)分片的處理時(shí)間,一個(gè)LaunchingBuffer的生存周期是處理一個(gè)數(shù)據(jù)集合的時(shí)間。另外,CPU上還分配有ResultBuffer,用來存儲GPU運(yùn)算后返回的運(yùn)算結(jié)果,之后該運(yùn)算結(jié)果作為MapReduce中Reduce任務(wù)的輸入。
[0085]如圖3所示,本發(fā)明實(shí)施例另一方面提供一種數(shù)據(jù)處理方法,包括:
[0086]S310、數(shù)據(jù)拼接器從CPU的第二緩沖區(qū)讀取數(shù)據(jù)預(yù)處理器生成的數(shù)據(jù)塊;
[0087]本發(fā)明實(shí)施例應(yīng)用于MapReduce架構(gòu)下的Hadoop集群,該Hadoop集群中包括主節(jié)點(diǎn)設(shè)備和從節(jié)點(diǎn)設(shè)備,從節(jié)點(diǎn)設(shè)備包括處理器CPU和圖形處理器GPU,該從節(jié)點(diǎn)設(shè)備從主節(jié)點(diǎn)設(shè)備獲取數(shù)據(jù)分片,而在CPU中設(shè)置有數(shù)據(jù)預(yù)處理器和數(shù)據(jù)拼接器。
[0088]其中,數(shù)據(jù)預(yù)處理器用于完成從CPU第一緩沖區(qū)讀取數(shù)據(jù)集合的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)格式后,將這個(gè)數(shù)據(jù)集合生成數(shù)據(jù)塊存儲到第二緩沖區(qū)。而數(shù)據(jù)拼接器主要完成將數(shù)據(jù)塊從CPU拼接到GPU。
[0089]S320、所述數(shù)據(jù)拼接器將所述數(shù)據(jù)塊拼接到GPU中被分配存儲數(shù)據(jù)塊的工作緩沖區(qū)。
[0090]本發(fā)明實(shí)施例中數(shù)據(jù)拼接器從CPU第二緩沖區(qū)讀取數(shù)據(jù)塊,將數(shù)據(jù)塊從CPU的第二緩沖區(qū)拼接到GPU的工作緩沖區(qū)。本發(fā)明實(shí)施例中由數(shù)據(jù)拼接器完成數(shù)據(jù)的拼接,不再依賴于程序員的編程,從而簡化了程序員的編程工作,還能有利于整個(gè)MapReduce架構(gòu)后續(xù)的優(yōu)化工作。
[0091]下面將對圖3所提供的實(shí)施例作詳細(xì)介紹,如圖4所示,一種數(shù)據(jù)處理方法,可包括:
[0092]S410、所述數(shù)據(jù)拼接器從LaunchingBuffer讀取數(shù)據(jù)塊;
[0093]CPU在內(nèi)存中還分配有LaunchingBuffer,主要用來存儲需要拼接到GPU的數(shù)據(jù)塊。
[0094]S420、所述數(shù)據(jù)拼接器從游標(biāo)參數(shù)指示的起始地址開始拼接所述數(shù)據(jù)塊,所述游標(biāo)參數(shù)用于指示所述GPU中被分配存儲數(shù)據(jù)塊的WorkingBuffer中可用于存儲數(shù)據(jù)塊的起始地址;
[0095]GPU內(nèi)存中分配有WorkingBuffer,主要用來存儲從CPU的LaunchingBuffer拼接過來的數(shù)據(jù);該WorkingBuffer的內(nèi)存大小由GPU自身決定,而在CPU中DirectBuffer的內(nèi)存大小由java的運(yùn)行環(huán)境所決定。通常來說,GPU上的WorkingBuffer的內(nèi)存大小要遠(yuǎn)遠(yuǎn)大于CPU中由java支持的DirectBuffer的內(nèi)存,因此,WorkingBuffer可能存儲至少一個(gè)從DirectBuffer得來的數(shù)據(jù)塊,而在存儲到某一個(gè)數(shù)據(jù)塊時(shí),WorkingBuffer的剩余內(nèi)存可能無法再繼續(xù)存儲數(shù)據(jù)塊,將由數(shù)據(jù)拼接器對該數(shù)據(jù)塊作出正確處理。
[0096]具體地,數(shù)據(jù)拼接器管理著一個(gè)游標(biāo)參數(shù),游標(biāo)參數(shù)指示W(wǎng)orkingBuffer可存儲數(shù)據(jù)的起始地址,在每一次將數(shù)據(jù)塊拼接到WorkingBuffer后,就相應(yīng)更新游標(biāo)參數(shù),以便下次能夠準(zhǔn)確知道WorkingBuffer可以存儲數(shù)據(jù)的起始地址。在需要將數(shù)據(jù)塊傳送到WorkingBuffer時(shí),從游標(biāo)參數(shù)指示的起始地址開始,將數(shù)據(jù)塊拼接到WorkingBuffer。
[0097]S430、當(dāng)所述數(shù)據(jù)拼接器將所述數(shù)據(jù)塊拼接到WorkingBuffer失敗時(shí),則暫停拼接所述數(shù)據(jù)塊,并觸發(fā)所述GPU處理WorkingBuffer存儲的數(shù)據(jù)塊。
[0098]其中,數(shù)據(jù)拼接器從LaunchingBuffer讀取到的數(shù)據(jù)塊中的數(shù)據(jù)是可以直接進(jìn)行邏輯運(yùn)算的,且滿足GPU對數(shù)據(jù)的存儲格式要求。調(diào)用應(yīng)用程序接口(API,Applicat1n Programming Interface)將所述數(shù)據(jù)塊中的數(shù)據(jù)拼接到 WorkingBuffer。若WorkingBuffer的剩余內(nèi)存能夠拼接完從CPU的LaunchingBuffer讀取的數(shù)據(jù)塊,貝Ij將整個(gè)數(shù)據(jù)塊都拼接到WorkingBuffer中;如果WorkingBuffer的剩余內(nèi)存不能拼接完從CPU的LaunchingBuffer讀取的數(shù)據(jù)塊,那么將暫停拼接該數(shù)據(jù)塊,數(shù)據(jù)塊仍然保存在LaunchingBuffer中,另外觸發(fā)GPU開始對WorkingBuffer中的所有數(shù)據(jù)塊進(jìn)行運(yùn)算處理。
[0099]本發(fā)明實(shí)施例中,CPU中的數(shù)據(jù)拼接器,用于解決CPU中DirectBuffer和GPU中的WorkingBuffer剩余內(nèi)存大小不一致時(shí)的數(shù)據(jù)塊拼接問題。數(shù)據(jù)拼接器通過將數(shù)據(jù)塊從LaunchingBuffer中直接拼接到WorkingBuffer中,如果WorkingBuffer剩余內(nèi)存大小不能滿足存儲數(shù)據(jù)塊的時(shí)候,暫時(shí)停止該次拼接操作,若再下次WorkingBuffer的剩余內(nèi)存能夠拼接完時(shí),再次LaunchingBuffer中讀取數(shù)據(jù)塊拼接到WorkingBuffer中。由于在LaunchingBuffer的數(shù)據(jù)塊已經(jīng)符合GPU對數(shù)據(jù)處理時(shí)的需要,GPU接收到數(shù)據(jù)塊之后則可以直接進(jìn)行運(yùn)算處理,有效提高GPU的工作效率。
[0100]可以理解的是,數(shù)據(jù)拼接器在傳送數(shù)據(jù)塊成功之后,還執(zhí)行以下步驟:
[0101]B1、所述數(shù)據(jù)拼接器通知所述GPU所述數(shù)據(jù)塊的大小;
[0102]B2、所述數(shù)據(jù)拼接器更新所述游標(biāo)參數(shù)。
[0103]其中,數(shù)據(jù)拼接器在每一次將數(shù)據(jù)塊成功拼接到GPU后,都將數(shù)據(jù)塊大小通知到GPU, GPU能夠直接使用,無需再計(jì)算數(shù)據(jù)塊大小,能夠減少GPU的工作量。
[0104]另外,與在上述CPU的DirectBuffer中通過地址索引數(shù)組來指示數(shù)據(jù)在DirectBuffer的存儲地址相同,GPU也可以在WorkingBuffer頭部為數(shù)據(jù)塊添加一個(gè)查找索引數(shù)組,查找索引數(shù)組包含有與所述數(shù)據(jù)塊的數(shù)據(jù)一一對應(yīng)的數(shù)據(jù)元素,數(shù)據(jù)元素用來指示數(shù)據(jù)在WorkingBuffer的存儲地址。在數(shù)據(jù)拼接器拼接過來一個(gè)數(shù)據(jù)塊后,即在查找索引數(shù)組中添加對應(yīng)該數(shù)據(jù)塊的每一個(gè)數(shù)據(jù)的數(shù)據(jù)元素,以便后續(xù)GPU快速從WorkingBuffer中找到數(shù)據(jù)并讀取數(shù)據(jù)進(jìn)行運(yùn)算。
[0105]上述該步驟BI和B2不分先后,在此不作限定。
[0106]由于在CPU中,接收到的每一個(gè)數(shù)據(jù)分片可能最后生成多個(gè)數(shù)據(jù)塊,GPU中分配的WorkingBuffer以數(shù)據(jù)塊為單位進(jìn)行存儲,其生存周期為處理完一個(gè)數(shù)據(jù)分片的時(shí)間。在數(shù)據(jù)拼接器將整個(gè)數(shù)據(jù)分片都傳送成功之后,數(shù)據(jù)拼接器則返回傳送成功的標(biāo)志值,以便通知主節(jié)點(diǎn)設(shè)備分配下一個(gè)數(shù)據(jù)分片;在數(shù)據(jù)拼接器傳送數(shù)據(jù)分片失敗后,則返回傳送失敗的標(biāo)志值,以便通知主節(jié)點(diǎn)設(shè)備暫停分配下一個(gè)數(shù)據(jù)分片。
[0107]另外,在GPU內(nèi)存中同樣分配ResultBuffer,該ResultBuffer用來保存運(yùn)算后的結(jié)果,之后調(diào)用API接口,將該運(yùn)算結(jié)果返回CPU并存儲在CPU分配的ResultBuffer當(dāng)中,作為MapReduce下的Reduce任務(wù)的輸入。
[0108]CPU中用來存儲數(shù)據(jù)集合的DirectBufTer、存儲數(shù)據(jù)格式轉(zhuǎn)換后的數(shù)據(jù)塊的LaunchingBuffer和用來存儲GPU返回的運(yùn)算結(jié)果的ResultBuffer都是由CPU自動分配和回收,其中,LaunchingBuffer的生存周期是一個(gè)數(shù)據(jù)塊的處理時(shí)間;GPU中用來存儲接收的數(shù)據(jù)塊的WorkingBuffer和存儲運(yùn)算結(jié)果的ResultBuffer都是由GPU自動分配和回收,其中,WorkingBuffer的生存周期是一個(gè)數(shù)據(jù)分片的處理時(shí)間;ResultBuffer的生存周期與WorkingBuffer的生存周期一樣。CPU和GPU中buffer自動實(shí)現(xiàn)同步,例如CPU中ResultBuffer 與 GPU 中 WorkingBuffer、ResultBuffer 實(shí)現(xiàn)分配和回收同步。
[0109]如圖5-a所示,本發(fā)明實(shí)施例還提供一種數(shù)據(jù)預(yù)處理器500,可包括:
[0110]第一讀取單元510,用于從所述CPU的第一緩沖區(qū)讀取元數(shù)據(jù);其中,當(dāng)從數(shù)據(jù)分片獲取的數(shù)據(jù)集合存儲進(jìn)所述第一緩沖區(qū)時(shí),在所述第一緩沖區(qū)頭部為所述數(shù)據(jù)集合添加元數(shù)據(jù),所述元數(shù)據(jù)中包括所述數(shù)據(jù)集合的數(shù)據(jù)在所述第一緩沖區(qū)的存儲地址;
[0111]第二讀取單元520,用于根據(jù)預(yù)設(shè)解析函數(shù),將所述數(shù)據(jù)集合的數(shù)據(jù)轉(zhuǎn)換成所述預(yù)設(shè)解析函數(shù)所指示的數(shù)據(jù)格式,并將轉(zhuǎn)換后的數(shù)據(jù)集合生成數(shù)據(jù)塊;
[0112]轉(zhuǎn)換單元530,用于對所述數(shù)據(jù)進(jìn)行解析,并將解析后的數(shù)據(jù)集合生成數(shù)據(jù)塊;
[0113]存儲單元540,用于將所述數(shù)據(jù)塊存儲在所述CPU的第二緩沖區(qū),以使得所述數(shù)據(jù)拼接器從所述第二緩沖區(qū)讀取所述數(shù)據(jù)塊拼接到所述GPU。
[0114]本發(fā)明實(shí)施例應(yīng)用于MapReduce架構(gòu)下的Hadoop集群,該數(shù)據(jù)預(yù)處理器500設(shè)置在Hadoop集群下的從節(jié)點(diǎn)設(shè)備的CPU中,其中,該CPU還設(shè)置有數(shù)據(jù)拼接器,且每個(gè)從節(jié)點(diǎn)設(shè)備還GPU,從節(jié)點(diǎn)設(shè)備從Hadoop集群的主節(jié)點(diǎn)設(shè)備獲取數(shù)據(jù)分片,然后將數(shù)據(jù)分片中的鍵值對中的值拼接成數(shù)據(jù)集合存儲進(jìn)CPU內(nèi)存中分配的第一緩沖區(qū),由于第一緩沖區(qū)的內(nèi)存可能無法將數(shù)據(jù)分片中所有鍵值對的值一次存儲完,因此,數(shù)據(jù)分片中鍵值對的值可以分多次拼接成數(shù)據(jù)集合。
[0115]在數(shù)據(jù)集合存儲進(jìn)第一緩沖區(qū)時(shí),在第一緩沖區(qū)的頭部為數(shù)據(jù)集合添加元數(shù)據(jù),該元數(shù)據(jù)主要包括數(shù)據(jù)集合的數(shù)據(jù)在第一緩沖區(qū)中的存儲地址。之后,由第一讀取單元510從第一緩沖區(qū)讀取元數(shù)據(jù),然后第二讀取單元520根據(jù)元數(shù)據(jù)所指示的存儲地址從第一緩沖區(qū)讀取數(shù)據(jù)集合中的數(shù)據(jù),再由轉(zhuǎn)換單元530對數(shù)據(jù)進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換,并將格式轉(zhuǎn)換后的整個(gè)數(shù)據(jù)集合生成數(shù)據(jù)塊,存儲單元540將數(shù)據(jù)塊存儲到CPU的第二緩沖區(qū),第二緩沖區(qū)主要是CPU在內(nèi)存中分配用來存儲數(shù)據(jù)塊,以便數(shù)據(jù)拼接器能夠從第二緩沖區(qū)讀取數(shù)據(jù)塊傳送到GPU的工作緩沖區(qū)。本發(fā)明實(shí)施例中,由數(shù)據(jù)預(yù)處理器自動完成數(shù)據(jù)讀取和對數(shù)據(jù)格式的轉(zhuǎn)換,無需程序員再編寫相應(yīng)的程序,減少了程序員的編程工作,更加有利于后續(xù)優(yōu)化M, apReduce架構(gòu),提高CPU的工作效率。