Skip to content
Roland Haas edited this page Feb 8, 2024 · 13 revisions

CarpetX requires:

  • a C++17 compiler, GNU compilers version 10 or later are known to work
  • if using CUDA, a new enough CUDA toolkit (version 11 at least to support C++17). Please see below for extra modifications required in that case.
  • access to a number of external libraries
    • ADIOS2
    • BLAS / LAPACK
    • AMReX
    • GSL
    • FFTW3
    • hwloc
    • HDF5
    • NSIMD
    • openPMD
    • ssht
    • Silo
    • yaml_cpp
    • zlib
  • modern version of CMake for the external libraries

These can optionally be installed by hand to speed up compilation by inspecting how this is done in the azure-pipelines/Dockerfile file or using GetComponents and a thornlist.

A typical Ubuntu/Linux laptop or workstation

Using a thornlist the steps on a typical Ubuntu/Linux workstation with packages installed as documented are:

curl -kLO https://raw.githubusercontent.com/gridaphobe/CRL/master/GetComponents
chmod a+x GetComponents
./GetComponents --root Cactus --parallel --no-shallow https://github.com/eschnett/CarpetX/wiki/files/carpetx.th

cd Cactus
./simfactory/bin//sim setup-silent

If using gcc 8 then you will also have to explicitly link against -lstdc++fs by adding a line:

LIBS = gfortran stdc++fs

to simfactory/mdb/optionlists/generic.cfg to avoid link time errors.

Then build:

./simfactory/bin/sim build --thornlist thornlists/carpetx.th

This will provide a minimal working version of CarpetX sufficient to get started but not very optimized an not using CUDA.

If you are using a cluster then you will have to yourself make sure to use the correct option list etc.

Run a test:

# or however many threads you would like to use
OMP_NUM_THREADS=4 exe/cactus_sim repos/carpetx/WaveToyX/par/reflecting.par

which will run until cctk_final_time=1.0.

CUDA support

These steps are for typical Ubuntu/Linux workstations and assume the same setup as the preceding section.

When building AMReX, you need to decide whether CUDA is supported or not. If CUDA is supported, then a GPU is required at run time. It is not possible to configure AMReX with CUDA, and then to run without CUDA. In practice, I thus have two separate AMReX (and two separate Einstein Toolkit) builds.

This is mostly untested, so please update as you find things out.

To support CUDA some changes are required. Make a copy of the generic option list used by simfactory:

cp simfactory/mdb/optionlists/generic.cfg simfactory/mdb/optionlists/generic-cuda.cfg

and edit the copy.

First make sure to add to CPPFLAGS so that it includes:

CPPFLAGS = -DSIMD_CPU

and modify the language standard option in CXXFLAGS to be c++17 and add -D_GNU_SOURCE:

CXXFLAGS = -g -std=c++17 -D_GNU_SOURCE

then add at the end:

AMREX_ENABLE_CUDA=yes
CUCC = nvcc
CUCCFLAGS = --compiler-bindir g++ -x cu -g -std=c++17 -D_GNU_SOURCE --expt-relaxed-constexpr --extended-lambda --forward-unknown-to-host-compiler --Werror cross-execution-space-call --Werror ext-lambda-captures-this --relocatable-device-code=true --objdir-as-tempdir
CUCC_OPTIMISE_FLAGS=-O3 -fopenmp
CUCC_PROFILE_FLAGS = -pg
CUCC_WARN_FLAGS = -Wall
CUCC_OPENMP_FLAGS = -fopenmp
# subset CUCCFLAGS without "-x cu" (must no be used here) and options used only to compile code
# -fno-lto can avoid errors connected to fat binaries
LD = nvcc --compiler-bindir g++ -g -fno-lto --forward-unknown-to-host-compiler --relocatable-device-code=true --objdir-as-tempdir

DISABLE_INT16=yes
DISABLE_REAL16=yes

Finally add / change LIBS to include nvToolsExt:

LIBS = gfortran nvToolsExt

Finally create a fresh configuration

./simfactory/bin/sim build --thornlist thornlists/carpetx.th --optionlist simfactory/mdb/optionlists/generic-cuda.cfg

You will only have to pass the --thornlist and --optionlist options for the first build since simfactory makes copies of the files and stores them in the configuration.

Deep Bayou

Singularity

The Short Way

Avoid working on /home as it has limited storage. Instead, create your workspace with your user name at:

mkdir /ddnA/project/sbrandt/carpetx/$USER

cd /ddnA/project/sbrandt/carpetx/$USER

Deep Bayou uses the thornlist in the CarpetX wiki Getting Started document:

curl -kLO https://raw.githubusercontent.com/gridaphobe/CRL/master/GetComponents
chmod a+x GetComponents
./GetComponents https://github.com/eschnett/CarpetX/wiki/files/carpetx.th

cd Cactus
./simfactory/bin/sim setup-silent

Set your user name, email, and allocation in ./simfactory/etc/defs.local.ini

[default]
user            = YOUR_USERNAME
email           = YOUR_EMAIL
allocation      = hpc_et_test3
sourcebasedir   = /ddnA/project/sbrandt/carpetx/$USER

Build

./simfactory/bin/sim build sim-gpu --machine db-sing-nv --thornlist thornlists/carpetx.th

Run

./simfactory/bin/sim create-submit shocktube --procs=48 --ppn-used=48 --num-threads=24 --config sim-gpu --machine db-sing-nv --par repos/cactusamrex/AsterX/par/shocktube.par

The Long Way

