一種基于小內(nèi)存處理大規(guī)模數(shù)據(jù)的并行程序開發(fā)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及高性能計算領(lǐng)域,具體地說是一種實(shí)用性強(qiáng)、基于小內(nèi)存處理大規(guī)模數(shù)據(jù)的并行程序開發(fā)方法。
【背景技術(shù)】
[0002]當(dāng)前社會人類的數(shù)據(jù)大爆炸,信息數(shù)據(jù)越來越多,人們對信息數(shù)據(jù)的處理能力的要求也越來越高,不僅石油勘探、氣象預(yù)報、航天國防、科學(xué)研宄等需求高性能計算,金融、政府信息化、教育、企業(yè)、網(wǎng)絡(luò)游戲等更廣泛的領(lǐng)域?qū)Ω咝阅苡嬎愕男枨笱该驮鲩L。
[0003]計算速度對于高性能計算尤為重要,高性能計算朝多核、眾核發(fā)展。但是由于一些應(yīng)用運(yùn)算數(shù)據(jù)規(guī)模一直比較大,受限于網(wǎng)絡(luò)帶寬,系統(tǒng)內(nèi)存等原因,系統(tǒng)無法處理數(shù)據(jù)量遠(yuǎn)遠(yuǎn)超過系統(tǒng)內(nèi)存的承受,導(dǎo)致計算核心無法充分的利用。對于內(nèi)存不足的系統(tǒng),將數(shù)據(jù)量一次性全部導(dǎo)入內(nèi)存再處理的方式已經(jīng)無法滿足當(dāng)前的需求,需要進(jìn)一步設(shè)計一種根據(jù)現(xiàn)有有限的硬件設(shè)備下能夠在單機(jī)中處理大規(guī)模數(shù)據(jù),并且不會降低計算效率、能夠充分利用計算核心的方法。
[0004]基于此,本發(fā)明提供一種基于小內(nèi)存處理大數(shù)據(jù)開發(fā)方法,對一些無法在小內(nèi)存的設(shè)備條件下運(yùn)行的程序或不能充分利用計算核心的系統(tǒng)修改,能夠處理較大規(guī)模的數(shù)據(jù),并使系統(tǒng)的計算設(shè)備達(dá)到計算的負(fù)載均衡且滿負(fù)載的運(yùn)行,從而最大限度的利用現(xiàn)有設(shè)備的性能,提高系統(tǒng)的整體運(yùn)行的效率,大大縮短程序的運(yùn)行時間。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的技術(shù)任務(wù)是針對以上不足之處,提供一種實(shí)用性強(qiáng)、基于小內(nèi)存處理大規(guī)模數(shù)據(jù)的并行程序開發(fā)方法。
[0006]一種基于小內(nèi)存處理大規(guī)模數(shù)據(jù)的并行程序開發(fā)方法,其具體實(shí)現(xiàn)過程為: 在內(nèi)存和外存開辟數(shù)據(jù)空間,并劃分成若干數(shù)據(jù)塊,將任務(wù)數(shù)據(jù)讀入到劃分的外存數(shù)據(jù)塊中,計算與I/o線程操作不同的內(nèi)存數(shù)據(jù)塊與外存數(shù)據(jù)塊交互,使得計算該數(shù)據(jù)塊所需時間與I/o的時間相等;
設(shè)置讀線程、計算線程、寫線程,主線程根據(jù)CPU的計算核心數(shù)量啟動計算線程和I/O線程,主線程初始化隊(duì)列和各個緩存區(qū),然后啟動上述各個線程;
當(dāng)需要計算劃分到外存中的數(shù)據(jù)塊時,讀線程從內(nèi)存中獲取空的數(shù)據(jù)塊緩沖區(qū),然后將外存數(shù)據(jù)塊中的數(shù)據(jù)讀入到內(nèi)存中;
計算線程從內(nèi)存中獲取已經(jīng)讀入的數(shù)據(jù)塊,再從內(nèi)存中獲取一個空的數(shù)據(jù)塊緩存區(qū),計算結(jié)果存入到空的數(shù)據(jù)塊緩沖區(qū)中,將源數(shù)據(jù)的數(shù)據(jù)塊緩存區(qū)清空;
寫線程獲取計算線程計算完成后目的數(shù)據(jù)塊緩存區(qū)中數(shù)據(jù),將此數(shù)據(jù)寫到外存中的緩沖區(qū)中,輸出完畢后將目的數(shù)據(jù)塊緩存區(qū)清空。
[0007]所述讀線程、計算線程、寫線程異步并行,需要源緩沖SR_BUF和目標(biāo)緩沖DR_BUF,DR-BUF, SR_BUF均為由主線程開辟的內(nèi)存緩沖空間;BUF是一個連續(xù)的存儲空間,被分割成多份,每份稱為一個緩沖塊BUF_BLOCK,緩沖塊對應(yīng)一個基本數(shù)據(jù)塊的作業(yè)單位;讀線程與計算線程共同操作SR_BUF緩沖,計算線程與寫線程共同操作DR_BUF緩沖。
[0008]每個緩沖或隊(duì)列可容納至少兩個緩沖對象。
[0009]還包括環(huán)形隊(duì)列,該環(huán)形隊(duì)列存儲緩沖區(qū)的ID,各線程從隊(duì)列中獲取要操作的緩沖區(qū)對應(yīng)的ID,上述環(huán)形隊(duì)列包括下述四個隊(duì)列:
SR_BUF_FULL_QUEUE:新的計算任務(wù)隊(duì)列,存放新讀入的等待計算的源數(shù)據(jù)塊的ID號SR_BUF_ID、數(shù)據(jù)塊的大小信息,由讀線程寫入,計算線程彈出,當(dāng)讀線程向SR_BUF_ID對應(yīng)的緩存區(qū)中讀入新的數(shù)據(jù)時,將SR_BUF_ID入隊(duì),計算線程彈出SR_BUF_ID時,計算SR_BUF_ID對應(yīng)的源數(shù)據(jù);
SR_BUF_FREE_QUEUE:空閑源緩沖隊(duì)列,存放當(dāng)前空閑SR_BUF_ID號,由計算線程寫入,讀線程彈出,當(dāng)SR_BUF_ID對應(yīng)的源數(shù)據(jù)計算完畢時,釋放SR_BUF_ID,告知讀線程可對其更新數(shù)據(jù);
DR_BUF_FREE_QUEUE:空閑目標(biāo)緩沖隊(duì)列,存放當(dāng)前空閑數(shù)據(jù)塊的ID號DR_BUF_ID,記錄DR_BUF_ID號,由寫線程寫入,計算線程彈出;當(dāng)寫線程對DR_BUF_ID對應(yīng)的緩存區(qū)數(shù)據(jù)輸出完畢時,將DR_BUF_ID入隊(duì),告知計算線程,該DR_BUF_ID輸出完畢可重新用于計算,計算線程彈出DR_BUF_ID時,啟動計算,并將結(jié)果寫入DR_BUF_ID對應(yīng)的目標(biāo)緩沖區(qū)中;DR_BUF_FULL_QUEUE:新的寫任務(wù)隊(duì)列,存放計算完畢等待寫回的目標(biāo)數(shù)據(jù)塊的ID號DR_BUF_ID,由計算線程寫入,寫線程彈出;當(dāng)計算線程向DR_BUF_ID所對應(yīng)的緩沖區(qū)中讀入新數(shù)據(jù)時,將DR_BUF_ID入隊(duì),寫線程彈出DR_BUF_ID時,對DR_BUF_ID對應(yīng)的目標(biāo)數(shù)據(jù)進(jìn)行輸出。
[0010]基于上述隊(duì)列,該并行程序開發(fā)的具體過程為:
主線程根據(jù)CPU的計算核心數(shù)啟動nThreads個計算線程和同等數(shù)量的I/O線程,將計算數(shù)據(jù)劃分為合適的基本數(shù)據(jù)塊,并在外存開辟同樣數(shù)量大小的內(nèi)存,將數(shù)據(jù)庫中的數(shù)據(jù)讀入到外存中;
在內(nèi)存中開辟內(nèi)存塊,其內(nèi)存塊的數(shù)量是線程數(shù)量的倍數(shù);
創(chuàng)建四個隊(duì)列 SR_BUF_FULL_QUEUE、SR_BUF_FREE_QUEUE、DR_BUF_FREE_QUEUE、DR_BUF_FREE_QUEUE,并初始化隊(duì)列,即將內(nèi)存塊的ID存入FREE隊(duì)列中,最后主線啟動所有線程;讀線程從SR_BUF_FREE_QUEUE隊(duì)列中獲取一個空的數(shù)據(jù)塊ID,將一個外存數(shù)據(jù)塊讀入到此ID對應(yīng)的數(shù)據(jù)塊中,然后將此數(shù)據(jù)塊的ID入隊(duì)到隊(duì)列SR_BUF_FULL_QUEUE中;
計算線程分別從SR_BUF_FULL_QUEUE和DR_BUF_FREE_QUEUE獲取數(shù)據(jù)塊的ID,計算源數(shù)據(jù)并將結(jié)果存入到目的數(shù)據(jù)塊中,計算完成將源數(shù)據(jù)塊清空并將其ID入隊(duì)到SR_BUF_FREE_QUEUE對列中,將目的數(shù)據(jù)塊的ID入隊(duì)到DR_BUF_FULL_QUEUE對列中;
寫線程中DR_BUF_FULL_QUEUE中獲取待寫的數(shù)據(jù)塊的ID,將ID對應(yīng)的數(shù)據(jù)塊寫入到外存中,寫完成后將數(shù)據(jù)塊中數(shù)據(jù)清空并將其ID入隊(duì)到DR_BUF_FREE_QUEUE隊(duì)列中;
計算線程與讀寫線程異步并行執(zhí)行,直到系統(tǒng)結(jié)束。
[0011]本發(fā)明的一種基于小內(nèi)存處理大規(guī)模數(shù)據(jù)的并行程序開發(fā)方法,具有以下優(yōu)點(diǎn): 該發(fā)明的一種基于小內(nèi)存處理大規(guī)模數(shù)據(jù)的并行程序開發(fā)方法根據(jù)任務(wù)量在現(xiàn)有的硬件設(shè)備條件,動態(tài)調(diào)度計算數(shù)據(jù)的方法具有針對系統(tǒng)平臺自適應(yīng),可實(shí)現(xiàn)系統(tǒng)的可靠、高效;可以自適應(yīng)于小內(nèi)存來處理大數(shù)據(jù)的系統(tǒng),此系統(tǒng)可以由純CPU系統(tǒng)組成;實(shí)現(xiàn)動態(tài)調(diào)度,系統(tǒng)中各計算核心實(shí)現(xiàn)滿負(fù)載運(yùn)行,系統(tǒng)設(shè)備利用率高,計算核心彼此相互不等待,系統(tǒng)中計算設(shè)備不出現(xiàn)空閑狀態(tài),系統(tǒng)將實(shí)現(xiàn)高效運(yùn)轉(zhuǎn);在現(xiàn)有硬件的條件如內(nèi)存容量、網(wǎng)絡(luò)帶寬不足的情況下,采取數(shù)據(jù)分塊傳輸與計算異步處理的方式,能夠有效處理大規(guī)模的數(shù)據(jù);運(yùn)行此系統(tǒng)將實(shí)現(xiàn)高性能,此系統(tǒng)將根據(jù)設(shè)備的計算能力和系統(tǒng)內(nèi)設(shè)備資源的容量動態(tài)劃分計算任務(wù),實(shí)現(xiàn)計算任務(wù)的分塊處理,提升系統(tǒng)的高效性,滿足設(shè)備無法運(yùn)行大量數(shù)據(jù)的要求,有很高的實(shí)用價值,實(shí)用性強(qiáng),易于推廣。
【附圖說明】
[0012]附圖1為本發(fā)明的數(shù)據(jù)劃分示意圖。
[0013]附圖2為本發(fā)明的多緩存結(jié)構(gòu)設(shè)計圖。
[0014]附圖3為本發(fā)明的環(huán)形隊(duì)列示意圖。
[0015]附圖4為計算系統(tǒng)運(yùn)行時序圖。
【具體實(shí)施方式】
[0016]下面結(jié)合附圖和具體實(shí)施例對本發(fā)明作進(jìn)一步說明。
[0017]為充分利用帶小內(nèi)存的硬件設(shè)備的性能,以實(shí)現(xiàn)整個系統(tǒng)效率大幅提升,并解決在當(dāng)前計算設(shè)備網(wǎng)絡(luò)帶寬不足、內(nèi)存容量小等情況,而無法對較大規(guī)模數(shù)據(jù)進(jìn)行處理的問題。本發(fā)明提出一種基于小內(nèi)存處理大規(guī)模數(shù)據(jù)的并行程序開發(fā)方法,該發(fā)明中系統(tǒng)充分利用外存的大容量的特點(diǎn),動態(tài)調(diào)度計算數(shù)據(jù)給計算核心,達(dá)到計算的負(fù)載均衡,同時通信與計算異步執(zhí)行,提高系統(tǒng)整體的性能,滿足小內(nèi)存處理大數(shù)據(jù)的要求。
[0018]為了實(shí)現(xiàn)計算與I/O的更好的異步執(zhí)行,本發(fā)明中設(shè)計四個環(huán)形的隊(duì)列,隊(duì)列中根據(jù)數(shù)據(jù)塊存放數(shù)據(jù)的情況存放不同數(shù)據(jù)塊的ID。計算與I/O作為隊(duì)列的生產(chǎn)者或消費(fèi)者共同操作隊(duì)列。當(dāng)計算完成一個數(shù)據(jù)塊從隊(duì)列中再獲取另外的數(shù)據(jù)塊,實(shí)現(xiàn)了計算的負(fù)載均衡。
[0019]本發(fā)明充分利用外存容量大的特點(diǎn),將外存作為內(nèi)存的緩存來存儲暫時不用計算的數(shù)據(jù)。將整個計算數(shù)據(jù)劃分為合適的小數(shù)據(jù)塊,存放到外存中。只有當(dāng)需要計算到該數(shù)據(jù)塊時才將其調(diào)度到內(nèi)存中,實(shí)現(xiàn)了數(shù)據(jù)的動態(tài)調(diào)度,滿足了小內(nèi)存處理大數(shù)據(jù)的要求。
[0020]該方法的實(shí)現(xiàn)基于各種線程進(jìn)行,其中各種線程包括:
讀線程,該線程將外存中數(shù)據(jù)塊讀入到空的內(nèi)存數(shù)據(jù)塊中;
計算線程,該線程獲取一個已經(jīng)被讀線程讀入的數(shù)據(jù)塊,計算該數(shù)據(jù)塊并將計算結(jié)果寫入到空的數(shù)據(jù)塊內(nèi)存中。
[0021]寫線程,該線程獲取存有計算結(jié)果的數(shù)據(jù)塊,將該數(shù)據(jù)塊中的數(shù)據(jù)寫回到外存中的數(shù)據(jù)塊緩存區(qū)中。
[0022]環(huán)形隊(duì)列,存儲緩沖區(qū)的ID,線程從隊(duì)列中獲取要操作的緩沖區(qū)對應(yīng)的ID。
[0023]本發(fā)明通過讀線程、計算線程以及寫線程的異步并行執(zhí)行方法,使得計算與I/O最大限度的實(shí)現(xiàn)相互隱藏,充分利用外存的大容量來彌補(bǔ)內(nèi)存的容量的不足,且避免計算效率的降低。此系統(tǒng)上I/O與并行計算的異步執(zhí)行,提高了系統(tǒng)的整體的運(yùn)行效率和設(shè)備的利用率,滿足了高性能應(yīng)用的要求。
[0024]本系統(tǒng)具有一定的適用性,理論上此方法的設(shè)計可以適用于任何由于內(nèi)存過小而無法運(yùn)行的系統(tǒng)中,同時由于異步的方式也不會降低系統(tǒng)的計算效率,保證系統(tǒng)全負(fù)荷高效率的正常工作。
[0025]其具體實(shí)現(xiàn)過程為:
如圖1所示,在內(nèi)存和外存開辟數(shù)據(jù)空間,并劃分合適數(shù)量的數(shù)據(jù)塊,將任務(wù)數(shù)據(jù)讀入到劃分的外存數(shù)據(jù)塊中,計算與I/o線程操作不同的內(nèi)存數(shù)據(jù)塊與外存數(shù)據(jù)塊交互,使得計算該數(shù)據(jù)塊所需時間與I/o的時間盡可能的相等,如此計算與I/O的完全相互掩蓋,提高系統(tǒng)的效率。
[0026]讀、計算、寫線程異步并行,需要SR_BUF和DR_BUF,SR_BUF稱為源緩沖,DR_BUF稱為目標(biāo)緩沖。DR-BUF,SR_BUF均是由主線程開辟的內(nèi)存緩沖空間;BUF是一個連續(xù)的存儲空間,被分割成多份,每份稱為一個緩沖塊BUF_BLOCK,緩沖塊對應(yīng)一個基本數(shù)據(jù)塊的作業(yè)單位。讀線程與計算線程共同操作SR_BUF緩沖,計算線程與寫線程共同操作DR_BUF緩沖。
[0027]多線程與緩沖關(guān)系示意圖2,每個緩沖或隊(duì)列可容納兩個或多個緩沖對象,形成典型的“生產(chǎn)者一一消費(fèi)者”類型。
[0028]為了實(shí)現(xiàn)上述任務(wù)分發(fā)策略,設(shè)計如圖3所示的四個隊(duì)列:
SR_BUF_FULL_QUEUE:新的計算任務(wù)隊(duì)列,存放新讀入的等待計算的源數(shù)據(jù)塊的