OLCF Crusher TDS

如果这是您第一次在 Joule2 上构建 MFIX-Exa,请先查看下面的常规说明和 基础知识 部分。

  • 要访问 Summit,您需要一个 OLCF 账户 和一个 RSA 令牌。

  • MFIX-Exa 账户的名称是 cfd122

  • 这些说明在登录节点上使用 -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 ASCENT_INSTALL_DIR=$HOME/<path/to/my/ascent-install-dir>
    export BOOST_INSTALL_DIR=$HOME/<path/to/my/boost-install-dir>
    

    到您有读写权限的路径。 如果您希望使用可选依赖项构建 MFIX-Exa,您需要记住这些路径。 Boost 仅在 PrgEnv-cray 中需要;PrgEnv-gnu 有一个可用的模块。

  • 构建 mfix 可执行文件(使用 cmake)后,您可以通过在 build 目录中执行以下命令来构建 PIC-to-DEM 重启应用程序

    cmake --build . --target pic2dem
    

警告

MFIX-Exa 目前在使用 ascent 支持运行时会遇到浮点异常。 确保输入中的所有 fpe 陷阱都关闭。

基础知识

源代码

构建之前,请首先按照 MFIX-Exa 网站 上的说明获取源代码的副本。

模块

OLCF 在 Crusher 上提供了三个编程环境: PrgEnv-amdPrgEnv-crayPrgEnv-gnu。 我们在后两个中取得了最大成功,并且仅为它们提供了以下构建说明。 请注意,在 PrgEnv-gnu 环境中, 如果您仅为 CPU 编译(例如,大多数依赖项)或如果您为具有 HIP 支持的 GPU 编译, 您将设置不同的编译器。

module purge
module reset
module load cmake/3.23.2
module load cpe/22.08
module load craype-accel-amd-gfx90a
module load rocm/5.2.0
module load cray-mpich/8.1.21
module load cce/15.0.0  # rocm 后必须重新加载

export MPICH_GPU_SUPPORT_ENABLED=1

export CFLAGS="-I${ROCM_PATH}/include"
export CXXFLAGS="-I${ROCM_PATH}/include"
export LDFLAGS="-L${ROCM_PATH}/lib -lamdhip64"

构建 MFIX-Exa

以下命令是超级构建指令,即 AMReX 作为 MFIX-Exa 构建过程的一部分构建。 要使用 hypre、csg 和/或 ascent 依赖项构建 MFIX-Exa, 您首先需要构建和安装这些库及其依赖项。 下面提供了构建必要依赖项的说明, 并且应该首先成功安装。这些说明目前仅提供给 cmake

cmake -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

可选构建依赖

在遵循上述完整构建说明之前,需要构建和安装以下依赖项。

  1. HYPRE

    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
    
  2. 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
    
  3. 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
    
  4. MPFR

    wget https://www.mpfr.org/mpfr-current/mpfr-4.2.0.tar.gz
    tar -zxvf mpfr-4.2.0.tar.gz
    pushd mpfr-4.2.0/
    ./configure --prefix=$CSG_INSTALL_DIR \
                --with-gmp-lib=${CSG_INSTALL_DIR}/lib \
                --with-gmp-include=${CSG_INSTALL_DIR}/include
    make -j8 install
    popd
    
  5. 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
    
  6. 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
    

    警告

    出于某种原因,在 PrgEnv-gnu 中安装时,PEGTL 中的某些内容未设置实验 文件系统(但在 PrgEnv-cray 中设置了)。 因此您必须手动强制设置。下面展示了一个解决方法。

    确保在 CSG_INSTALL_DIR/include/tao/pegtl/internal/filesystem.hpp 文件的第 47 和 51 行附近 的 “experimental” 出现在 filesystem 之前。

    ...
    #include <experimental/filesystem>
    
    namespace TAO_PEGTL_NAMESPACE::internal
    {
    namespace filesystem = ::std::experimental::filesystem;
    ...
    
  7. 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=$BOOST_INSTALL_DIR
    popd
    

    警告

    仅在 PrgEnv-cray 中需要。这似乎是使用本地 gcc/g++ 编译器构建的,而不是使用 cray 包装的 cc/CC 编译器,但“它有效。”

  8. 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 \
          -DCMAKE_BUILD_TYPE=Release \
          -DENABLE_OPENMP=OFF \
          -DENABLE_MPI=ON \
          -DENABLE_CUDA=OFF \
          -DENABLE_PYTHON=OFF \
          -DENABLE_GTEST=OFF \
          -DENABLE_TESTS=OFF
    make -j8 install
    popd
    
  9. 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 \
          -DCMAKE_BUILD_TYPE=Release \
          -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 \
          -DVTKm_ENABLE_TESTING=OFF
    make -j8 install
    popd
    
  10. 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 \
          -DCMAKE_BUILD_TYPE=Release \
          -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 \
          -DENABLE_GTEST=OFF \
          -DENABLE_TESTS=OFF
    make -j8 install
    popd
    

运行作业

常用的 Slurm 命令:

  • sinfo 查看可用/已分配的资源

  • sbatch runit_cpu.sh 提交一个 CPU 作业到队列

  • squeue -u USER 检查用户 USER 的作业状态

  • squeue -p PARTITION 检查分区 PARTITION 的作业状态

  • scancel JOBID 终止 ID 为 JOBID 的作业

  • salloc -N 1 -A CFD122_crusher -J build -t 01:00:00 获取一个交互式节点一个小时

示例运行脚本:

#!/bin/bash -l

#SBATCH -A CFD122_crusher
#SBATCH -J mfix-timing
#SBATCH -o job_%x-%j.out
#SBATCH -e job_%x-%j.err
#SBATCH --threads-per-core=1
#SBATCH --exclude=crusher[026,027,028,081,126,114,115]
#SBATCH -t 00:05:00
#SBATCH -N 2

nodes=2
nrs=12
omp=1

module purge
module reset
module load cpe/22.08
module load craype-accel-amd-gfx90a
module load rocm/5.2.0
module load cray-mpich/8.1.21
module load cce/15.0.0  # 必须在 rocm 之后加载

export OMP_NUM_THREADS=$omp
export MPICH_GPU_SUPPORT_ENABLED=1    # 如果只使用 CPU,去掉此行
#export FI_MR_CACHE_MAX_COUNT=0       # libfabric 禁用缓存
export FI_MR_CACHE_MONITOR=memhooks   # 替代缓存监控
export FI_CXI_RX_MATCH_MODE=software
export FI_CXI_REQ_BUF_SIZE=12582912
export FI_CXI_REQ_BUF_MIN_POSTED=6
export FI_CXI_DEFAULT_CQ_SIZE=131072

srun -N $nodes -n $nrs -c1 --ntasks-per-gpu=1 --gpu-bind=closest ./mfix inputs > screen.txt

#cpu: srun -N $nodes -n $nrs -c1 ./mfix inputs > screen.txt