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