本發(fā)明涉及一種粒子群優(yōu)化方法,屬于計算機數(shù)據(jù)處理領(lǐng)域,具體涉及一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法。
背景技術(shù):
粒子群優(yōu)化(Particle Swarm Optimization,PSO)算法是一種演化計算技術(shù),由于其概念簡單、易于實現(xiàn),同時又具備較強的全局搜索及收斂能力等特點,而得到了快速的發(fā)展和廣泛的應(yīng)用。目前已出現(xiàn)各種并行PSO算法版本,這其中,針對CUDA并行架構(gòu),對線程的分配方案主要有兩種:1)一個線程對應(yīng)一個粒子;2)一個線程對應(yīng)一個維度,一個Block對應(yīng)一個粒子。第一種粗粒度并行方法,雖然已經(jīng)取得了不錯的加速比,但由于每個線程中粒子所對應(yīng)的每個維度仍然是串行執(zhí)行的,并行程度并不高。第二種細粒度并行方式在第一種的前提下做了改進,將每個粒子對應(yīng)到每個Block,再將每個Blcok中的線程對應(yīng)到每個粒子中的一個維度。這樣無疑加大了
并行程度,但值得注意的是,在CUDA并行程序中,所有的Block是被串行的分配到每一個流多處理器上的,還可以繼續(xù)提高并行度。
GPU是一種專用的圖形渲染設(shè)備。最初GPU是專用于圖形處理的硬件,然而自從2006年以來,越來越多的研究人員研究了利用GPU進行通用計算的GPGPU領(lǐng)域,各大廠商也推出了專用的GPGPU語言,比如CUDA、OPENCL等。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是優(yōu)化原有基于GPU的計算方法,調(diào)整其并行架構(gòu)使之并行效率更高,設(shè)計出一套改進的CUDA并行架構(gòu)方式,利用圖像處理器(GPU)加速執(zhí)行,使得粒子群算法在單個主機上的并行度進一步的提高,相比前兩種方法在CPU加速比的倍數(shù)上提高了40之多。
為了解決上述問題,本發(fā)明的方案是:
一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,
將每個粒子的維度劃分為若干個線程束,使用線程塊來包含所述線程束,使得一個線程塊中對應(yīng)一個或多個粒子;
其中,所述線程束是SM調(diào)度和執(zhí)行的基本單位。
優(yōu)化的,上述的一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,基于以下公式調(diào)整粒子所對應(yīng)的線程束的個數(shù)WarpNum以及線程塊所對應(yīng)的粒子數(shù)ParticleNum:
WarpNum=DivUp(D,WarpSize) (8)
ThreadNum=WarpNum*WarpSize (9)
ParticleNum=
DivDown(BlockSize,ThreadNum) (10)
式中,D表示求解問題的維度,WarpSize表示CUDA架構(gòu)中一個線程束的大小;DivUp函數(shù)的功能是將D除以WarpSize得到的商做向上取整,以得到粒子所對應(yīng)Warp的個數(shù)WarpNum;ThreadNum用來表示每個粒子實際用到的線程總數(shù);BlockSize表示CUDA架構(gòu)中一個Block的大小,DivDown函數(shù)的功能是將BlockSize除以ThreadNum得到的商做向下取整,以得到Block所對應(yīng)的粒子數(shù)ParticleNum。
優(yōu)化的,上述的一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,在調(diào)用核函數(shù)之前,
基于自適應(yīng)線程束算法,利用以下公式計算并初始化每個核函數(shù)的線程塊的個數(shù)BlockNum以及網(wǎng)格的個數(shù)GridNum:
BlockNum=TreadNum*ParticleNum;
GridNum=DivUp(N,ParticleNum);
式中,ThreadNum用來表示每個粒子實際用到的線程總數(shù);ParticleNum為線程塊所對應(yīng)的粒子數(shù);N為粒子群中粒子的總個數(shù)。
優(yōu)化的,上述的一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,
定義三個CUDA核函數(shù),分別用于并行計算粒子的速度和位置、粒子的適應(yīng)度值及下一代粒子自身所找到的最好適應(yīng)度值及其對應(yīng)的解、整個粒子群到目前為止找到的最好適應(yīng)度值及其對應(yīng)的解。
優(yōu)化的,上述的一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,具體包括以下步驟:
步驟2.1:計算粒子的速度和位置內(nèi)核,每個GPU線程按照分配好的線程塊個數(shù)BlockNum和網(wǎng)格個數(shù)GridNum,通過粒子群算法的計算公式對應(yīng)的計算每個問題某一維度對應(yīng)的速度和位置;
步驟2.2:計算粒子的適應(yīng)度值及下一代粒子自身所找到的最好適應(yīng)度值及其對應(yīng)的解內(nèi)核,按照分配好的BlockNum和GridNum并行計算每個粒子每個維度的適應(yīng)度值,再根據(jù)每個維度的適應(yīng)度值通過并行規(guī)約算法,得到每個粒子的適應(yīng)度值,最后根據(jù)得到的適應(yīng)度值,更新粒子的適應(yīng)度值及其所對應(yīng)的解;
步驟2.3:計算整個粒子群到目前為止找到的最好適應(yīng)度值及其對應(yīng)的解內(nèi)核,通過使用CUBLAS的cublasI<t>amin()函數(shù)(t為操作對象的數(shù)據(jù)類型)在GPU上求得整個粒子群到目前為止找到的最好適應(yīng)度值及其對應(yīng)的解。
優(yōu)化的,上述的一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,基于以下公式初始化問題函數(shù):
其中,fSphere為問題函數(shù)Sphere的求解公式,fRastrigrin為問題函數(shù)Rastrigrin的求解公式,fRosenbrock為問題函數(shù)Rosenbrock的求解公式,x為問題函數(shù)變量,D為問題函數(shù)的維度。
優(yōu)化的,上述的一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,基于以下公式更新粒子群的公式:
Xid(t+1)=Xid(t)+Vid(t); (5)
其中,Vid表示每個粒子的速度,t表示當前的迭代代數(shù),w表示粒子群的慣性權(quán)重系數(shù),c1和c2表示粒子群的加速因子,r1和r2是[0,1]區(qū)間中均勻分布的隨機數(shù),表示該粒子的個體極值,表示整個粒子群的全局極值,Xid表示該粒子的當前位置(解)。基于以下公式更新粒子群參數(shù)w和C1/C2:
w=1/(2*ln(2)); (6)
c1=c2=0.5+ln(2); (7)
因此,本發(fā)明具有如下優(yōu)點:
(1)使用本發(fā)明提供的方法,可以大幅縮短PSO算法求解問題時間,提高相關(guān)應(yīng)用軟件響應(yīng)速度;
(2)用本發(fā)明提供的方法,可以選用低端CPU用于主機,中高端GPU用于計算,達到多CPU甚至集群的性能,從而減少功耗,節(jié)約硬件成本。
附圖說明
圖1為本發(fā)明實施例的粒子群算法優(yōu)化方法流程圖。
圖2為CUDA并行計算模型。
圖3為本發(fā)明實施例的GPU端更新架構(gòu)圖。
圖4為本發(fā)明實施例的包含GPU端更新架構(gòu)圖的粒子群算法優(yōu)化方法流程圖。
具體實施方式
下面通過實施例,并結(jié)合附圖,對本發(fā)明的技術(shù)方案作進一步具體的說明。
實施例:
如圖1所示,為本實施例的一種基于自適應(yīng)線程束的GPU并行粒子群優(yōu)化方法,包括以下步驟:
步驟1:初始化問題函數(shù)參數(shù),初始化粒子群參數(shù);
步驟2:定義三個CUDA核函數(shù),分別用于并行計算粒子的速度和位置、粒子的適應(yīng)度值及下一代粒子自身所找到的最好適應(yīng)度值及其對應(yīng)的解、整個粒子群到目前為止找到的最好適應(yīng)度值及其對應(yīng)的解;
步驟3:根據(jù)自適應(yīng)線程束算法計算并初始化每個核函數(shù)的BlockNum及GridNum;
步驟4:調(diào)用核函數(shù)并行迭代更新粒子群的速度和位置,并求出當前最好適應(yīng)度值及其對應(yīng)的解;
步驟5:重復(fù)執(zhí)行步驟4直到達到設(shè)定的結(jié)束條件,GPU輸出計算結(jié)果。
其中,步驟1中的問題函數(shù)基于如下公式(1)-(3)定義:
其中,fSphere為問題函數(shù)Sphere的求解公式,fRastrigrin為問題函數(shù)Rastrigrin的求解公式,fRosenbrock為問題函數(shù)Rosenbrock的求解公式,x為問題函數(shù)變量,D為問題函數(shù)的維度。
粒子群的更新公式如下公式(4)-(5)所示:
Xid(t+1)=Xid(t)+Vid(t); (5)
其中,Vid表示每個粒子的速度,t表示當前的迭代代數(shù),w表示粒子群的慣性權(quán)重系數(shù),c1和c2表示粒子群的加速因子,r1和r2是[0,1]區(qū)間中均勻分布的隨機數(shù),表示該粒子的個體極值,表示整個粒子群的全局極值,Xid表示該粒子的當前位置(解)。參數(shù)w和C1/C2的的更新公式如下如下公式(6)-(7)所示:
w=1/(2*ln(2)); (6)
c1=c2=0.5+ln(2); (7)
本實施例的步驟2中定義三個CUDA核函數(shù),分別用于并行計算粒子的速度和位置、粒子的適應(yīng)度值及下一代粒子自身所找到的最好適應(yīng)度值及其對應(yīng)的解、整個粒子群到目前為止找到的最好適應(yīng)度值及其對應(yīng)的解;
GPU并行計算,本算法在CUDA平臺上實現(xiàn)。詳見圖2,CUDA并行計算模型是一種SIMD(單指令多數(shù)據(jù))的并行化計算模型,其中GPU作為一個協(xié)處理器產(chǎn)生大量線程,可以幫助CPU完成高度并行化的大量簡單計算工作。CUDA采用多層存儲器的架構(gòu)模型,共有三個不同的層次:線程(Thread),線程塊(Block)以及塊網(wǎng)格(Grid)。Thread運行在SP(StreamingProcessor,流處理器)上,是其中最基本的執(zhí)行單元,每個Thread擁有一個私有的寄存器,多個執(zhí)行相同指令的Thread可以組成一個Block。Block運行在SM(StreamingMultiprocessor,流多處理器)上,一個Block內(nèi)所有的Thread可以通過Block內(nèi)的共享內(nèi)存(ShareMemory)進行數(shù)據(jù)通信和共享,并實現(xiàn)同步,多個完成相同功能的Block可以組成一個Grid。Grid運行在SPA(ScalableStreamingProcessorArray,流處理器陣列)上,同一個Grid中的Block之間不需要通訊,且Gird間的執(zhí)行是串行的。即當程序加載時,Grid加載到GPU上之后,所有的的Block被串行的分配到每一個流多處理器上。因此,必須合理的分配每個Block中的線程數(shù),以便能更好的提高并行度。
實際運行中,Block會被分割為更小的線程束Warp。在一個SM上,每個Block中的線程按照其唯一的ID進行順序分組,相鄰的32個線程組成一個Warp。邏輯上所有的thread都是并行的,但是從硬件的角度來講,并不是所有的thread能夠在同一時刻執(zhí)行,Warp才是SM調(diào)度和執(zhí)行的基本單位。在CUDA編程模型之中并沒有抽象出Warp的定義,Warp是由GPU的硬件結(jié)構(gòu)決定的,但卻對性能影響很大。同一Warp內(nèi)的線程可以認為是“同時”執(zhí)行的,不需要進行同步也能通過sharedmemory進行通信,可以進一步的節(jié)省調(diào)用__syncthreads()函數(shù)對線程進行同步所消耗的時間。綜上所述,增加每個Block中線程的使用量,并以Warp為單位考慮對Block中線程數(shù)分配的優(yōu)化,可以獲得更高性能。
步驟2具體實現(xiàn)包括以下子步驟:
步驟2.1:計算粒子的速度和位置內(nèi)核,按照分配好的Block數(shù)量BlockNum和Grid數(shù)量GridNum通過粒子群算法的計算公式,每個GPU線程對應(yīng)的計算每個問題某一維度對應(yīng)的速度和位置;其中該核函數(shù)的定義如下:
__global__voidParticleFly_VP_kernel(float*Particle_X,float*P article_V,int*GBestIndex,float*Particle_XBest,float*Particle_Fit Best,curandState*s)
函數(shù)中的參數(shù)依次分別表示所有粒子的位置數(shù)組(長度為粒子數(shù)*維度)、所有粒子的速度數(shù)組(長度為粒子數(shù)*維度)、最好粒子下標、最好適應(yīng)度、最好適應(yīng)度對應(yīng)的解的數(shù)組(長度為問題函數(shù)的維度);
步驟2.2:計算粒子的適應(yīng)度值及下一代粒子自身所找到的最好適應(yīng)度值及其對應(yīng)的解內(nèi)核,按照分配好的BlockNum和GridNum并行計算每個粒子每個維度的適應(yīng)度值,再根據(jù)每個維度的適應(yīng)度值通過并行規(guī)約(Reduction)算法,得到每個粒子的適應(yīng)度值。最后根據(jù)得到的適應(yīng)度值,更新粒子的適應(yīng)度值及其所對應(yīng)的解;其中該核函數(shù)的定義如下:
__global__voidParticleFly_Fit_kernel(float*Particle_X,float*Particle_XBest,float*Particle_Fit,float*Particle_FitBest)
函數(shù)中的參數(shù)依次分別表示所有粒子的位置數(shù)組(長度為粒子數(shù)*維度)、最好適應(yīng)度對應(yīng)的解的數(shù)組(長度為問題函數(shù)的維度),所有粒子的適應(yīng)度數(shù)組(長度為粒子數(shù)),最好適應(yīng)度;
需要注意的是,該核函數(shù)中需要使用到并行縮減以求取最好適應(yīng)度值,所以需要為該核函數(shù)分配共享內(nèi)存,需要分配的共享內(nèi)存大小為Block_Size*sizeof(float),其中Block_Size為每個Block中的線程數(shù);
步驟2.3:計算整個粒子群到目前為止找到的最好適應(yīng)度值及其對應(yīng)的解內(nèi)核,通過使用CUBLAS的cublasI<t>amin()函數(shù)(t為操作對象的數(shù)據(jù)類型)在GPU上求得整個粒子群到目前為止找到的最好適應(yīng)度值及其對應(yīng)的解;
步驟3的示意圖如圖3所示,根據(jù)自適應(yīng)線程束算法計算并初始化每個核函數(shù)的BlockNum及GridNum;
其具體實現(xiàn)包括以下子步驟:
步驟3.1:本方法基于CUDA計算模型的特點,將每個粒子的維度劃分為一個或多個Warp,然后使用Blcok來包含這些Warp,使得一個Block中對應(yīng)一個或多個粒子,從而增加每個Block中線程的使用量,達到Warp級別并行的效果。
步驟3.2:粒子所對應(yīng)Warp的個數(shù)及Block所對應(yīng)的粒子數(shù)都會根據(jù)粒子維度的大小進行自適應(yīng)的調(diào)整。具體的自適應(yīng)過程遵循如下公式(8)-(10)所示:
WarpNum=DivUp(D,WarpSize) (8)
ThreadNum=WarpNum*WarpSize (9)
ParticleNum=
DivDown(BlockSize,ThreadNum) (10)
步驟3.3:D表示求解問題的維度,WarpSize表示CUDA架構(gòu)中一個Warp的大小。DivUp函數(shù)的功能是將D除以WarpSize得到的商做向上取整,以得到粒子所對應(yīng)Warp的個數(shù)WarpNum。ThreadNum用來表示每個粒子實際用到的線程總數(shù)。BlockSize表示CUDA架構(gòu)中一個Block的大小。DivDown函數(shù)的功能是將BlockSize除以ThreadNum得到的商做向下取整,以得到Block所對應(yīng)的粒子數(shù)ParticleNum。
步驟3.4:在調(diào)用核函數(shù)之前,首先需要確定CUDA的Block的大小BlockNum及Grid的大小GridNum,以體現(xiàn)自適應(yīng)線程束方法的特點,具體如下公式(11)-(12)所示:
BlockNum=TreadNum*ParticleNum (11)
GridNum=DivUp(N,ParticleNum) (12)
本算法優(yōu)化原有基于GPU的計算方法,調(diào)整期并行架構(gòu)使之并行效率更高,設(shè)計出一套改進的CUDA并行架構(gòu)方式,利用圖像處理器(GPU)加速執(zhí)行。將一個線程對應(yīng)一個維度,一個或多個Warp對應(yīng)一個粒子,一個或多個粒子對應(yīng)一個Block,使得粒子群算法在單個主機上的并行度進一步的提高,相比前兩種方法在CPU加速比的倍數(shù)上提高了40之多。
從以上描述可知,本實施例具有如下優(yōu)點:
(1)使用本發(fā)明提供的方法,可以大幅縮短PSO算法求解問題時間,提高相關(guān)應(yīng)用軟件響應(yīng)速度;(2)用本發(fā)明提供的方法,可以選用低端CPU用于主機,中高端GPU用于計算,達到多CPU甚至集群的性能,從而減少功耗,節(jié)約硬件成本。
本實施例所描述的方法可用于游戲中的自動尋路、圖像處理等領(lǐng)域。
本文中所描述的具體實施例僅僅是對本發(fā)明精神作舉例說明。本發(fā)明所屬技術(shù)領(lǐng)域的技術(shù)人員可以對所描述的具體實施例做各種各樣的修改或補充或采用類似的方式替代,但并不會偏離本發(fā)明的精神或者超越所附權(quán)利要求書所定義的范圍。