江偉彬,王亭亭
(中兵勘察設(shè)計(jì)研究院有限公司,北京 100053)
CPU和GPU架構(gòu)差異很大,CPU功能模塊很多,能適應(yīng)復(fù)雜運(yùn)算環(huán)境;GPU構(gòu)成則相對(duì)簡(jiǎn)單,目前流處理器和顯存控制器占據(jù)了絕大部分晶體管。CPU中大部分晶體管主要用于構(gòu)建控制電路(比如分支預(yù)測(cè)等)和Cache,只有少部分的晶體管用于完成實(shí)際的運(yùn)算工作。
CPU雖然有多核,但一般也就幾個(gè),每個(gè)核都有足夠大的緩存和足夠多的數(shù)字及邏輯運(yùn)算單元,需要很強(qiáng)的通用性來處理各種不同的數(shù)據(jù)類型,同時(shí)邏輯判斷又會(huì)引入大量的分支跳轉(zhuǎn)和中斷的處理,并輔助有很多加速分支判斷甚至更復(fù)雜的邏輯判斷的硬件。
GPU的核數(shù)遠(yuǎn)超CPU,被稱為眾核,如Tesla P100有3 584個(gè)核。每個(gè)核擁有的緩存大小相對(duì)小,數(shù)字邏輯運(yùn)算單元也少而簡(jiǎn)單,GPU面對(duì)的則是類型高度統(tǒng)一的、相互無依賴的大規(guī)模數(shù)據(jù)和不需要被打斷的純凈的計(jì)算環(huán)境。
通用并行計(jì)算架構(gòu)CUDA(compute unified device architecture)使GPU能夠解決復(fù)雜的計(jì)算問題,是顯卡廠商N(yùn)VIDIA推出的一種計(jì)算架構(gòu),它包含了CUDA指令集架構(gòu)(ISA)以及GPU內(nèi)部的并行計(jì)算引擎,開發(fā)人員可以使用C語言為CUDA架構(gòu)編寫程序,所編寫出的程序可以在支持CUDA的處理器上以超高性能運(yùn)行。
近年來,隨著GPU可編程能力、并行處理能力以及應(yīng)用范圍的不斷提升和擴(kuò)展,GPU已發(fā)展成為一種高度并行化、多線程、多核的處理器。GPU在并行數(shù)據(jù)運(yùn)算上具有強(qiáng)大的計(jì)算能力,特別適合作運(yùn)算符相同而運(yùn)算數(shù)據(jù)不同的運(yùn)算。CUDA對(duì)內(nèi)存的操作與一般的C程序基本相同,顯存操作則需要調(diào)用CUDA API中的存儲(chǔ)器管理函數(shù)。一旦確定好程序中的并行部分,就可以將該部分計(jì)算交給GPU。利用GPU的并行處理能力,以CPU加GPU混合加速為特征的異構(gòu)并行計(jì)算系統(tǒng)將會(huì)成為未來高性能計(jì)算的主流。
并行編程的原理是: 將大問題劃分為一些小問題,再把這些小問題交給相應(yīng)的處理單元并行處理。在CUDA中,該思想在問題劃分模型中以兩個(gè)層次體現(xiàn)。
1) 一個(gè)問題可以首先被粗粒度地劃分為若干子問題,CUDA使用塊(Block)單元處理子問題,每個(gè)塊都由一些CUDA線程組成,線程是CUDA中最小的處理單元。
2) 將這些較小的子問題進(jìn)一步劃分為若干更小的細(xì)粒度的問題,使用線程處理細(xì)粒度的問題。
對(duì)于1個(gè)普通的NVIDIA GPU,CUDA線程數(shù)目通常能達(dá)到數(shù)千個(gè)甚至更多,因而問題劃分模型可成倍地提升計(jì)算機(jī)的運(yùn)算性能。GPU由多個(gè)流水處理器構(gòu)成,流水處理器以Block為基本調(diào)度單元,對(duì)于流水處理器較多的GPU,它一次可以處理的Block更多,從而運(yùn)算速度更快,時(shí)間更短。該原理如圖1所示,由圖1可知,1個(gè)多線程程序被劃分為多個(gè)線程塊,塊之間彼此無關(guān),均獨(dú)立執(zhí)行,因而核心越多執(zhí)行效率越高。
圖1 CUDA并行計(jì)算原理示意
“滾球法”是國(guó)際電工委員會(huì)(IEC)推薦的接閃器保護(hù)范圍計(jì)算方法之一。GB 50057—2010[1]把“滾球法”強(qiáng)制作為計(jì)算避雷保護(hù)范圍的方法?!皾L球法”基于雷閃電氣幾何數(shù)學(xué)模型,設(shè)計(jì)原理是以擊距為半徑R的1個(gè)球體,沿需要防直擊雷的建構(gòu)筑物部位各個(gè)方向滾動(dòng),當(dāng)球體只觸及接閃器,包括被用作接閃器的金屬物,或只觸及接閃器和地面,包括與大地接觸并能承受雷擊的金屬物,這時(shí)球體的弧與建筑物之間不觸及的范圍,便是接閃器的防雷范圍?!皾L球法”計(jì)算接閃器防雷保護(hù)范圍原理如圖2所示,確定接閃器保護(hù)范圍的要求見表1所列。
圖2 “滾球法”計(jì)算防雷保護(hù)范圍原理示意
表1 “滾球法”確定接閃器保護(hù)范圍的要求 m
建立包圍所有接閃器的立方格域,如圖3所示。
圖3 接閃器的立方格域
假定立方格域在x,y,z三個(gè)方向上所包含的立方格的數(shù)目分布是Nx,Ny,Nz,則整個(gè)立方格域所包含的立方格總數(shù)是
N=NxNyNz
(1)
立方格域可以表示為以下形式:
X: (xmin,xmax,Nx)
Y: (ymin,ymax,Ny)
Z: (zmin,zmax,Nz)
(2)
對(duì)于給定坐標(biāo)為(x,y,z)的節(jié)點(diǎn),其在立方格域的三個(gè)方向的編號(hào):
Ix=Nx(x-xmin)/(xmax-xmin)
Iy=Ny(y-ymin)/(ymax-ymin)
Iz=Nz(z-zmin)/(zmax-zmin)
(3)
對(duì)立方格的每個(gè)節(jié)點(diǎn)進(jìn)行編號(hào)Ic:
Ic=Ix+IyNy+IzNxNy
(4)
可以控制立方格的細(xì)化次數(shù),在精度與效率之間求得某種程度的平衡。
接閃桿定義為垂直的直線,包含2個(gè)float3類型。
避雷線定義為直線,包含2個(gè)float3類型,有弧度的避雷線可以通過多個(gè)直線模擬。
避雷網(wǎng)可以通過一個(gè)或者多個(gè)避雷線模擬。所有的接閃器的節(jié)點(diǎn)數(shù)據(jù)放置在device_vector中。
立方格域數(shù)據(jù)中的每一點(diǎn)模擬滾球的滾動(dòng)軌跡,如果球體和接閃器發(fā)生接觸,則計(jì)算下一點(diǎn);如果未發(fā)生接觸,球體內(nèi)的立方格域數(shù)據(jù)標(biāo)志為1,如此循環(huán),直至計(jì)算完所有的點(diǎn)。保留立方格域數(shù)據(jù)標(biāo)志為0的點(diǎn),通過Delaunay法構(gòu)造平滑曲面,該曲面就是接閃器的聯(lián)合保護(hù)范圍。模擬滾球的算法流程如圖4所示,最終接閃桿的計(jì)算模擬效果如圖5所示。
圖4 模擬滾球算法流程示意
圖5 接閃桿計(jì)算結(jié)果模擬示意
該計(jì)算方法是利用CUDA強(qiáng)大的計(jì)算功能,模擬半徑R的1個(gè)球體,沿需要防直擊雷的建構(gòu)筑物部位各個(gè)方向滾動(dòng)。把不觸及的范圍通過Dclaunay法構(gòu)造平滑曲面,得到接閃器的防雷范圍,是真正根據(jù)“滾球法”原理的計(jì)算方法。在復(fù)雜布置的接閃桿、避雷線、避雷網(wǎng)情況下,也能準(zhǔn)確地計(jì)算出防雷范圍,是一個(gè)高通用性、高準(zhǔn)確性、計(jì)算高速性的計(jì)算方法。