本發(fā)明涉及并行計(jì)算領(lǐng)域,具體涉及一種異構(gòu)計(jì)算中的并行加速方法及系統(tǒng)。
背景技術(shù):
GPU(Graphic Processing Unit,圖形處理器),其主要用于進(jìn)行各種并行計(jì)算,如繪制計(jì)算機(jī)圖形所需的運(yùn)算,包括頂點(diǎn)設(shè)置、光影、像素操作等。GPU中,絕大部分的晶體管都用于實(shí)現(xiàn)計(jì)算執(zhí)行,只有很少的晶體管用于進(jìn)行邏輯控制、緩存等,從而使得GPU具有很強(qiáng)的計(jì)算能力,非常適合處理邏輯簡(jiǎn)單但運(yùn)算量巨大的計(jì)算任務(wù),如深度學(xué)習(xí)任務(wù)中普遍使用GPU器件計(jì)算每層神經(jīng)網(wǎng)絡(luò)模型參數(shù)。為了應(yīng)對(duì)越來越大的訓(xùn)練數(shù)據(jù)或越來越復(fù)雜的計(jì)算任務(wù),需要越來越多的GPU協(xié)同工作,才能在較短的時(shí)間內(nèi)完成計(jì)算任務(wù)。因此,GPU加速迫切需要,各GPU之間協(xié)同工作時(shí),通信時(shí)長(zhǎng)及通信帶寬是影響GPU加速的主要因素。
現(xiàn)有的GPU加速方法一般采用主從式加速方法,服務(wù)器中GPU的拓?fù)浣Y(jié)構(gòu)包含一個(gè)主節(jié)點(diǎn)及多個(gè)從節(jié)點(diǎn),如圖1所示。各GPU先接收待傳輸?shù)臄?shù)據(jù),再根據(jù)主從式加速方法的拓?fù)浣Y(jié)構(gòu)對(duì)各GPU包含數(shù)據(jù)進(jìn)行更新,具體更新時(shí),由于主節(jié)點(diǎn)的帶寬要求,每次僅能同時(shí)與少量從節(jié)點(diǎn)通信,如僅能與2個(gè)從節(jié)點(diǎn)通信,從節(jié)點(diǎn)先依次將自己的數(shù)據(jù)傳輸?shù)街鞴?jié)點(diǎn)上,當(dāng)所有從節(jié)點(diǎn)的數(shù)據(jù)傳輸結(jié)束后,主節(jié)點(diǎn)對(duì)從節(jié)點(diǎn)所有數(shù)據(jù)進(jìn)行匯總,然后再將匯總后的數(shù)據(jù)依次發(fā)給各從節(jié)點(diǎn)。通信結(jié)束后,各從節(jié)點(diǎn)得到自己及其它所有從節(jié)點(diǎn)的數(shù)據(jù),各GPU數(shù)據(jù)更新結(jié)束。
如圖1中,假設(shè)有8個(gè)從節(jié)點(diǎn),主節(jié)點(diǎn)每次僅能與2個(gè)從節(jié)點(diǎn)通信,則各GPU數(shù)據(jù)更新過程如下:第一次通信從節(jié)點(diǎn)1、從節(jié)點(diǎn)2將數(shù)據(jù)傳輸?shù)街鞴?jié)點(diǎn),第二次通信從節(jié)點(diǎn)3、從節(jié)點(diǎn)4將數(shù)據(jù)傳輸?shù)街鞴?jié)點(diǎn),第三次通信從節(jié)點(diǎn)5、從節(jié)點(diǎn)6將數(shù)據(jù)傳輸?shù)街鞴?jié)點(diǎn),第四次通信從節(jié)點(diǎn)7、從節(jié)點(diǎn)8將數(shù)據(jù)傳輸?shù)街鞴?jié)點(diǎn);所有從節(jié)點(diǎn)將數(shù)據(jù)傳輸?shù)街鞴?jié)點(diǎn)后,主節(jié)點(diǎn)對(duì)從節(jié)點(diǎn)數(shù)據(jù)匯總,分別傳輸給各從節(jié)點(diǎn);第五次通信主節(jié)點(diǎn)將匯總后的數(shù)據(jù)傳給從節(jié)點(diǎn)1、從節(jié)點(diǎn)2,第六次通信主節(jié)點(diǎn)將匯總后的數(shù)據(jù)傳給從節(jié)點(diǎn)3、從節(jié)點(diǎn)4,第七次通信主節(jié)點(diǎn)將匯總后的數(shù)據(jù)傳給從節(jié)點(diǎn)5、從節(jié)點(diǎn)6,第八次通信主節(jié)點(diǎn)將匯總后的數(shù)據(jù)傳給從節(jié)點(diǎn)7、從節(jié)點(diǎn)8。
該方法中每個(gè)從節(jié)點(diǎn)之間不能直接通信,需要每個(gè)從節(jié)點(diǎn)先與主節(jié)點(diǎn)通信,當(dāng)所有從節(jié)點(diǎn)與主節(jié)點(diǎn)通信結(jié)束后,再由主節(jié)點(diǎn)將得到的從節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行匯總后,依次傳輸給每個(gè)從節(jié)點(diǎn),這個(gè)過程對(duì)主節(jié)點(diǎn)的帶寬要求較高。主節(jié)點(diǎn)的帶寬越高,同時(shí)與主節(jié)點(diǎn)通信的從節(jié)點(diǎn)越多,但實(shí)際應(yīng)用中,由于硬件的限制,主節(jié)點(diǎn)的帶寬往往僅能允許同時(shí)與少量從節(jié)點(diǎn)通信;如果從節(jié)點(diǎn)較多,則各GPU完成一次數(shù)據(jù)更新的時(shí)間越長(zhǎng);如果主節(jié)點(diǎn)的帶寬不變,隨著從節(jié)點(diǎn)規(guī)模的增大,各GPU數(shù)據(jù)更新的時(shí)間會(huì)呈線性增加,從而嚴(yán)重影響了GPU的加速效率。如圖1中,假設(shè)有8個(gè)從節(jié)點(diǎn)時(shí),各GPU完成一次數(shù)據(jù)更新,共需要8個(gè)通信時(shí)長(zhǎng)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種異構(gòu)計(jì)算中的并行加速方法及系統(tǒng),以在提高GPU并行計(jì)算能力的同時(shí),降低各GPU節(jié)點(diǎn)的帶寬需求。
為此,本發(fā)明提供如下技術(shù)方案:
一種異構(gòu)計(jì)算中的并行加速方法,包括:
預(yù)先根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu);
所述拓?fù)浣Y(jié)構(gòu)中的各GPU獲取當(dāng)前任務(wù),并對(duì)所述當(dāng)前任務(wù)中的數(shù)據(jù)進(jìn)行計(jì)算,得到對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果;
各GPU將自己得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU,以使各GPU進(jìn)行數(shù)據(jù)更新;
各GPU得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU的計(jì)算結(jié)果后,開始執(zhí)行下一任務(wù)。
優(yōu)選地,所述GPU的個(gè)數(shù)為2的指數(shù)次方。
優(yōu)選地,所述根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸拓?fù)浣Y(jié)構(gòu)包括:
如果GPU的總數(shù)為2,則所述拓?fù)浣Y(jié)構(gòu)為包含兩個(gè)節(jié)點(diǎn)的一條邊,每個(gè)節(jié)點(diǎn)為一個(gè)GPU;
如果GPU的總數(shù)為4,則所述拓?fù)浣Y(jié)構(gòu)為四邊形結(jié)構(gòu),所述四邊形中每個(gè)節(jié)點(diǎn)為一個(gè)GPU;
如果GPU的總數(shù)為8,則所述拓?fù)浣Y(jié)構(gòu)為立方體結(jié)構(gòu),每個(gè)立方體的節(jié)點(diǎn)為一個(gè)GPU;
如果GPU的總數(shù)是8的n倍,n為大于或等于2的偶數(shù),則所述拓?fù)浣Y(jié)構(gòu)為n個(gè)立方體結(jié)構(gòu),每個(gè)立方體的節(jié)點(diǎn)為一個(gè)GPU。
優(yōu)選地,所述方法還包括:
如果所述GPU的個(gè)數(shù)不是2的指數(shù)次方,則通過增加或刪除GPU,使GPU的總數(shù)為2的指數(shù)次方。
優(yōu)選地,所述各GPU將自己得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU包括:
如果所述拓?fù)浣Y(jié)構(gòu)為包含兩個(gè)節(jié)點(diǎn)的一條邊,則兩個(gè)節(jié)點(diǎn)分別將各自得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果發(fā)送給對(duì)方;
如果所述拓?fù)浣Y(jié)構(gòu)為四邊形結(jié)構(gòu),則預(yù)先設(shè)定四邊形中任意兩個(gè)相鄰節(jié)點(diǎn)為固定節(jié)點(diǎn);在進(jìn)行數(shù)據(jù)分享時(shí),所述固定節(jié)點(diǎn)先將自己對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果發(fā)送給其相鄰節(jié)點(diǎn),然后兩固定節(jié)點(diǎn)之間、兩固定節(jié)點(diǎn)的相鄰節(jié)點(diǎn)之間進(jìn)行通信,將各自對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果以及得到的各自相鄰節(jié)點(diǎn)的計(jì)算結(jié)果一起發(fā)送給對(duì)方;
如果所述拓?fù)浣Y(jié)構(gòu)為一個(gè)立方體結(jié)構(gòu),則預(yù)先設(shè)定立方體中的任意兩個(gè)相對(duì)面為固定面;在進(jìn)行數(shù)據(jù)分享時(shí),所述固定面中各節(jié)點(diǎn)先按照所述四邊形結(jié)構(gòu)中的節(jié)點(diǎn)通信方式進(jìn)行通信,得到同一面上所有其它節(jié)點(diǎn)的計(jì)算結(jié)果,然后兩個(gè)相對(duì)固定面之間對(duì)應(yīng)的節(jié)點(diǎn)進(jìn)行通信,將各自對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果以及得到的同一面上所有其它節(jié)點(diǎn)的計(jì)算結(jié)果一起發(fā)送給對(duì)方;
如果所述拓?fù)浣Y(jié)構(gòu)為多個(gè)立方體結(jié)構(gòu),則預(yù)先將所述多個(gè)立方體兩兩組成立方體對(duì);在進(jìn)行數(shù)據(jù)分享時(shí),每個(gè)立方體對(duì)中的兩個(gè)立方體中的節(jié)點(diǎn)各自先按照所述立方體結(jié)構(gòu)中的節(jié)點(diǎn)通信方式進(jìn)行通信,得到同一立方體中所有其它節(jié)點(diǎn)的計(jì)算結(jié)果,然后每個(gè)立方體對(duì)中的兩個(gè)立方體之間對(duì)應(yīng)節(jié)點(diǎn)進(jìn)行通信,得到該立方體對(duì)中所有其它節(jié)點(diǎn)的計(jì)算結(jié)果;最后不同立方體對(duì)之間相對(duì)應(yīng)的節(jié)點(diǎn)進(jìn)行通信,將各自對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果以及得到的其它立方體對(duì)中所有其它節(jié)點(diǎn)的計(jì)算結(jié)果一起發(fā)送給對(duì)方。
一種異構(gòu)計(jì)算中的并行加速系統(tǒng),包括多個(gè)執(zhí)行并行運(yùn)算的GPU、設(shè)置模塊;
所述設(shè)置模塊用于預(yù)先根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu);
所述GPU包括:控制單元、計(jì)算單元、存儲(chǔ)單元;
所述控制單元,用于獲取待處理任務(wù),并將所述待處理任務(wù)保存在所述存儲(chǔ)單元中;
所述計(jì)算單元,用于從所述存儲(chǔ)單元中獲取當(dāng)前任務(wù),對(duì)當(dāng)前任務(wù)中的數(shù)據(jù)進(jìn)行計(jì)算,得到對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果,并將所述計(jì)算結(jié)果存儲(chǔ)到所述存儲(chǔ)單元中;
所述控制單元,還用于從所述存儲(chǔ)單元中獲取對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果,并將該計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU,以使各GPU進(jìn)行數(shù)據(jù)更新,并在得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU的計(jì)算結(jié)果后,觸發(fā)所述計(jì)算單元開始執(zhí)行下一任務(wù)。
優(yōu)選地,所述GPU的個(gè)數(shù)為2的指數(shù)次方。
優(yōu)選地,所述設(shè)置模塊具體用于:
在GPU的總數(shù)為2時(shí),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為包含兩個(gè)節(jié)點(diǎn)的一條邊,每個(gè)節(jié)點(diǎn)為一個(gè)GPU;
在GPU的總數(shù)為4時(shí),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為四邊形結(jié)構(gòu),所述四邊形中每個(gè)節(jié)點(diǎn)為一個(gè)GPU;
在GPU的總數(shù)為8時(shí),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為立方體結(jié)構(gòu),每個(gè)立方體的節(jié)點(diǎn)為一個(gè)GPU;
在GPU的總數(shù)是8的n倍,n為大于或等于2的偶數(shù),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為n個(gè)立方體結(jié)構(gòu),每個(gè)立方體的節(jié)點(diǎn)為一個(gè)GPU。
優(yōu)選地,所述設(shè)置模塊還用于在所述GPU的個(gè)數(shù)不是2的指數(shù)次方時(shí),增加或刪除GPU,使GPU的總數(shù)為2的指數(shù)次方。
優(yōu)選地,所述拓?fù)浣Y(jié)構(gòu)中的GPU設(shè)置在一個(gè)或多個(gè)服務(wù)器中。
本發(fā)明實(shí)施例提供的異構(gòu)計(jì)算中的并行加速方法及系統(tǒng),預(yù)先根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu);所述拓?fù)浣Y(jié)構(gòu)中的各GPU獲取當(dāng)前任務(wù),并對(duì)所述當(dāng)前任務(wù)中的數(shù)據(jù)進(jìn)行計(jì)算,得到對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果;各GPU將自己得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU;各GPU得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU的計(jì)算結(jié)果后,開始執(zhí)行下一任務(wù)。由于多個(gè)GPU同時(shí)并行處理數(shù)據(jù)從而大大提高了數(shù)據(jù)的處理速度。數(shù)據(jù)并行處理過程中,各GPU在每批數(shù)據(jù)處理結(jié)束后與拓?fù)浣Y(jié)構(gòu)中其它GPU之間相互通信,使每個(gè)GPU都能獲取到其它GPU的數(shù)據(jù)信息,然后再繼續(xù)處理下一批數(shù)據(jù),降低各GPU節(jié)點(diǎn)的帶寬需求。
附圖說明
為了更清楚地說明本申請(qǐng)實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是現(xiàn)有技術(shù)中主從式多GPU加速的拓?fù)浣Y(jié)構(gòu)示意圖;
圖2是本發(fā)明實(shí)施例異構(gòu)計(jì)算中的并行加速方法的流程圖;
圖3是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為包含兩個(gè)節(jié)點(diǎn)的一條邊的示意圖;
圖4是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為四邊形結(jié)構(gòu)的示意圖;
圖5是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為一個(gè)立方體結(jié)構(gòu)的示意圖;
圖6是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為兩個(gè)立方體結(jié)構(gòu)的示意圖;
圖7是本發(fā)明實(shí)施例中GPU各單元的工作流程示意圖。
具體實(shí)施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明實(shí)施例的方案,下面結(jié)合附圖和實(shí)施方式對(duì)本發(fā)明實(shí)施例作進(jìn)一步的詳細(xì)說明。
如圖2所示,是本發(fā)明實(shí)施例異構(gòu)計(jì)算中的并行加速方法的流程圖,包括以下步驟:
步驟201,預(yù)先根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸拓?fù)浣Y(jié)構(gòu)。
所述GPU可以存在一個(gè)服務(wù)器中,也可以存在多個(gè)服務(wù)器中,GPU的個(gè)數(shù)為2的指數(shù)次方,具體個(gè)數(shù)可以根據(jù)實(shí)際應(yīng)用需求預(yù)先確定,對(duì)此本發(fā)明實(shí)施例不做限定。
本發(fā)明實(shí)施例中,所述GPU之間數(shù)據(jù)傳輸拓?fù)浣Y(jié)構(gòu)主要針對(duì)GPU的總數(shù)為2的指數(shù)次方的情況,如2的3次方共8個(gè)GPU,2的4次方共16個(gè)GPU等,如果GPU的總數(shù)不為2的指數(shù)次方,則需要增加或刪除相應(yīng)的GPU。
具體拓?fù)浣Y(jié)構(gòu)確定過程如下所述:
步1)判斷GPU的總數(shù)是否大于等于8;如果是,執(zhí)行步4);否則,執(zhí)行步2);
步2)判斷GPU的總數(shù)是否為4;如果是,則GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu)為四邊形,所述四邊形中每個(gè)節(jié)點(diǎn)為一個(gè)GPU;否則,執(zhí)行步3);
步3)判斷GPU的總數(shù)是否為2;如果是,則GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu)為包含兩個(gè)節(jié)點(diǎn)的一條邊,每個(gè)節(jié)點(diǎn)為一個(gè)GPU;否則,執(zhí)行步6);
步4)判斷GPU的總數(shù)是否為2的指數(shù)次方,所述指數(shù)大于等于3,如果是,執(zhí)行步5),否則,執(zhí)行步6);
步5)計(jì)算GPU的總數(shù)除以8,得到第一計(jì)算值,并根據(jù)所述第一計(jì)算值,確定各GPU之間的拓?fù)浣Y(jié)構(gòu);
具體計(jì)算時(shí),直接使用GPU總數(shù)除以8即可得到具體倍數(shù),如2倍;如果GPU總數(shù)為8的1倍,則服務(wù)器中各GPU之間的拓?fù)浣Y(jié)構(gòu)為立方體結(jié)構(gòu),每個(gè)立方體的節(jié)點(diǎn)為一個(gè)GPU;如果GPU總數(shù)為8的多倍,則各GPU之間的拓?fù)浣Y(jié)構(gòu)為多個(gè)立方體結(jié)構(gòu),每個(gè)立方體上的節(jié)點(diǎn)表示一個(gè)GPU,所述立方體的個(gè)數(shù)與所述倍數(shù)相等;如GPU總數(shù)為16個(gè),即為8的2倍,則各GPU之間的拓?fù)浣Y(jié)構(gòu)為2個(gè)立方體,每個(gè)立方體上的節(jié)點(diǎn)表示一個(gè)GPU,共16個(gè)節(jié)點(diǎn);
步6)增加或刪除相應(yīng)GPU,使GPU的總數(shù)滿足2的指數(shù)次方。
步驟202,所述拓?fù)浣Y(jié)構(gòu)中的各GPU獲取當(dāng)前任務(wù),并對(duì)所述當(dāng)前任務(wù)中的數(shù)據(jù)進(jìn)行計(jì)算,得到對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果。
在實(shí)際應(yīng)用中,各GPU的任務(wù)可以由服務(wù)器中的CPU實(shí)時(shí)分配,也可以由CPU預(yù)先將任務(wù)分配到內(nèi)存中,由CPU將內(nèi)存地址傳給GPU,由GPU到相應(yīng)內(nèi)存地址中讀取。
需要說明的是,GPU中數(shù)據(jù)的讀取及計(jì)算由單線程,也可以由兩個(gè)并行的線程來完成,對(duì)此本發(fā)明實(shí)施例不做限定。
為了進(jìn)一步提高系統(tǒng)整體計(jì)算效率,在進(jìn)行系統(tǒng)配置時(shí),可以盡量使各GPU的計(jì)算能力及存儲(chǔ)能力保持一致,并保持各GPU的負(fù)載均衡,即分配給各GPU的任務(wù)的運(yùn)算量大致相同。
步驟203,各GPU將自己得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU,以使各GPU進(jìn)行數(shù)據(jù)更新。
各GPU可根據(jù)確定的拓?fù)浣Y(jié)構(gòu)將自己得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU,需要說明的是,不同GPU之間的通信是雙向的,即相互通信的兩個(gè)GPU可以同時(shí)將自己的數(shù)據(jù)傳送給對(duì)方,這樣僅需要一次通信,通信的兩個(gè)GPU就都可以得到對(duì)方節(jié)點(diǎn)的數(shù)據(jù)。GPU的拓?fù)浣Y(jié)構(gòu)保證了各GPU之間完成一次數(shù)據(jù)更新所需通信時(shí)長(zhǎng)與GPU數(shù)量呈對(duì)數(shù)增長(zhǎng),每次數(shù)據(jù)更新結(jié)束后需要的通信時(shí)長(zhǎng)為log2N,其中N為GPU總數(shù)。
下面結(jié)合前面介紹的各種不同拓?fù)浣Y(jié)構(gòu),詳細(xì)說明各拓?fù)浣Y(jié)構(gòu)中GPU進(jìn)行數(shù)據(jù)更新的過程。
如圖3所示,是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為包含兩個(gè)節(jié)點(diǎn)的一條邊的示意圖。
在該拓?fù)浣Y(jié)構(gòu)中,GPU1和GPU2直接進(jìn)行通信,即可完成兩個(gè)GPU之間的數(shù)據(jù)傳送。GPU1在收到GPU2傳送的數(shù)據(jù)后,GPU1的數(shù)據(jù)更新完成,繼續(xù)執(zhí)行下一任務(wù);GPU2在收到GPU1傳送的數(shù)據(jù)后,GPU2的數(shù)據(jù)更新完成,繼續(xù)處理下一任務(wù)。
如圖4所示,是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為四邊形結(jié)構(gòu)的示意圖。
在該拓?fù)浣Y(jié)構(gòu)中,需要預(yù)先設(shè)定四邊形中任意兩個(gè)相鄰節(jié)點(diǎn)為固定節(jié)點(diǎn),四邊形中另兩個(gè)節(jié)點(diǎn)為這兩個(gè)固定節(jié)點(diǎn)的相鄰節(jié)點(diǎn)。各GPU進(jìn)行數(shù)據(jù)更新時(shí),四邊形中的固定節(jié)點(diǎn)分別與各自的相鄰節(jié)點(diǎn)進(jìn)行通信,以將自己得到的計(jì)算結(jié)果傳送給相鄰節(jié)點(diǎn),數(shù)據(jù)傳送完成后,每個(gè)固定節(jié)點(diǎn)都得到各自相鄰節(jié)點(diǎn)的數(shù)據(jù);最后,固定節(jié)點(diǎn)之間、固定節(jié)點(diǎn)的相鄰節(jié)點(diǎn)之間進(jìn)行通信,通信結(jié)束后,各節(jié)點(diǎn)都得到了四邊形中所有其它節(jié)點(diǎn)的數(shù)據(jù),數(shù)據(jù)更新結(jié)束。在這種拓?fù)浣Y(jié)構(gòu)中,完成一次數(shù)據(jù)更新共需要兩個(gè)通信時(shí)長(zhǎng),即log24=2。
例如圖4中,預(yù)先確定GPU1和GPU3為固定節(jié)點(diǎn),則GPU2為GPU1的相鄰節(jié)點(diǎn),GPU4為GPU3的相鄰節(jié)點(diǎn)。GPU1與GPU2、GPU3與GPU4之間可以同時(shí)進(jìn)行通信,通信結(jié)束后,各節(jié)點(diǎn)都得到自己及相鄰節(jié)點(diǎn)的數(shù)據(jù);最后GPU1與GPU3、GPU2與GPU4之間可以同時(shí)進(jìn)行通信,通信結(jié)束后,各節(jié)點(diǎn)都得到四邊形中所有節(jié)點(diǎn)的數(shù)據(jù),拓?fù)浣Y(jié)構(gòu)中各GPU數(shù)據(jù)更新結(jié)束。
如圖5所示,是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為一個(gè)立方體結(jié)構(gòu)的示意圖。
在該拓?fù)浣Y(jié)構(gòu)中,需要預(yù)先將立方體中任意兩個(gè)相對(duì)面作為固定面,則該固定面為前面圖4所述的四邊形結(jié)構(gòu)。各GPU進(jìn)行數(shù)據(jù)更新時(shí),兩個(gè)固定面中的各GPU按照四邊形結(jié)構(gòu)中各GPU的數(shù)據(jù)更新方法進(jìn)行通信,通信結(jié)束后,相對(duì)兩個(gè)平面上各節(jié)點(diǎn)分別得到同一四邊形中所有節(jié)點(diǎn)的數(shù)據(jù);最后所述相對(duì)兩個(gè)平面之間相對(duì)應(yīng)的節(jié)點(diǎn)可以同時(shí)進(jìn)行通信,這樣立方體中各節(jié)點(diǎn)都得到立方體中所有其它節(jié)點(diǎn)的數(shù)據(jù),拓?fù)浣Y(jié)構(gòu)中各GPU數(shù)據(jù)更新結(jié)束。在這種拓?fù)浣Y(jié)構(gòu)中,完成一次數(shù)據(jù)更新共需要3個(gè)通信時(shí)長(zhǎng),即log28=3。
例如圖5中,為方便起見,將GPU雙向通信的線簡(jiǎn)化成了沒有箭頭的線來表示。預(yù)先將立方體上下兩個(gè)面作為固定面,上下兩個(gè)面中的各節(jié)點(diǎn)分別按照四邊形拓?fù)渲懈鱃PU的數(shù)據(jù)更新方法進(jìn)行通信,即在立方體上下兩個(gè)面中分別確定四個(gè)固定節(jié)點(diǎn),如確定GPU1、GPU3、GPU5、GPU7為固定節(jié)點(diǎn),則GPU2、GPU4、GPU6、GPU8分別為相應(yīng)固定節(jié)點(diǎn)的相鄰節(jié)點(diǎn),在上下兩個(gè)面上,固定節(jié)點(diǎn)先與其相鄰節(jié)點(diǎn)同時(shí)進(jìn)行通信,即GPU1與GPU2、GPU3與GPU4、GPU5與GPU6、GPU7與GPU8之間同時(shí)進(jìn)行通信,通信結(jié)束后,各節(jié)點(diǎn)分別得到其相鄰節(jié)點(diǎn)的數(shù)據(jù);然后上下兩個(gè)面上,固定節(jié)點(diǎn)之間及固定節(jié)點(diǎn)的相鄰節(jié)點(diǎn)之間同時(shí)進(jìn)行通信,即GPU1與GPU3、GPU5與GPU7、GPU2與GPU4、GPU6與GPU8之間同時(shí)進(jìn)行通信,通信結(jié)束后,上下兩個(gè)平面上的節(jié)點(diǎn)分別得到同一四邊形中所有其它節(jié)點(diǎn)的數(shù)據(jù);最后上下兩個(gè)平面之間的對(duì)應(yīng)節(jié)點(diǎn)同時(shí)進(jìn)行通信,即GPU1與GPU5、GPU2與GPU6、GPU3與GPU7、GPU4與GPU8之間同時(shí)進(jìn)行通信,通信結(jié)束后,立方體內(nèi)各節(jié)點(diǎn)得到所有其它節(jié)點(diǎn)的數(shù)據(jù),拓?fù)浣Y(jié)構(gòu)中各GPU數(shù)據(jù)更新結(jié)束。
如圖6所示,是本發(fā)明實(shí)施例中拓?fù)浣Y(jié)構(gòu)為兩個(gè)立方體結(jié)構(gòu)的示意圖。
在該拓?fù)浣Y(jié)構(gòu)中,GPU進(jìn)行數(shù)據(jù)更新時(shí),各立方體內(nèi)節(jié)點(diǎn)先進(jìn)行通信,具體方法圖5中通信方法相同,各立方體內(nèi)節(jié)點(diǎn)通信可以同時(shí)進(jìn)行,立方體內(nèi)節(jié)點(diǎn)通信結(jié)束后,每個(gè)立方體內(nèi)的節(jié)點(diǎn)得到該立方體內(nèi)所有其它節(jié)點(diǎn)的數(shù)據(jù);然后立方體之間對(duì)應(yīng)節(jié)點(diǎn)進(jìn)行通信,通信結(jié)束后,立方體內(nèi)各節(jié)點(diǎn)得到該拓?fù)浣Y(jié)構(gòu)中所有其它節(jié)點(diǎn)的數(shù)據(jù),GPU數(shù)據(jù)更新結(jié)束。
例如圖6中,GPU數(shù)據(jù)更新時(shí),先分別完成各立方體內(nèi)節(jié)點(diǎn)之間的通信,需要3次通信時(shí)長(zhǎng);通信結(jié)束后,兩個(gè)立方體之間相對(duì)應(yīng)的節(jié)點(diǎn)通信;僅需要一次通信時(shí)長(zhǎng)即可完成所有節(jié)點(diǎn)的通信,通信結(jié)束后,各節(jié)點(diǎn)都得到自己及拓?fù)浣Y(jié)構(gòu)中其它節(jié)點(diǎn)的數(shù)據(jù),GPU數(shù)據(jù)更新結(jié)束。16個(gè)節(jié)點(diǎn)的拓?fù)浣Y(jié)構(gòu)完成各GPU之間數(shù)據(jù)更新時(shí),需要4個(gè)通信時(shí)長(zhǎng),即log216=4。
需要說明的是,在有多個(gè)立方體的拓?fù)浣Y(jié)構(gòu)中,需要預(yù)先設(shè)定立方體對(duì),由于GPU的總數(shù)為2的指數(shù)次方,因此所述立方體對(duì)的個(gè)數(shù)為N/2,其中N為拓?fù)浣Y(jié)構(gòu)中立方體的總數(shù),不同立方體對(duì)內(nèi)的立方體不同。在進(jìn)行數(shù)據(jù)更新時(shí),各立方體對(duì)中的節(jié)點(diǎn)先按照?qǐng)D6中的通信方式進(jìn)行通信,通信結(jié)束后,每個(gè)立方體對(duì)中的各節(jié)點(diǎn)得到該立方體對(duì)內(nèi)的所有其它節(jié)點(diǎn)的數(shù)據(jù),然后,不同立方體對(duì)之間相對(duì)應(yīng)的節(jié)點(diǎn)進(jìn)行通信,通信結(jié)束后,各節(jié)點(diǎn)都得到該拓?fù)浣Y(jié)構(gòu)中所有其它節(jié)點(diǎn)的數(shù)據(jù),GPU數(shù)據(jù)更新結(jié)束。
另外,需要說明的是,在實(shí)際應(yīng)用中,也可以不限定立方體的個(gè)數(shù),比如有3個(gè)立方體,在這種情況下,在進(jìn)行數(shù)據(jù)更新時(shí),組成立方體對(duì)的各立方體中的節(jié)點(diǎn)按照上述通信方式進(jìn)行通信,通信結(jié)束后,各立方體對(duì)中的各節(jié)點(diǎn)都得到各立方體對(duì)中所有其它節(jié)點(diǎn)的數(shù)據(jù),然后剩余的未成對(duì)立方體中的各節(jié)點(diǎn)還需要分別與所有立方體對(duì)中的各立方體中的相應(yīng)節(jié)點(diǎn)進(jìn)行通信,以使所有立方體對(duì)中的各立方體中的相應(yīng)節(jié)點(diǎn)得到該未成對(duì)立方體中的各節(jié)點(diǎn)的數(shù)據(jù)。
步驟204,各GPU得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU針對(duì)當(dāng)前任務(wù)的計(jì)算結(jié)果后,開始執(zhí)行下一任務(wù)。
需要說明的是,上述各拓?fù)浣Y(jié)構(gòu)中的各GPU可以位于同一服務(wù)器中,也可以位于不同的服務(wù)器中,比如,圖5所示立方體結(jié)構(gòu)中的8個(gè)GPU可以分設(shè)于兩個(gè)服務(wù)器中。同一服務(wù)器的GPU之間的通信可以采用內(nèi)部協(xié)議,不同服務(wù)器中的GPU之間的通信可以采用外部協(xié)議。另外,所述拓?fù)浣Y(jié)構(gòu)中的各GPU并行獨(dú)立工作,在該GPU得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU針對(duì)當(dāng)前任務(wù)的計(jì)算結(jié)果后,即可開始執(zhí)行下一任務(wù),而不用關(guān)心其它GPU是否可以開始執(zhí)行下一任務(wù),因此不僅提高了數(shù)據(jù)處理速度,而且大大降低了通信帶寬需求。
本發(fā)明實(shí)施例提供的異構(gòu)計(jì)算中的并行加速方法,預(yù)先根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu);所述拓?fù)浣Y(jié)構(gòu)中的各GPU獲取當(dāng)前任務(wù),并對(duì)所述當(dāng)前任務(wù)中的數(shù)據(jù)進(jìn)行計(jì)算,得到對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果;各GPU將自己得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU;各GPU得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU的計(jì)算結(jié)果后,開始執(zhí)行下一任務(wù)。由于多個(gè)GPU同時(shí)并行處理數(shù)據(jù)從而大大提高了數(shù)據(jù)的處理速度。數(shù)據(jù)并行處理過程中,各GPU在每批數(shù)據(jù)處理結(jié)束后與拓?fù)浣Y(jié)構(gòu)中其它GPU之間相互通信,使每個(gè)GPU都能獲取到其它GPU的數(shù)據(jù)信息,然后再繼續(xù)處理下一批數(shù)據(jù),降低各GPU節(jié)點(diǎn)的帶寬需求。
相應(yīng)地,本發(fā)明實(shí)施例還提供一種異構(gòu)計(jì)算中的并行加速系統(tǒng),該系統(tǒng)包括多個(gè)執(zhí)行并行運(yùn)算的GPU、設(shè)置模塊,其中,所述設(shè)置模塊用于預(yù)先根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu)。每個(gè)GPU均包括:控制單元、計(jì)算單元、存儲(chǔ)單元。
如圖7所示,是本發(fā)明實(shí)施例中GPU各單元的工作流程示意圖。
其中,控制單元獲取待處理任務(wù),并將所述待處理任務(wù)保存在存儲(chǔ)單元中;計(jì)算單元從所述存儲(chǔ)單元中獲取當(dāng)前任務(wù),對(duì)當(dāng)前任務(wù)中的數(shù)據(jù)進(jìn)行計(jì)算,得到對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果,并將所述計(jì)算結(jié)果存儲(chǔ)到存儲(chǔ)單元中;控制單元從所述存儲(chǔ)單元中獲取對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果,并將該計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU(圖7中僅示出了兩個(gè)GPU的情況),以使各GPU進(jìn)行數(shù)據(jù)更新,并在得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU的計(jì)算結(jié)果后,觸發(fā)計(jì)算單元開始執(zhí)行下一任務(wù)。計(jì)算單元執(zhí)行下一任務(wù)的過程與上述相同,依此類推,直至所述待處理任務(wù)全部處理完畢。
需要說明的是,上述待處理任務(wù)可以由CPU分配給各GPU,比如將對(duì)應(yīng)各GPU的待處理任務(wù)存儲(chǔ)到不同的內(nèi)存中,各GPU的控制單元從相應(yīng)內(nèi)存中獲取自己的待處理任務(wù)。
另外需要說明的是,在實(shí)際應(yīng)用中,所述拓?fù)浣Y(jié)構(gòu)中的多個(gè)GPU可以分布于同一服務(wù)器中,也可以分布于不同的服務(wù)器中,對(duì)此本發(fā)明不做限定。分布于同一服務(wù)器中的GPU之間的數(shù)據(jù)傳輸可以采用內(nèi)部協(xié)議,分布于不同服務(wù)器中的GPU之間的數(shù)據(jù)傳輸可以采用外部協(xié)議。
為了更經(jīng)濟(jì)地平衡處理速度與帶寬需求的沖突,在實(shí)際應(yīng)用中,可以優(yōu)選地使拓?fù)浣Y(jié)構(gòu)中GPU的個(gè)數(shù)為2的指數(shù)次方。如果不滿足該條件,可以通過設(shè)置模塊增加或刪除相應(yīng)的GPU,使GPU的總數(shù)為2的指數(shù)次方。
相應(yīng)地,在設(shè)置模塊確定GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu)時(shí),可以針對(duì)GPU數(shù)量的不同,設(shè)置相應(yīng)的拓?fù)浣Y(jié)構(gòu),比如:在GPU的總數(shù)為2時(shí),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為包含兩個(gè)節(jié)點(diǎn)的一條邊,每個(gè)節(jié)點(diǎn)為一個(gè)GPU;在GPU的總數(shù)為4時(shí),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為四邊形結(jié)構(gòu),所述四邊形中每個(gè)節(jié)點(diǎn)為一個(gè)GPU;在GPU的總數(shù)為8時(shí),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為立方體結(jié)構(gòu),每個(gè)立方體的節(jié)點(diǎn)為一個(gè)GPU;在GPU的總數(shù)是8的n倍,n為整數(shù),并且n>1時(shí),設(shè)置所述拓?fù)浣Y(jié)構(gòu)為n個(gè)立方體結(jié)構(gòu),每個(gè)立方體的節(jié)點(diǎn)為一個(gè)GPU。
針對(duì)上述各種拓?fù)浣Y(jié)構(gòu),其中的GPU進(jìn)行數(shù)據(jù)傳輸?shù)姆椒ㄒ言谇懊嬗性敿?xì)說明,在此不再贅述。需要說明的是,在所述拓?fù)浣Y(jié)構(gòu)為四邊形結(jié)構(gòu)的情況下,所述設(shè)置模塊還需要預(yù)先設(shè)定四邊形中任意兩個(gè)相鄰節(jié)點(diǎn)為固定節(jié)點(diǎn);在所述拓?fù)浣Y(jié)構(gòu)為一個(gè)立方體結(jié)構(gòu)的情況下,所述設(shè)置模塊還需要預(yù)先設(shè)定立方體中的任意兩個(gè)相對(duì)面為固定面;在所述拓?fù)浣Y(jié)構(gòu)為多個(gè)立方體結(jié)構(gòu)的情況下,所述設(shè)置模塊還需要預(yù)先將所述多個(gè)立方體兩兩組成立方體對(duì)。
當(dāng)然,在所述拓?fù)浣Y(jié)構(gòu)中,每個(gè)節(jié)點(diǎn)上的GPU都對(duì)應(yīng)有一個(gè)唯一的ID,不同節(jié)點(diǎn)間進(jìn)行通信時(shí),需要將自己的ID以及傳送的數(shù)據(jù)對(duì)應(yīng)的GPU的ID,一并傳送給對(duì)方節(jié)點(diǎn)。這樣,每個(gè)節(jié)點(diǎn)上的GPU收到數(shù)據(jù)后,可以通過相應(yīng)的ID得知已經(jīng)收到該拓?fù)浣Y(jié)構(gòu)中哪些GPU上的數(shù)據(jù),未收到哪些GPU的數(shù)據(jù)。
當(dāng)然,也可以分別為每個(gè)GPU設(shè)置相應(yīng)標(biāo)志位,當(dāng)接收到相應(yīng)GPU的數(shù)據(jù)后,更改該GPU的標(biāo)志位,以表示當(dāng)前GPU已經(jīng)接收相應(yīng)標(biāo)志位對(duì)應(yīng)的GPU所發(fā)送的數(shù)據(jù);所述更改GPU標(biāo)志位如將GPU標(biāo)志位將0改為1。當(dāng)前GPU通過查找每個(gè)GPU對(duì)應(yīng)標(biāo)志位,即可知道接收了哪些GPU的數(shù)據(jù),未接收哪些GPU的數(shù)據(jù)。
本發(fā)明實(shí)施例提供的異構(gòu)計(jì)算中的并行加速系統(tǒng),預(yù)先根據(jù)GPU的個(gè)數(shù)確定GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu);所述拓?fù)浣Y(jié)構(gòu)中的各GPU獲取當(dāng)前任務(wù),并對(duì)所述當(dāng)前任務(wù)中的數(shù)據(jù)進(jìn)行計(jì)算,得到對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果;各GPU將自己得到的對(duì)應(yīng)當(dāng)前任務(wù)的計(jì)算結(jié)果分享給所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU;各GPU得到所述拓?fù)浣Y(jié)構(gòu)中的所有其它GPU的計(jì)算結(jié)果后,開始執(zhí)行下一任務(wù)。由于多個(gè)GPU同時(shí)并行處理數(shù)據(jù)從而大大提高了數(shù)據(jù)的處理速度。數(shù)據(jù)并行處理過程中,各GPU在每批數(shù)據(jù)處理結(jié)束后與拓?fù)浣Y(jié)構(gòu)中其它GPU之間相互通信,使每個(gè)GPU都能獲取到其它GPU的數(shù)據(jù)信息,然后再繼續(xù)處理下一批數(shù)據(jù),降低各GPU節(jié)點(diǎn)的帶寬需求。
另外,本發(fā)明實(shí)施例提供的GPU之間數(shù)據(jù)傳輸?shù)耐負(fù)浣Y(jié)構(gòu)保證了不同節(jié)點(diǎn)之間完成一次數(shù)據(jù)更新需要的通信時(shí)長(zhǎng)與GPU的數(shù)量呈對(duì)數(shù)關(guān)系,并且沒有主次節(jié)點(diǎn)之分,各GPU節(jié)點(diǎn)的帶寬需求平等,對(duì)各GPU的帶寬要求較低,因此,本發(fā)明實(shí)施例的方法及系統(tǒng)可以在GPU通信帶寬較低、通信時(shí)長(zhǎng)較少的情況下完成各GPU的數(shù)據(jù)更新,大大提高了GPU的加速效率。
本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見即可,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
以上對(duì)本發(fā)明實(shí)施例進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體實(shí)施方式對(duì)本發(fā)明進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及系統(tǒng);同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。