一文讀懂Fluent并行計算,三大技術提升計算效率新境界!
作為流體仿真軟件的“頂流”,Fluent被學生、工程師及科研人員廣泛使用。隨著技術的不斷進步,Ansys工程師們致力于優化底層的并行算法,以提升其計算性能,使用戶體驗飛一般的計算速度。
在Ansys Fluent中,盡管工程師已經針對并行算法進行了充分優化,但在實際應用中,還有其他方法可以進一步提高計算性能。本文闡述了Fluent并行計算的基本原理,同時探討通過AVX2指令集加速、GPU加速以及超線程等技術手段來提高計算效率。
01 什么是Fluent并行計算
Fluent的并行求解器通過協同運作多個進程來計算大型問題,這些進程既可以在同一臺機器上運行,也可以在網絡中的不同設備上運行。
并行求解器將計算域分為多個區域(圖1),將各數據分區分配至不同的計算進程(稱為計算節點,圖2),每個計算節點都在其專屬數據集上同步執行同一程序。主進程(或稱為主機)不包含網格單元、面或節點(除非使用 DPM 共享內存模型),其主要職責是解析 Cortex(負責用戶界面和圖形相關功能的 Fluent 進程)發送的指令,并將這些指令(及數據)傳遞給某一計算進程,再由該計算進程將其分發至其他計算進程。
圖1:計算區域分區
圖2:分區網格邊界
計算節點負責存儲并執行部分網格的計算任務,而位于分區邊界的單層重疊單元格層則負責跨分區邊界的通信(圖2)。盡管單元格和面被分割,但網格中的所有域和線程在每個計算節點上均存在鏡像(圖3)。線程以鏈接列表的形式存儲,和串行求解器保持一致。計算節點可在大規模并行計算機、多CPU 工作站或具備相同或多工作站組成的網絡 上實現。 [1]
圖3:分布式網格中的域和線程鏡像
命令傳輸和通信
在Flunet并行計算會話中,進程涉及的主體包括 Cortex(主機進程)和一組 n 個計算節點進程,這些計算節點由 0 到 n-1 進行標記(圖4)。主機進程接收來自 Cortex 的命令,并將命令傳遞至node-0,再由node-0發送給其他計算節點,所有計算節點(不包括節點0)均從node-0 接收命令。在計算節點將指令發送至主機之前(通過node-0),它們會相互進行同步。
各計算節點之間會進行“虛擬”連接,并依賴其“通信器”來實現數組的發送與接收、同步、全局約簡(如全體單元的求和)以及機器連接性構建等功能。如圖4 所示,Flunet 通信器可視為一個消息傳遞庫,作為Message Passing Interface (MPI) 的標準供應商。
圖4:Fluent并行架構
在并行Flunet進程中,每一個進程(以及串行進程)均擁有獨一無二的ID標識。其中,主進程被分配為 ID node_host(=999999)。主機負責從 node-0 獲取消息,并對所有數據執行相應操作(如打印、顯示信息以及寫入文件等),這與串行求解器的操作方式保持一致(圖5)。
圖5:Fluent并行流程
當然,由于商軟黑箱,我們做不了太底層的事兒,但是在能力范圍內,也能為提高計算效率添磚加瓦。
02 通過AVX2指令集加速
AVX2(Advanced Vector Extensions 2)是英特爾推出的一種SIMD(Single Instruction, Multiple Data)擴展指令集,旨在提高處理器的并行計算能力。作為AVX指令集的升級版,AVX2具有更多的指令和功能。
AVX2指令集引入了256位寬的矢量寄存器YMM和一系列新型指令,能夠同時對8個32位或16個16位整數進行并行計算。相比于之前的SSE指令集,AVX2在處理器上的計算任務執行數量更多,數據吞吐量更高。在科學計算、圖像處理、物理模擬等領域,AVX2具有廣泛的應用價值。借助AVX2指令集,程序可以充分發揮處理器的并行計算能力,加速執行更加復雜的計算任務。需要注意的是,為了充分發揮AVX2的優勢,硬件環境須支持該指令集,因此,我們務必確保所選擇的處理器和計算節點可支持AVX2指令集,才可享受AVX2帶來的性能提升。
在Fluent環境中實現AVX2加速的方法相當簡單,只需在啟動指令中添加一個參數即可:
-platform=intel ## use AVX2 optimized binary. This option is for processors that can support AVX2 instruction set
在Linux操作系統下,針對MPI并行模式的腳本可參照以下,具體根據實際環境調整相關變量:
#!/bin/bash
export HOST_FILE=$(/opt/hpc/slurm/21.08.6/bin/generate_pbs_nodefile)
cat ${HOST_FILE} > .nodelist
NODELIST=""
for host in `cat $HOST_FILE | uniq`
do
if [ -z ${NODELIST} ]; then
NODELIST="['$host',$SLURM_NTASKS_PER_NODE]"
else
NODELIST="$NODELIST,['$host',$SLURM_NTASKS_PER_NODE]"
fi
done
#cat > fluent.env << !
mp_host_list=[$NODELIST]
!
$INSTALL_DIR/bin/fluent -g $PRECISION -t $cpus -mpi=intel -platform=intel -ssh -cnf=${HOST_FILE} -i ./$jouFile
我們搭載AMD EPYC 7H12處理器,在神工坊高性能仿真平臺上對算例進行了系列測試,以下為測試結果:
根據上述結果可以明顯看出,AVX2指令集具備加速性能,尤其在較小規模下,加速效果更為顯著。然而,隨著并行規模的擴大,加速比例逐漸降低,這可能是由于并行計算存在固有的開銷,從而降低了加速比例。當然,其他因素也可能影響結果。首先,硬件適配問題不容忽視,本次測試采用AMD設備,而AVX2指令由Intel開發,因此可能會存在適配問題。在Intel設備上進行重新測試,或許能獲得更佳的結果。其次,軟件版本也可能影響性能。使用最新版本的軟件能夠享受到更多的優化和改進,從而提高性能。此外,本次測試的算例亦可能存在問題,本次測試采用simple分離求解法的900w網格旋轉機械算例,使用其他算例或許能得到不同的結果。
03 GPU加速
Fluent GPU求解器是由NVIDIA開發的并行計算平臺和應用程序編程接口(API) CUDA(計算統一設備架構)驅動,因此,GPU求解器只支持NVIDIA的GPU,包括大多數NVIDIA Tesla和NVIDIA Quadro系列的GPU,以及Ansys網站羅列的可支持的部分GPU。
事實上,盡管使用GPU加速的用戶相對較少,但在Fluent早期版本就已具備該功能。啟用GPU加速十分簡單,僅需在啟動界面進行選擇。對于耦合求解器,Fluent默認使用GPU加速來進行耦合求解,并采用基于克羅內克子空間迭代法的FGMRES算法(彈性廣義最小殘差求解器)。然而,對于分離式求解器,默認情況下并未使用GPU加速(即使在啟動界面開啟也沒有效果),需要通過命令進行單獨設置,具體操作步驟如下:
1.首先,在啟動界面選擇調用GPU的數量(根據電腦的實際配置進行選擇)
圖6:Fluent啟動界面
2.進入軟件工作臺界面后,在右側命令端輸入“/parallel/gpgpu/show”,即可顯示當前使用的GPU型號,若GPU后方顯示“*”,則表示GPU已被選用;若無“*”標識,可輸入“select”,根據序號選擇所需計算的GPU。
圖7:命令終端選擇GPU
3.成功選擇GPU后,在終端鍵入“q”直至返回最外級選項。接下來選擇需要GPU求解加速的量,輸入“/solve/set/amg-options/amg-gpgpu-options”將會彈出當前算例所需求解的量。
圖8:命令終端選擇加速量
4.若需加速x方向動量,則鍵入“x-mom”,隨后彈出選項選擇“y”,其余參數保持默認即可,其他加速項操作同理。
圖9:命令終端選擇加速x方向動量
我們在 Intel Core i7-13700F 上搭載 NAVIDIA GeForce RTX 3060 對couple耦合求解算例進行測試,結果如下:
測試過程如圖10所示,可以看到滿狀態下,CPU和GPU負載均較高,這表明加速效果顯著。然而,如果算例配置需求過高,可能導致顯存不足,進而引發軟件崩潰,如圖11所示。
圖10:GPU計算過程
圖11:內存不足奔潰
根據ANSYS官方資料,Fluent在GPU上的運行速度最高可提升至3.7倍(即提升270%),實際測試數據也證實了這一可能性。而且,在開啟GPU加速的情況下,2線程的耗時僅為16線程不使用GPU時的40%,當然這種情況與CPU和GPU型號搭配有很大關系,搭配不佳可能導致性能受限。我們發現,8線程下的計算耗時優于16線程,這可能是因為16線程CPU多核心之間通信時間增加導致整體效率下降。綜合以上來看,最佳計算線程數應在12左右。CPU線程數并非越多越好,它存在最優線程數,相關文獻已對此進行研究[2]。在16線程情況下,由于遠程控制操作計算,進程任務包括計算任務、遠程控制任務及系統本身任務,這將會降低計算效率,因此,在大多數情況下,留出1、2個進程給系統等任務可能會帶來更好的性能。
04 超線程加速
超線程(Hyper-Threading)是Intel研發的一項技術,它通過在單個物理處理器核心中模擬出多個邏輯處理器,使其并發執行多個線程。超線程技術的核心優勢在于提升處理器的并行度和資源利用率。
通過模擬多個邏輯處理器,超線程能夠在同一時間周期內執行多個線程,進而有益于多線程應用程序和并行計算任務,提高系統響應速度與整體性能。此外,超線程技術還有助于減少資源閑置時間。當一個線程需要等待某些資源時,另一線程可以繼續使用其他可用資源,從而降低等待時間與資源浪費。
然而,超線程技術也存在一定局限性,因其并未實質性地增加處理器核心的數量,只是通過邏輯模擬來實現多個線程的同時執行。因此,在某些情況下,多線程可能會競爭相同的物理資源,導致性能下降。此外,超線程技術的實際效果與應用程序特性和線程調度密切相關。對于某些特定類型的應用程序,超線程技術可能無法帶來顯著的性能提升。對于高度并行化的任務,超線程可能會帶來更大的性能提升。
我們在Intel Xeon Platinum 8358機器上使用神工坊高性能仿真平臺對某一算例進行了擴展性測試,仍選擇物理核心的方式進行對比,以下為測試結果:
我們可以發現,開啟超線程能帶來一定程度的性能提升,但提升比例相對較低,因此,在實際計算中,是否啟用超線程需根據實際情況來權衡。如果您的工作負載高度并行,且能夠充分利用每個物理核心,那么開啟超線程技術可能會帶來顯著的性能提升。然而,如果您的應用程序比較依賴單個線程的執行速度,則開啟超線程可能會導致性能下降,原因在于超線程會使每個物理核心上的線程數增加,從而增加了上下文切換的開銷。另外,還要考慮芯片功耗與散熱問題,開啟超線程會增加處理器的熱量和功耗,如果散熱性能不佳或處理器功耗已接近極限,開啟超線程可能會導致處理器過熱并降低系統穩定性。
總體而言,超線程技術在適當情況下可提升處理器的性能和資源利用率,但實際效果取決于應用程序的特點和線程調度策略。開啟超線程需要綜合考慮多個因素,如應用程序類型、并行程度、功耗和散熱等。在選擇處理器時,需要綜合考慮應用場景和性能需求,評估超線程技術對系統性能的實質影響。
05 總結
通過以上內容,我們可知:
1. AVX2指令集加速有顯著效果,計算性能最高可提升8.63%,建議搭配Intel的機器。
2. GPU加速效果顯著,但其與CPU和GPU的協同作用密切相關。
3. 超線程技術在Fluent計算中具有一定的提速效果,但需兼顧芯片功耗和散熱問題。
4. 系統任務對速度提升會產生影響,建議在計算過程中空出1、2個進程。
“神工坊”高性能仿真平臺基于超算HPC集群的硬件支撐,對仿真軟件進行了CPU平臺的高性能適配與優化,同時根據用戶需求進行兼容性適配,力保每一核都能發揮出它的最大價值,歡迎廣大仿真從業者注冊試用!
參考資料
[1]《Fluent UDF手冊》
[2] Ju T, Wu W, Chen H, et al. Thread count prediction model: Dynamically adjusting threads for heterogeneous many-core systems. IEEE, 2015: 456-464.
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















