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