After watching Matt Anderson's talk at the 20222 ET Workshop, I realized that we can use the image from the workshop on any cluster that supports singularity. I tested that I can build and run with Singularity on Deep Bayou. These were my steps.

I plan to modify simfactory so that it can understand singularity sometime in the near future.

Build the image

srun -A hpc_et_test2 -n 1 --pty singularity build -F /work/sbrandt/images/etworkshop.simg docker://stevenrbrandt/etworkshop

Note that the image (etworkshop.simg) must be in the singularity group if you are running on Deep Bayou, you won't be able to run it. The reason for this is that the HPC administrators at LSU wish to limit who can create images. Note also that on Deep Bayou, you can only access singularity through slurm.

Build Cactus

export CACTUS_SING="srun -A hpc_et_test2 -p checkpt -N 1 --cpus-per-task 48 --ntasks-per-node 1 --pty singularity exec --nv --bind /var/spool --
bind /project/sbrandt --bind /etc/ssh/ssh_known_hosts --bind /work --bind /scratch /work/sbrandt/images/etworkshop.simg"
$CACTUS_SING build -j10 $CACTUS_SIM --thornlist $CACTUS_THORNLIST --optionlist /usr/carpetx-spack/local-gpu.cfg

Note that by default, your home directory is mounted into the Singularity image. The --bind option allows you to add other directories. The --nv option enables the nvidia drivers. If you run on a cpu, you don't need that (actually, you don't need it set to compile, but I think its easier to set CACTUS_SING for compiling and running). If you run on the cpu, use optionlist /usr/carpetx-spack/local-cpu.cfg

Run Cactus

Yes, this needs to go through simfactory eventually...

$CACTUS_SING ./exe/cactus_sim-gpu parfile.par

This works because mpich (and its cousins) have worked hard to be interoperable between various versions through slurm and pmi2. It's magic!

Bare metal

Note: If debugging with nsys on Deep Bayou, please set and export the TMPDIR variable to something like /work/$USER/tmp. The nsys program generates lots of data and causes trouble for the /tmp file system.

Avoid working on /home as it has limited storage. Instead, create your workspace with your user name at:

mkdir /ddnA/project/sbrandt/carpetx/$USER

cd /ddnA/project/sbrandt/carpetx/$USER

Deep Bayou uses the thornlist in azure-pipelines/carpetx.th:

curl -kLO https://raw.githubusercontent.com/gridaphobe/CRL/ET_2021_05/GetComponents
chmod a+x GetComponents
./GetComponents https://bitbucket.org/eschnett/cactusamrex/raw/master/azure-pipelines/carpetx.th

cd Cactus
./simfactory/bin//sim setup-silent

Which uses the master branch of all thorns and helper libraries in CarpetX, that is it does not use rhaas/cuda or the ExternalLibraries in rhaas80's GitHub account.

Note that on Deep Bayou (db1.hpc.lsu.edu), the following cfg files are setup for CarpetX.

# /project/sbrandt/cfgs/spack.cfg # Use the CPU only
# /project/sbrandt/cfgs/spack-cuda.cfg # Use the GPU
# /work/eschnett/Cactus/simfactory/mdb/optionlists/db-gpu.cfg # for hackathon
/ddnA/project/sbrandt/carpetx/$USER/Cactus/repos/cactusamrex/azure-pipelines/deep-bayou.cfg # recommended

To use it, add these lines to your simfactory/etc/defs.local.ini:

[db1.hpc.lsu.edu]
allocation =  hpc_et_test3

# Set the relative path to your option list from the Cactus dir:
optionlist = repos/cactusamrex/azure-pipelines/deep-bayou.cfg

runscript = /project/sbrandt/carpetx/flopezar/db-gpu.run

sourcebasedir = /ddnA/project/sbrandt/carpetx/@USER@
basedir = /ddnA/project/sbrandt/carpetx/@USER@/simulations

envsetup = <<EOF
export SPACK_ROOT=/project/sbrandt/spack
source $SPACK_ROOT/share/spack/setup-env.sh
eval `spack --config-scope /home/sbrandt/.spack load --sh mpich`
eval `spack --config-scope /home/sbrandt/.spack load --sh yaml-cpp`
EOF

# ExternalLibrariesCUDA is used only with branch rhaas/cuda, not with master
#enabled-thorns = <<EOF
# ExternalLibraries/CUDA
# ExternalLibraries/RePrimAnd
#EOF

Then compile using:

./simfactory/bin/sim build --thornlist thornlists/carpetx.th

To submit your run, use simfactory submit, or ask for an interactive sesion. For the latter, Deep Bayou uses slurm, so you can enter the batch queue as follows. See sbrandt@cct.lsu.edu to get an allocation or space on the /project folder.

srun -A hpc_et_test2 -N 1 --pty bash

To actually run your code, you need to do something like this:

export SPACK_ROOT=/project/sbrandt/spack
source $SPACK_ROOT/share/spack/setup-env.sh
eval `spack --config-scope /home/sbrandt/.spack load --sh mpich`
eval `spack --config-scope /home/sbrandt/.spack load --sh yaml-cpp`
mpirun -np 2 ./exe/cactus_sim parfile

There is project disk space available (work will be deleted after 60 days)

Just make a directory as follows

mkdir -p /project/sbrandt/carpetx/$USER

And then work in /project/sbrandt/carpetx/$USER

SMIC

If Deep Bayou is not working for some reason, you can use smic (smic.hpc.lsu.edu). It has older GPUs, but it should work. I was able to compile carpetx (with no petsc), using the following config:

/project/sbrandt/spack-smic/local.cfg