高效能與平行計算

領域分解(domain decomposition)

要和一組人畫一幅巨大的壁畫,你們不會全擠在一處——你用粉筆把牆分成區段、給每位畫師一段,讓他們平行作畫。唯一的麻煩在接縫處,一位畫師的邊緣必須與鄰人的對上。領域分解正是把這個想法用在以網格、網目為基礎的計算上:你把問題的物理區域(流體流動的網目、熱方程的網格、結構模型的單元)切成子領域,每個指派給一個行程,讓它們同時計算,只在共享邊界上協調。

具體而言,取一個在分散於許多 MPI rank 的大網格上求解的 PDE。每個 rank 擁有網格的一個連續區塊,只把那塊存在它私有的記憶體中。難處在於更新一格需要它的鄰居,而區塊邊緣的格子,其鄰居住在相鄰的 rank 上。標準的解法是一層「幽靈格」(或稱光暈、halo):每個 rank 保留一份其鄰居資料那薄薄邊界帶的副本,每一步藉由與那些鄰居交換訊息來刷新。於是一個時間步變成:更新內部(不需通訊)、與鄰居交換光暈、更新邊緣。因為每個 rank 只碰幾個鄰居、只送一條薄邊界(表面,按區塊的面積縮放),卻在整個區塊(體積)上計算,故通訊對計算之比隨區塊變大而縮小——這正是領域分解弱擴展如此之好的原因。

領域分解是平行化計算科學那些大型模擬——流體、天氣、結構、電磁——的主導策略,因為它把物理天然的局部性(一個點主要受其近鄰影響)對應到硬體想要的局部性(主要與鄰近的處理器交談)。它核心的設計問題是負載平衡(切分領域使每個 rank 工作相等,當網目不均勻、或物理集中於某一區時很棘手)與最小化分割的表面對體積比(緊湊、近立方體的子領域比又長又薄的板塊通訊更少)。同一個詞也指一族求解器與預條件子方法(如 Schwarz 法),它們求解每個子領域的部分、迭代地把全域解縫合起來——分解作為一種數值方法,而不只是一種分散工作的方式。

一個 1000×1000 的熱方程網格切到 100 個 rank 上,每個分到一個 100×100 的區塊。每一步一個 rank 更新 10000 個內部格子,卻只與它的四個鄰居交換它的四條邊——約 4*100 = 400 個邊界值。通訊(400 個數)與計算(10000 格)相比微不足道,而這個比例只會隨區塊變大而改善,這就是此法能擴展的原因。

每個 rank 擁有一個區塊,只與鄰居交換薄薄的光暈——表面通訊、體積計算。

難的部分很少是切割,而是平衡:若某個子領域工作較多(網目較細、或有活躍的反應區),其餘每個 rank 都在下一次光暈交換處等待,故最慢的 rank 定下步調。一個不平衡的分解,可能比浮點運算數所暗示的擴展得差得多,無論網路多快。

又称
domain partitioningsubdomain method區域分解子領域法