江偉彬,王亭亭
(中兵勘察設計研究院有限公司,北京 100053)
CPU和GPU架構差異很大,CPU功能模塊很多,能適應復雜運算環境;GPU構成則相對簡單,目前流處理器和顯存控制器占據了絕大部分晶體管。CPU中大部分晶體管主要用于構建控制電路(比如分支預測等)和Cache,只有少部分的晶體管用于完成實際的運算工作。
CPU雖然有多核,但一般也就幾個,每個核都有足夠大的緩存和足夠多的數字及邏輯運算單元,需要很強的通用性來處理各種不同的數據類型,同時邏輯判斷又會引入大量的分支跳轉和中斷的處理,并輔助有很多加速分支判斷甚至更復雜的邏輯判斷的硬件。
GPU的核數遠超CPU,被稱為眾核,如Tesla P100有3 584個核。每個核擁有的緩存大小相對小,數字邏輯運算單元也少而簡單,GPU面對的則是類型高度統一的、相互無依賴的大規模數據和不需要被打斷的純凈的計算環境。
通用并行計算架構CUDA(compute unified device architecture)使GPU能夠解決復雜的計算問題,是顯卡廠商NVIDIA推出的一種計算架構,它包含了CUDA指令集架構(ISA)以及GPU內部的并行計算引擎,開發人員可以使用C語言為CUDA架構編寫程序,所編寫出的程序可以在支持CUDA的處理器上以超高性能運行。
近年來,隨著GPU可編程能力、并行處理能力以及應用范圍的不斷提升和擴展,GPU已發展成為一種高度并行化、多線程、多核的處理器。GPU在并行數據運算上具有強大的計算能力,特別適合作運算符相同而運算數據不同的運算。CUDA對內存的操作與一般的C程序基本相同,顯存操作則需要調用CUDA API中的存儲器管理函數。一旦確定好程序中的并行部分,就可以將該部分計算交給GPU。利用GPU的并行處理能力,以CPU加GPU混合加速為特征的異構并行計算系統將會成為未來高性能計算的主流。
并行編程的原理是: 將大問題劃分為一些小問題,再把這些小問題交給相應的處理單元并行處理。在CUDA中,該思想在問題劃分模型中以兩個層次體現。
1) 一個問題可以首先被粗粒度地劃分為若干子問題,CUDA使用塊(Block)單元處理子問題,每個塊都由一些CUDA線程組成,線程是CUDA中最小的處理單元。
2) 將這些較小的子問題進一步劃分為若干更小的細粒度的問題,使用線程處理細粒度的問題。
對于1個普通的NVIDIA GPU,CUDA線程數目通常能達到數千個甚至更多,因而問題劃分模型可成倍地提升計算機的運算性能。GPU由多個流水處理器構成,流水處理器以Block為基本調度單元,對于流水處理器較多的GPU,它一次可以處理的Block更多,從而運算速度更快,時間更短。該原理如圖1所示,由圖1可知,1個多線程程序被劃分為多個線程塊,塊之間彼此無關,均獨立執行,因而核心越多執行效率越高。

圖1 CUDA并行計算原理示意
“滾球法”是國際電工委員會(IEC)推薦的接閃器保護范圍計算方法之一。GB 50057—2010[1]把“滾球法”強制作為計算避雷保護范圍的方法。“滾球法”基于雷閃電氣幾何數學模型,設計原理是以擊距為半徑R的1個球體,沿需要防直擊雷的建構筑物部位各個方向滾動,當球體只觸及接閃器,包括被用作接閃器的金屬物,或只觸及接閃器和地面,包括與大地接觸并能承受雷擊的金屬物,這時球體的弧與建筑物之間不觸及的范圍,便是接閃器的防雷范圍。“滾球法”計算接閃器防雷保護范圍原理如圖2所示,確定接閃器保護范圍的要求見表1所列。

圖2 “滾球法”計算防雷保護范圍原理示意

表1 “滾球法”確定接閃器保護范圍的要求 m
建立包圍所有接閃器的立方格域,如圖3所示。

圖3 接閃器的立方格域
假定立方格域在x,y,z三個方向上所包含的立方格的數目分布是Nx,Ny,Nz,則整個立方格域所包含的立方格總數是
N=NxNyNz
(1)
立方格域可以表示為以下形式:
X: (xmin,xmax,Nx)
Y: (ymin,ymax,Ny)
Z: (zmin,zmax,Nz)
(2)
對于給定坐標為(x,y,z)的節點,其在立方格域的三個方向的編號:
Ix=Nx(x-xmin)/(xmax-xmin)
Iy=Ny(y-ymin)/(ymax-ymin)
Iz=Nz(z-zmin)/(zmax-zmin)
(3)
對立方格的每個節點進行編號Ic:
Ic=Ix+IyNy+IzNxNy
(4)
可以控制立方格的細化次數,在精度與效率之間求得某種程度的平衡。
接閃桿定義為垂直的直線,包含2個float3類型。
避雷線定義為直線,包含2個float3類型,有弧度的避雷線可以通過多個直線模擬。
避雷網可以通過一個或者多個避雷線模擬。所有的接閃器的節點數據放置在device_vector中。
立方格域數據中的每一點模擬滾球的滾動軌跡,如果球體和接閃器發生接觸,則計算下一點;如果未發生接觸,球體內的立方格域數據標志為1,如此循環,直至計算完所有的點。保留立方格域數據標志為0的點,通過Delaunay法構造平滑曲面,該曲面就是接閃器的聯合保護范圍。模擬滾球的算法流程如圖4所示,最終接閃桿的計算模擬效果如圖5所示。

圖4 模擬滾球算法流程示意

圖5 接閃桿計算結果模擬示意
該計算方法是利用CUDA強大的計算功能,模擬半徑R的1個球體,沿需要防直擊雷的建構筑物部位各個方向滾動。把不觸及的范圍通過Dclaunay法構造平滑曲面,得到接閃器的防雷范圍,是真正根據“滾球法”原理的計算方法。在復雜布置的接閃桿、避雷線、避雷網情況下,也能準確地計算出防雷范圍,是一個高通用性、高準確性、計算高速性的計算方法。