CFD并行計算大揭秘!算法玩的不好,照樣香菇、藍(lán)瘦!
2017-02-24 by:CAE仿真在線 來源:互聯(lián)網(wǎng)
單核計算原來越不能滿足大規(guī)模CFD計算的需求。大量的學(xué)術(shù)機(jī)構(gòu)和工程院所通過并行的方法來進(jìn)行上億網(wǎng)格的計算模擬。理所當(dāng)然的,并行計算(Parallel computing)需要配備多核CPU的計算機(jī),也即并行計算機(jī)(Parallel computers)。
并行計算機(jī)和普通計算機(jī)相同,也是使用常規(guī)芯片,因此并行計算機(jī)比矢量計算機(jī)(Vector computers)要便宜的多。商用并行計算機(jī)通常具有上千個處理器,上T的內(nèi)存。因此計算能力是驚人的。
CFD工程師經(jīng)常會問,并行計算是僅僅調(diào)用多個CPU就可以實(shí)現(xiàn)加速計算了么?
Too simple, sometimes naive!
并行計算遠(yuǎn)非那樣簡單
基于單核計算設(shè)計的算法,可能在并行計算機(jī)上不能夠有效的運(yùn)行。我們用循環(huán)語句為例,如果使用自動并行編譯器對代碼進(jìn)行編譯,并行只是在循環(huán)語句里面執(zhí)行。依據(jù)Amdahl法則,計算效率由最低效的部分決定。因此整個代碼中,不能并行計算的代碼要盡可能的小。
目前CFD中采用的并行算大體思路為把計算域分為子計算域,并且分別使用不同的CPU核心來對子計算域進(jìn)行計算。在這種并行分塊策略下,不同的CPU核心運(yùn)算相同的代碼,只不過他們處理的數(shù)據(jù)不同(分別處理自己的數(shù)據(jù)),在并行計算后再對數(shù)據(jù)進(jìn)行重組。
由于每個CPU核心需要處理自己的數(shù)據(jù),且某些數(shù)據(jù)需要和其他CPU核心中的數(shù)據(jù)中獲取,因此,CPU核心之間存在著數(shù)據(jù)交換。每個CPU處理的計算域的邊界也稱之為CPU邊界(Processor Boundary)。
顯性格式相對來說還是比較容易并行的,因?yàn)椴僮鞯臄?shù)據(jù)都是上一個時間步的已知數(shù)據(jù)。其離散后的矩陣為對角陣。數(shù)據(jù)交換只存在于在每個時間步計算完成后子計算域彼此的交界處。顯性格式并行計算最困難的部分就是橢圓形的壓力泊松方程。
隱性格式相對來講并行起來比較麻煩,矩陣的系數(shù)計算只是稍微麻煩一點(diǎn)(隱形格式離散后非對角陣),更頭疼的是求解這個非對角陣的迭代矩陣求解器不是很容易并行起來。比如:高斯消去法在計算的時候需要調(diào)用之前的迭代值,這導(dǎo)致其很難并行計算。
舉例,我們來看使用常規(guī)的矩陣求解方法(如采用ILU類型的矩陣求解器)在并行中的計算特點(diǎn):
在上圖中,黑格子為我們的2D網(wǎng)格單元,整個網(wǎng)格域被分為4個垂直的子區(qū)域并分別由4個不同的CPU求解。在每個網(wǎng)格單元上,存儲在著我們的矩陣系數(shù)。在常規(guī)的方式中,矩陣系數(shù)的計算需要相鄰網(wǎng)格單元的值。
-
假若某種矩陣求解器的矩陣系數(shù)構(gòu)造需要其西側(cè)和南側(cè)矩陣系數(shù)的值。那么CPU1上節(jié)點(diǎn)1、2上的矩陣系數(shù)可以順序求出,在這個時候,CPU2、3、4閑置,因?yàn)樗麄冃枰鱾?cè)和南側(cè)的矩陣系數(shù)值才能進(jìn)行計算。
-
在CPU1上節(jié)點(diǎn)1、2上的矩陣系數(shù)求出之后,CPU2開始求解節(jié)點(diǎn)3、4的矩陣系數(shù)。在這個時候,CPU1可以計算節(jié)點(diǎn)10、11的矩陣系數(shù)。
-
在CPU2求解之后,CPU3開始求解節(jié)點(diǎn)5、6的值。于此同時,CPU1已經(jīng)完成節(jié)點(diǎn)10、11的矩陣系數(shù)計算,并可以開始進(jìn)行節(jié)點(diǎn)19、20的計算。
-
在CPU3計算節(jié)點(diǎn)5、6的值之后,CPU4開始計算節(jié)點(diǎn)7、8、9的值,同時CPU1、2、3也在分別進(jìn)行著計算...
可以看出,CPU1總是比CPU2快一步,CPU2總是比CPU3快一步,以此類推。圖中天藍(lán)色陰影部分即表示的為這種CPU負(fù)載的不均衡。
在上圖中,CPU1只是領(lǐng)先了CPU4四行,如果分配了400個核,那么這意味著CPU1領(lǐng)先了CPU400共400行數(shù)據(jù)!這導(dǎo)致大量的閑置時間(idle time)。
上圖中,CPU1已經(jīng)跑完了,還需要繼續(xù)等待CPU2、3、4、...15,并且CPU15才跑到一半!
要真正的并行計算,算法改進(jìn)迫不及待。
目前,CFD計算中的并行算法均采用分解(decompose)的方式,附加矩陣求解器的重構(gòu)。分解的方式主要有兩種:空間分解和時間分解。
如前文所述,在空間分解中,計算域被分解為幾個小的計算域。空間分解的首要任務(wù)就是效率最大化:使得每個處理器獲得相同的工作量。
舉例:我們把計算域空間分解為9個子計算域,并編號為1-9。通常的并行做法為:同時把矩陣系數(shù)分解為9*9階塊矩陣。其中矩陣的對角塊對應(yīng)子計算域的矩陣系數(shù)。非對角塊中包含子計算域邊界處的交互關(guān)系。
上圖中,A矩陣的對角塊分別對應(yīng)子計算域的矩陣系數(shù)塊,非對角塊中,如A矩陣中的12塊對應(yīng)子計算域1和2之間的交互。
求解上述矩陣系統(tǒng),可以分別求出每個子計算域中的T。
拓展閱讀:
再比拼:CFD并行分解算法(Graph-Partitioning Algorithms)|炸了!150萬核超級計算機(jī)!|CFD中的壁面函數(shù)如何處理?|旋轉(zhuǎn)機(jī)械大法:多重參考系(MRF) VS 滑移網(wǎng)格(Sliding-Mesh)!|湍流神秘y+之旅|CFD逆天黑科技:“多重網(wǎng)格法”|源項(xiàng)的線性化處理|牛頓流體玩多了,不要忘記“非牛頓流體”|“我用100個核模擬,就可以模擬時間將為原來的1/100了!”|CFD后處理中的“體渲染”
原文整理與:Computational Methods for Fluid Dynamics, J.H. Ferziger and M. Peric, 3rd Edition, Page 356
相關(guān)標(biāo)簽搜索:CFD并行計算大揭秘!算法玩的不好,照樣香菇、藍(lán)瘦! CFD培訓(xùn) CFD流體分析培訓(xùn) cfd視頻 fluent cfx pumplinx軟件培訓(xùn) Fluent、CFX流體分析 HFSS電磁分析 Ansys培訓(xùn) Abaqus培訓(xùn) Autoform培訓(xùn) 有限元培訓(xùn)