上周我們推送了“混合建模”系列的第一篇文章,介紹了混合并行計算的含義,以及它是如何提高 COMSOL Multiphysics 運算效率的。今天,我們將簡要探討混合并行計算的一個組成部分——共享內存計算。不過在此之前,我們首先會解釋“應用程序并行運行”的意義。此外,我們還將討論何時以及如何在 COMSOL 軟件中使用共享內存。
多核和多線程
人們對計算機運算速度的需求日益增長,然而由于一些技術限制(例如時鐘頻率的提升瓶頸)的存在,迫使計算機進入了多核時代。如今,多核計算機已經成為主流,市面上常見的處理器通常最多是 12 核,而實際上處理器可以安裝多達 60 個以上的核心。如果您希望了解什么是核心,以及它與共享內存計算之間的關聯,請查看鏈接中介紹共享內存計算的圖表。
鑒于上述情況,每個應用程序都需要考慮并行性,以有效發揮前沿并行硬件的性能;否則,這些程序只能使用一個 內核執行運算。雖然用戶往往不能直接感受并行性的影響,不過,您應當知道自己的計算機擁有并行處理能力,清楚修改哪些軟件設置能提高計算效率,明白當所有核心超頻時應該做何預期。
如果要使執行一個進程的應用程序 在一臺多核機器上并行運行,必須將它分割成更小的單元,這些單元被稱作線程。實現多個線程并發執行的技術叫做多線程。多線程技術在十五年前便已經成為了計算機的內置功能。對于多線程技術而言,多核心并非不可或缺的配置;單核處理器可以采用時間分片模式,通過在活動線程之間快速切換來支持多線程。讓一個核心“同時”處理多個線程有效提高了資源利用率,當然,這一技術也可以應用于多核處理器。
了解基本原理后,我們就很容易理解,為什么說與單核處理器相比,多核處理器向前邁出了一大步。裝配多個計算單元便意味著系統可以同時運行多個線程,進而增加了單位時間內的計算量。基于上述原因,并行計算目前是加速計算的主要來源。
下圖展示了 COMSOL Multiphysics 與八核處理器相結合的優勢。當八個核心都投入應用時,計算時間會大大減少。它帶來的直接好處是,在相同時間內可執行的仿真次數大大增加,從而提高了生產率。下圖顯示了對選定模型進行測試時,八核處理器的生產率是單核處理器的 6.5 倍。
測試下方的射頻加熱模型時,每日可執行的仿真次數與核心數量之間的關系。用于測試的計算服務器裝有 2 個 Intel? Xeon? E5-2609 和 64 GB DDR3 @1600 MHz。
用于測試加速比的模型。右側的紅白漸進標度表示溫度(攝氏度),綠色箭頭表示磁場。此模型擁有近 140 萬個自由度,使用 PARDISO 直接求解器進行求解,并且需要 52 GB 的內存。請注意:這是一個雙向耦合的多物理場模型?!鞍咐龓臁敝刑峁┝艘豢钜幠O鄬^小的模型。
什么是共享內存?
當計算機執行一項進程時,操作系統會分配給應用程序一定的內存供其使用(注意:在 COMSOL Multiphysics 中,您可以在底部的工具欄中查看分配給程序的內存大小)。概括而言,由主進程創建的全部線程共享了這些內存,每個線程都可以訪問儲存在內存中的全部變量。
打個比方,您可以想像一群人圍坐在會議室的圓桌旁開會,桌子上攤著所有的重要會議報告和信息。每個參會者可以閱讀任何文件,或在上面寫字。這樣一來,每個參會者都可以挑選自己要處理的文件,所有信息都是共享的。
上述比喻讓我們對運行原理有了一個大致印象,因此很大程度上簡化了共享內存的概念。畢竟在計算機上進行共享內存編程時,人們必須注意許多方面和細節。很顯然,系統需要引入某種同步機制,而且或許會發生資源沖突——畢竟想象一下 50 個人在一張紙上書寫時的情景。這也初步解釋了為什么第一張圖中的加速比逐漸降低并最終將在某一點處達到飽和。
內存共享允許線程直接訪問共享的變量,而且程序不必進行通信,也能在線程之間交換信息。在計算中,通信很可能是一個巨大瓶頸,應當盡可能避免;而 COMSOL 軟件采用了共享內存,因此在這一方面具有比較優勢。當然,共享內存計算也有自己的缺點。正如上一篇系列博客所述,我們可用的內存大小受到計算機內存容量的限制,而且在編寫應用程序時,程序員必須考慮到其他邏輯問題。
為什么使用共享內存?
如上所述,并行運算目前是加快計算速度的主要方式。為此,程序員需要清楚如何將整體工作分配給所有參與的線程。不過如果一項任務無需任何依賴項也能并行執行,分配的過程將相當簡潔明了。
在數值線性代數中,您常常會同矩陣和矢量等特大型陣列打交道。在這些情況中,最常見的構造是處理陣列的長循環。如果采用共享內存的機制,所有線程都可以訪問整個陣列,而且能夠通過多種方式將循環拆分給多個線程(前提是不存在循環體依賴)。當 COMSOL Multiphysics 執行各種線性代數運算和特定算法時,都利用了共享內存式并行計算,充分體現了它是一款靈活的并行工具。
但是,對于某些任務和算法,人們很難甚至不可能采用并行計算的方法。斐波那契數列 F(n) = F(n-1) + F(n-2) 就是一個例子,因為其中每個步驟都依賴于上一步,因此它是一個無法采用并行處理的遞歸問題。其他與并行計算和多核計算機不相容的算法包括時間步進法、延拓(例如遞增)研究,它們的共同特征是計算量級不變。
然而,沒有人會僅僅為了整日計算斐波那契數列的元素才使用計算機和數值軟件;而且幸運的是,市面上每一款有限元分析軟件的主要功能——求解線性方程組在很大程度上是可并行的。因此,即使矩陣方程只是某個大型任務(例如瞬態問題)的其中一部分,但是涉及到矩陣求解的問題或多或少都能從多核處理器中受益。對于絕大多數模型而言,COMSOL Multiphysics 主要執行矩陣矢量運算,因此采用共享內存多核處理器具有巨大的優勢。對于時間步進算法和延拓研究而言,每個時間步和參數步本身都可以實現并行執行。為了提升這類研究的可擴展性,采用時間步進法或延拓研究的底層物理場應當擁有數量巨大且充足的自由度。
此外,您必須牢記:整體的加速比會受到算法中非并行化分支及其執行情況的限制。阿姆達爾定律描述了這個著名的觀察結果。通過推算上述模型中不可并行化的部分,我們發現即使處理器的核心數量可以無限增加,加速比也不會超過 30 倍(不過 30 倍已經相當厲害了?。R虼藦睦碚撋现v,COMSOL Multiphysics 每日仿真次數可略高于 60 次。
COMSOL Multiphysics 如何發揮多核配置的優勢
當然,只有當多核計算機的所有核心均處于工作狀態時,才能獲得最優數值仿真性能。COMSOL 軟件會默認利用系統中的所有可用核心,因此您無需進行任何特別設置,就能最大限度地利用系統資源。
不過有時您或許需要測量模型或系統的加速比,或者保留幾個核心來處理其他應用程序或任務。在這種情況下,您可以更改啟動 COMSOL Multiphysics 時默認使用的核心數量,或者在“首選項”設置中編輯“多核與集群計算”。此外,在混合并行計算中,如果同時使用分布式內存和共享內存,利用特定設置可能會取得更佳的效果。
往期推薦