E-HPC叢集整合了Intel oneAPI工具包,該工具包結合HPC軟體使用,可以加快構建跨架構應用程式。本文以LAMMPS軟體為例,為您示範如何在E-HPC叢集下使用Intel oneAPI編譯並運行LAMMPS。
背景資訊
Intel oneAPI是一種開放的、標準的統一編程模型。Intel oneAPI工具包為Intel CPU和FPGA等異構平台提供構建部署應用程式和解決方案所需的工具,包括用於高效能異構計算的最佳化編譯器、庫、架構和分析工具,可以簡化編程,協助開發人員提高生產力。
LAMMPS是一款經典分子動力學軟體,用於類比液態、固態或氣態的粒子集合。在類比原子、分子計算中並行效率高,廣泛應用於材料、物理、化學等類比情境。
使用Intel oneAPI編譯運行LAMMPS,可以加快構建應用程式,提升應用效能。
準備工作
建立E-HPC叢集。具體操作,請參見使用嚮導建立叢集。
配置叢集時,本文使用的軟硬體參數配置樣本如下:
參數
說明
硬體參數
部署方式為標準,包含2個管控節點,1個計算節點和1個登入節點,均採用ecs.c7.large執行個體規格,配置為2 vCPU,4 GiB記憶體,Ice Lake處理器,2.7 GHz。
軟體參數
鏡像選擇CentOS 7.6公用鏡像,調度器選擇pbs。
建立叢集使用者。具體操作,請參見系統管理使用者。
叢集使用者用於登入叢集,進行編譯軟體、提交作業等操作,配置使用者權限時,許可權組請選擇sudo許可權組。
安裝oneAPI工具包。具體操作,請參見安裝與卸載軟體。
需安裝的軟體如下:
intel-oneapi-mkl,版本為2022.1.2。
intel-oneapi-mpi,版本為2022.1.2。
intel-oneapi-hpckit,版本為2022.1.2。
步驟一:串連叢集
選擇以下一種方式串連叢集:
通過用戶端
該方式僅支援使用PBS調度器的叢集。操作前,請確保您已下載安裝E-HPC用戶端,且已配置用戶端所需環境。具體操作,請參見配置用戶端所需環境。
開啟並登入E-HPC用戶端。
在用戶端左側導覽列,單擊會話管理。
在會話管理頁面的右上方,單擊terminal,開啟Terminal視窗。
通過控制台
登入彈性高效能運算控制台。
在頂部功能表列左上方處,選擇地區。
在左側導覽列,單擊叢集。
在叢集頁面,找到目的地組群,單擊遠端連線。
在遠端連線頁面,輸入集群使用者名稱、登入密碼和連接埠,單擊ssh串連。
步驟二:編譯LAMMPS
執行以下命令,下載最新的LAMMPS源碼。
從GitHub下載LAMMPS源碼。
說明如果叢集中沒有安裝git,請先執行
sudo yum install -y git安裝git。git clone -b release https://github.com/lammps/lammps.git mylammps查看下載的LAMMPS源碼檔案。
ls -al預期返回:
... drwxr-xr-x 15 test users 4096 May 31 16:39 mylammps ...
執行以下命令,載入oneAPI模組。
將環境變數寫入
$HOME/.bashrc。vim $HOME/.bashrc添加以下內容:
source /opt/intel-oneapi-mpi/oneapi/setvars.sh --force source /opt/intel-oneapi-mkl/oneapi/setvars.sh --force source /opt/intel-hpckit/oneapi/setvars.sh --force更新
$HOME/.bashrc。source $HOME/.bashrc
執行以下命令,編譯LAMMPS。
使用2個進程進行編譯。
cd $HOME/mylammps/src make -j 2 intel_cpu_intelmpi查看當前檔案路徑下產生的LAMMPS可執行檔。
ll lmp_intel_cpu_intelmpi預期返回:
-rwxr-xr-x 1 test users 9041824 May 31 16:48 lmp_intel_cpu_intelmpi
執行以下命令,將LAMMPS可執行檔配置為共用命令。
mkdir -p $HOME/bin mv $HOME/mylammps/src/lmp_intel_cpu_intelmpi $HOME/bin
步驟三:運行LAMMPS
切換到lmp_intel_cpu_intelmpi所在bin目錄。
cd $HOME/bin執行以下命令建立算例檔案,算例檔案命名為in.intel.lj。
vim in.intel.lj內容樣本如下:
# 3d Lennard-Jones melt variable x index 1 variable y index 1 variable z index 1 variable xx equal 20*$x variable yy equal 20*$y variable zz equal 20*$z units lj atom_style atomic lattice fcc 0.8442 region box block 0 ${xx} 0 ${yy} 0 ${zz} create_box 1 box create_atoms 1 box mass 1 1.0 velocity all create 1.44 87287 loop geom pair_style lj/cut 2.5 pair_coeff 1 1 1.0 1.0 2.5 neighbor 0.3 bin neigh_modify delay 0 every 20 check no fix 1 all nve dump 1 all xyz 100 sample.xyz run 10000執行以下命令編寫測試指令碼,指令碼命名為test.pbs。
vim test.pbs指令碼內容如下:
#!/bin/bash #PBS -N testLmp #設定作業名稱 #PBS -l nodes=2:ppn=2 #向調度器申請2個計算節點,每個計算節點使用兩個進程運行該作業 export I_MPI_HYDRA_BOOTSTRAP=ssh cd $PBS_O_WORKDIR mpirun ./lmp_intel_cpu_intelmpi -in ./in.intel.lj執行以下命令,提交作業。
qsub test.pbs預期返回如下,表示產生的作業ID為0.scheduler。
0.scheduler
步驟四:查看結果
執行以下命令,查看作業狀態。
qstat -x 0.scheduler預期返回如下,當返回資訊中
S為F時,表示作業已經運行結束。Job id Name User Time Use S Queue ---------------- ---------------- ---------------- -------- - ----- 0.scheduler test.pbs test 00:00:00 F workq執行以下命令,查看日誌。
cat log.lammps預期返回:
... Per MPI rank memory allocation (min/avg/max) = 11.75 | 11.75 | 11.75 Mbytes Step Temp E_pair E_mol TotEng Press 0 1.44 -6.7733681 0 -4.6134356 -5.0197073 10000 0.69579461 -5.6648333 0 -4.621174 0.7601771 Loop time of 108.622 on 4 procs for 10000 steps with 32000 atoms Performance: 39770.920 tau/day, 92.062 timesteps/s 97.0% CPU use with 2 MPI tasks x 2 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- Pair | 85.42 | 85.632 | 85.844 | 2.3 | 78.83 Neigh | 13.523 | 13.564 | 13.604 | 1.1 | 12.49 Comm | 4.4182 | 4.5452 | 4.6722 | 6.0 | 4.18 Output | 2.1572 | 2.1683 | 2.1793 | 0.7 | 2.00 Modify | 2.1047 | 2.1398 | 2.175 | 2.4 | 1.97 Other | | 0.5734 | | | 0.53 Nlocal: 16000 ave 16007 max 15993 min Histogram: 1 0 0 0 0 0 0 0 0 1 Nghost: 13030 ave 13047 max 13013 min Histogram: 1 0 0 0 0 0 0 0 0 1 Neighs: 600054 ave 604542 max 595567 min Histogram: 1 0 0 0 0 0 0 0 0 1 Total # of neighbors = 1200109 Ave neighs/atom = 37.503406 Neighbor list builds = 500 Dangerous builds not checked Total wall time: 0:01:48