Polaris
如果这是您第一次在 Polaris 上构建 MFIX-Exa,请先查看下面的常规说明和 基础知识 部分。
本系统的文档可以在 这里 找到。
Polaris 可以从安装有 ssh 客户端的系统访问。这些连接同样适用于 NETL 的 SciLAN 和 Joule:
ssh <username>@polaris.alcf.anl.gov
使用您的 Mobilepass 令牌登录。不需要前缀或后缀任何内容。
这些说明在登录节点上使用 -j8 CPUs 构建 MFIX-Exa。 如果流量较高,您可能需要降低此值; 或者如果您在计算节点上进行交互,您可能希望增加此值。
cmake 指令编译到 build 目录。 gmake 指令编译到 exec 目录。
对于依赖项,假设您已设置以下环境变量:
export HYPRE_INSTALL_DIR=$HOME/<path/to/my/hypre-install-dir> export CSG_INSTALL_DIR=$HOME/<path/to/my/csg-dep-install-dir> export CSG_LIB_DIR=$HOME/<path/to/my/csg-lib-install-dir> export ASCENT_INSTALL_DIR=$HOME/<path/to/my/ascent-install-dir>
到您有读写权限的路径,比如对应您账户的
/lus/grand/projects/<account>/
空间中。 如果您希望使用可选依赖项构建 MFIX-Exa,您需要记住这些路径。构建 mfix 可执行文件(使用 cmake)后,您可以通过在 build 目录中执行以下命令来构建 PIC-to-DEM 重启应用程序
cmake --build . --target pic2dem
基础知识
源代码
构建之前,请首先按照 MFIX-Exa 网站 上的说明获取源代码的副本。
模块
下面的所有构建说明都已使用以下模块和环境助手测试过
module swap PrgEnv-nvhpc PrgEnv-gnu
module load cmake/3.23.2
启用 GPU 的构建还需要
module load nvhpc-mixed
export MPICH_GPU_SUPPORT_ENABLED=1
export AMREX_CUDA_ARCH=8.0
利用外部依赖项的完整构建,还需要设置某些环境变量,如下所述。
构建 MFIX-Exa
以下命令是超级构建指令,即 AMReX 作为 MFIX-Exa 构建过程的一部分构建。 要使用 hypre、csg 和/或 ascent 依赖项构建 MFIX-Exa, 您首先需要构建和安装这些库及其依赖项。 下面提供了构建必要依赖项的说明, 并且应该首先成功安装。有两种主要的代码构建方法 cmake 和 gmake,它们分别在下面提供。
cmake
cmake -DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_Fortran_COMPILER=gfortran \
-DMFIX_MPI=yes \
-DMFIX_OMP=no \
-DMFIX_GPU_BACKEND=NONE \
-DAMReX_TINY_PROFILE=no \
-DMFIX_CSG=no \
-DMFIX_HYPRE=no \
-DCMAKE_BUILD_TYPE=Release \
../
make -j8
cmake -DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_Fortran_COMPILER=gfortran \
-DMFIX_MPI=yes \
-DMFIX_OMP=no \
-DMFIX_CSG=no \
-DMFIX_HYPRE=no \
-DMFIX_GPU_BACKEND=CUDA \
-DGPUS_PER_NODE=4 \
-DAMReX_TINY_PROFILE=no \
-DCMAKE_BUILD_TYPE=Release \
../
make -j8
export HYPRE_DIR=$HYPRE_INSTALL_DIR
export HYPRE_ROOT=$HYPRE_DIR
export HYPRE_LIBRARIES=$HYPRE_DIR/lib
export HYPRE_INCLUDE_DIRS=$HYPRE_DIR/include
export ASCENT_DIR=$ASCENT_INSTALL_DIR
export CONDUIT_DIR=$ASCENT_DIR
export CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH:$ASCENT_DIR/lib/cmake/ascent
export CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH:$ASCENT_DIR/lib/cmake/conduit
export CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH:$CSG_INSTALL_DIR
cmake -DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_Fortran_COMPILER=gfortran \
-DMFIX_MPI=yes \
-DMFIX_OMP=no \
-DMFIX_CSG=yes \
-DMFIX_HYPRE=yes \
-DAMReX_ASCENT=yes \
-DAMReX_CONDUIT=yes \
-DMFIX_GPU_BACKEND=NONE \
-DAMReX_TINY_PROFILE=no \
-DCMAKE_BUILD_TYPE=Release \
../
make -j8
export HYPRE_DIR=$HYPRE_INSTALL_DIR
export HYPRE_ROOT=$HYPRE_DIR
export HYPRE_LIBRARIES=$HYPRE_DIR/lib
export HYPRE_INCLUDE_DIRS=$HYPRE_DIR/include
export ASCENT_DIR=$ASCENT_INSTALL_DIR
export CONDUIT_DIR=$ASCENT_DIR
export CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH:$ASCENT_DIR/lib/cmake/ascent
export CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH:$ASCENT_DIR/lib/cmake/conduit
export CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH:$CSG_INSTALL_DIR
cmake -DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_Fortran_COMPILER=gfortran \
-DMFIX_MPI=yes \
-DMFIX_OMP=no \
-DMFIX_CSG=yes \
-DMFIX_HYPRE=yes \
-DAMReX_ASCENT=yes \
-DAMReX_CONDUIT=yes \
-DMFIX_GPU_BACKEND=CUDA \
-DGPUS_PER_NODE=4 \
-DAMReX_TINY_PROFILE=no \
-DCMAKE_BUILD_TYPE=Release \
../
make -j8
可选构建依赖
在遵循上述完整构建说明之前,需要构建和安装以下依赖项。
设置环境助手
export CC=$(which cc) export CXX=$(which CC) mkdir $HOME/scratch && cd $HOME/scratch
HYPRE
对于 HYPRE 的 GPU 构建似乎只在
cmake
中有效。git clone https://github.com/hypre-space/hypre.git pushd hypre/src/ git checkout v2.26.0 ./configure --prefix=$HYPRE_INSTALL_DIR --with-MPI make -j8 install popd
git clone https://github.com/hypre-space/hypre.git pushd hypre/src/ git checkout v2.26.0 cmake -S . -B build \ -DCMAKE_INSTALL_PREFIX=$HYPRE_INSTALL_DIR \ -DHYPRE_WITH_DSUPERLU=OFF \ -DHYPRE_ENABLE_BIGINT=OFF \ -DHYPRE_WITH_OPENMP=OFF \ -DHYPRE_ENABLE_SHARED=ON \ -DHYPRE_WITH_MPI=ON \ -DHYPRE_WITH_CUDA=ON \ -DCMAKE_CUDA_ARCHITECTURES=80 \ -DHYPRE_ENABLE_CUSPARSE=ON \ -DHYPRE_ENABLE_CURAND=ON \ -DCMAKE_CXX_COMPILER=$(which nvc++) \ -DMPI_CXX_COMPILER=$(which CC) \ -DCMAKE_C_COMPILER=$(which nvc) \ -DMPI_C_COMPILER=$(which cc) \ -DHYPRE_INSTALL_PREFIX=$HYPRE_INSTALL_DIR cd build/ make -j8 install popd
Catch2
git clone --depth 1 --branch v2.13.7 https://github.com/catchorg/Catch2 pushd Catch2/ cmake -S . -B build -DCMAKE_INSTALL_PREFIX=$CSG_INSTALL_DIR cd build/ make -j8 install popd
GMP
wget --no-check-certificate https://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz tar -xf gmp-6.2.1.tar.xz pushd gmp-6.2.1 ./configure --prefix=$CSG_INSTALL_DIR make -j8 install popd
MPFR
wget --no-check-certificate https://ftp.gnu.org/gnu/mpfr/mpfr-4.1.0.tar.xz tar -xf mpfr-4.1.0.tar.xz pushd mpfr-4.1.0/ ./configure --with-gmp=$CSG_INSTALL_DIR --prefix=$CSG_INSTALL_DIR make -j8 install popd
Boost
wget https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.tar.gz tar -zxvf boost_1_81_0.tar.gz pushd boost_1_81_0/ ./bootstrap.sh ./b2 install --prefix=$CSG_INSTALL_DIR popd
CGAL
git clone --depth 1 --branch v5.3 https://github.com/CGAL/cgal pushd cgal/ cmake -S . -B build -DCMAKE_INSTALL_PREFIX=$CSG_INSTALL_DIR cd build/ make -j8 install popd
PEGTL
git clone --branch 3.2.2 https://github.com/taocpp/PEGTL pushd PEGTL/ cmake -S . -B build -DCMAKE_INSTALL_PREFIX=$CSG_INSTALL_DIR cd build/ make -j8 install popd
Conduit
git clone --recursive https://github.com/LLNL/conduit.git pushd conduit/ git checkout v0.8.6 mkdir build && cd build cmake -S ../src -DCMAKE_INSTALL_PREFIX=$ASCENT_INSTALL_DIR \ -DENABLE_OPENMP=OFF \ -DENABLE_MPI=ON \ -DENABLE_CUDA=OFF \ -DCMAKE_BUILD_TYPE=Release make -j8 install popd
Vtk-m
git clone --branch master https://gitlab.kitware.com/vtk/vtk-m.git pushd vtk-m/ git checkout v1.9.0 mkdir build && cd build/ cmake -S ../ -DCMAKE_INSTALL_PREFIX=$ASCENT_INSTALL_DIR \ -DVTKm_ENABLE_OPENMP=OFF \ -DVTKm_ENABLE_MPI=ON \ -DVTKm_ENABLE_CUDA=OFF \ -DVTKm_USE_64BIT_IDS=OFF \ -DVTKm_USE_DOUBLE_PRECISION=ON \ -DVTKm_USE_DEFAULT_TYPES_FOR_ASCENT=ON \ -DVTKm_NO_DEPRECATED_VIRTUAL=ON \ -DCMAKE_BUILD_TYPE=Release make -j8 install popd
Ascent
git clone --recursive https://github.com/Alpine-DAV/ascent.git pushd ascent git checkout v0.9.0 mkdir build && cd build/ cmake -S ../src -DCMAKE_INSTALL_PREFIX=$ASCENT_INSTALL_DIR \ -DCONDUIT_DIR=$ASCENT_INSTALL_DIR \ -DVTKM_DIR=$ASCENT_INSTALL_DIR \ -DENABLE_VTKH=ON \ -DENABLE_FORTRAN=OFF \ -DENABLE_PYTHON=OFF \ -DENABLE_DOCS=OFF \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=Release \ -DENABLE_GTEST=OFF \ -DENABLE_TESTS=OFF make -j8 install popd
运行作业
常用 Slurm 命令:
qsub runit.sh 提交一个作业到队列
qstat -u USER 查看用户 USER 的作业状态
qdel JOBID 终止 ID 为 JOBID 的作业
qsub -I -l select=1:system=polaris -l walltime=0:60:00 -l filesystems=home:gran -q debug -A <ACCOUNT> 获取 1 个 GPU 节点(最多 1 小时)
示例运行脚本:
下面是 GPU 的示例运行脚本。对于仅 CPU,请移除 module load nvhpc-mixed
和 export MPICH_GPU_SUPPORT_ENABLED=1
,以及运行行中的选项 ppn
和 --cpu-bind core
。
#!/bin/bash
#PBS -A <ACCOUNT>
#PBS -q prod
#PBS -l select=64:system=polaris
#PBS -l filesystems=home:eagle
#PBS -l walltime=04:00:00
#PBS -N alcc_tk1
#PBS -k doe
#PBS -o stdout
#PBS -e stderr
#PBS -m be
##PBS -M <email addresses> # 默认情况下,邮件发送给提交者,使用此选项添加其他人(取消注释以使用)
NNODES=`wc -l < $PBS_NODEFILE` # 请求的节点数
RPN=4 # 假设 1 GPU = 1 资源,4 个 GPU / 节点
RES=$((NNODES*RPN)) # 资源总数
echo 'procs = '$procs' '
echo '$PBS_O_WORKDIR = '$PBS_O_WORKDIR' '
cd $PBS_O_WORKDIR
module swap PrgEnv-nvhpc PrgEnv-gnu
module load nvhpc-mixed
export MPICH_GPU_SUPPORT_ENABLED=1
set +x # 将所有命令报告到 stderr
env # 保存环境变量
mpiexec -n $RES -ppn $RPN --cpu-bind core ./mfix inputs > screen.1
wait 3
mpiexec -n $RES -ppn $RPN --cpu-bind core ./mfix inputs > screen.2
wait 7
mpiexec -n $RES -ppn $RPN --cpu-bind core ./mfix inputs > screen.3
echo 'eof EOF EOR eor'