NCSA Delta

警告

使用 cmake 构建 GPU 和 hypre 支持时存在已知且尚未解决的问题。

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

  • 要访问 Delta,您需要一个由 NSF ACCESS 配额管理系统管理的 NCSA 账户。

  • 您可以使用 accounts 命令找到您的账户名称和当前余额。

  • 这些说明使用 -j8 CPU 在登录节点上构建 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>
    

    到一个您有读/写权限的路径。如果您想用可选的依赖项构建 MFIX-Exa,您将需要记住这些路径。

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

    cmake --build . --target pic2dem
    

基础知识

源代码

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

模块

Delta 上的默认模块几乎是您构建和编译所有依赖项所需的全部内容。如果您使用 cmake 构建,您需要加载一个较新的版本,例如

module load cmake/3.23.1

如果您正在构建 CSG 库或使用 CSG 支持来构建 MFIX-Exa,您需要加载 boost,例如

module load boost/1.80.0

已知与 AMReX 和预加载的 cuda 版本 11.6.1 存在不兼容性。要构建 GPU 支持,您需降级或升级版本,例如

module swap cuda/11.6.1 cuda/11.7.0

利用外部依赖项的完整构建还需要设置某些环境变量,如下所述。

构建 MFIX-Exa

以下命令是超级构建指令,即 AMReX 作为 MFIX-Exa 构建过程的一部分进行构建。要使用 hypre、csg 和/或 ascent 依赖项构建 MFIX-Exa,您首先需要构建并安装这些库及其依赖项。下面是构建必要依赖项的说明,应首先成功安装。有两种主要的代码构建方法 cmakegmake,分别提供如下。

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

gmake

make -C exec -j8 \
     COMP=gnu \
     USE_MPI=TRUE \
     USE_OMP=FALSE \
     USE_CUDA=FALSE \
     USE_TINY_PROFILE=FALSE \
     USE_CSG=FALSE \
     USE_HYPRE=FALSE \
     DEBUG=FALSE

可选构建依赖项

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

  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 --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
    
  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
    
  7. CSG EB 库 (gmake)

    当使用 gmake 构建选项构建带有 CSG 支持的 MFIX-Exa 时, 你需要将 libcsgeb 安装到 $CSG_LIB_DIR。这可以使用 cmakegmake 完成, 但由于你正在使用 gmake 构建 MFIX-Exa,让我们假设你也会在这里选择 gmake。 在构建之前确保你已加载 boost。(这应在 mfix 仓库内部执行。)

    make -C subprojects/csg-eb install DESTDIR=$CSG_LIB_DIR \
         PEGTL_HOME=$CSG_INSTALL_DIR \
         CGAL_HOME=$CSG_INSTALL_DIR \
         CATCH2_HOME=$CSG_INSTALL_DIR \
         ENABLE_CGAL=TRUE
    
  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 \
          -DENABLE_OPENMP=OFF \
          -DENABLE_MPI=ON \
          -DENABLE_CUDA=OFF \
          -DCMAKE_BUILD_TYPE=Release
    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 \
          -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
    
  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 \
          -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 命令:

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

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

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

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

  • scancel JOBID 终止 ID 为 JOBID 的作业 salloc -N 1 -p gpuA100x4 -A bbsj-delta-gpu --time=00:20:00  --exclusive --gpus-per-node=4 交互式获取整个 GPU 节点 20 分钟

下面是 GPU 的示例运行脚本, 仅 CPU 的运行在这台机器上尚未测试。

#!/bin/bash
#SBATCH --nodes=3
#SBATCH --exclusive
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=16    # <- 与 OMP_NUM_THREADS 匹配
#SBATCH --partition=gpuA100x4      # <- 或者是:gpuA100x4 gpuA40x4 gpuA100x8 gpuMI100x8
#SBATCH --account=bbsj-delta-gpu
#SBATCH --job-name=mympi
#SBATCH --time=00:05:00      # 作业时间为 hh:mm:ss
#SBATCH --constraint="scratch"

### GPU 选项 ###
#SBATCH --gpus-per-node=4
#SBATCH --gpus-per-task=1
#SBATCH --gpu-bind=closest
#SBATCH [email protected]
#SBATCH --mail-type="BEGIN,END"

module reset
module swap cuda/11.6.1 cuda/11.7.0
module load boost/1.80.0
module list

echo "job is starting on `hostname`"

srun -N 3 -n 12 -G 12 ./mfix inputs.rt > screen.txt