CINECA Leonardo and Pitagora¶
This page builds, tests and runs SIMPLE on the CINECA machines Leonardo and
Pitagora. Tested on Leonardo (CPU, GCC 12.2, OpenMP) at SIMPLE ffd7f4a:
build, the test selection and the smoke run below pass, also as a batch job.
The CUDA build compiles but was not run on a GPU. The Pitagora recipe has not
been run.
Access¶
Follow CINECA’s access and 2FA instructions:
enrol an OTP authenticator, install the Smallstep step client and bootstrap
its certificate authority with the published URL and fingerprint. Then, with
an SSH agent running:
step ssh login '<registered-email>' --provisioner cineca-hpc
ssh <username>@login.leonardo.cineca.it
Certificates last 12 hours. Cloning SIMPLE from GitHub over HTTPS works on the login nodes; CMake fetches libneo, Fortnum and Fortplot the same way.
Leonardo: build¶
examples/hpc/cineca/leonardo-gcc-env.sh, sourced from the SIMPLE root,
loads the module stack and limits threads for the shared login node:
module purge
module load profile/base gcc/12.2.0 cmake/3.27.9 ninja/1.11.1 \
openblas/0.3.26--gcc--12.2.0 python/3.11.7 \
netcdf-c/4.9.2--gcc--12.2.0-spack0.22
export CMAKE_BUILD_PARALLEL_LEVEL=4
export OMP_NUM_THREADS=4 OMP_THREAD_LIMIT=4
export OPENBLAS_NUM_THREADS=1 CTEST_PARALLEL_LEVEL=1
export TMPDIR="$PWD/build/tmp"; mkdir -p "$TMPDIR"
MPI, NetCDF-Fortran, FFTW, GSL and MKL are not needed: NetCDF-C (which loads serial HDF5) serves SIMPLE’s C test-data generator, and Fortran NetCDF access goes through Fortio, fetched by libneo. Python 3 is needed for the test drivers even with the Python interface off.
git clone https://github.com/itpplasma/SIMPLE.git && cd SIMPLE
source examples/hpc/cineca/leonardo-gcc-env.sh
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DENABLE_OPENMP=ON -DSIMPLE_DETERMINISTIC_FP=ON \
-DENABLE_PYTHON_INTERFACE=OFF -DSIMPLE_ENABLE_PYTHON_TOOLS=OFF \
-DLIBNEO_REF=f6090e8150c2f5b1c0afde09baadf79b50b1ffe7
cmake --build build -j 4
Use Release, not Fast, which tunes for the build host. Without
LIBNEO_REF CMake takes the libneo branch matching SIMPLE’s branch name, or
main; the value above is the tested pin. The clean build took 107 s.
Leonardo: test and run¶
On the login node, run a short selection of the fast suite (11 tests, 13 s),
keeping the libneo pin in FLAGS:
make test-fast CONFIG=Release \
FLAGS='-DENABLE_PYTHON_INTERFACE=OFF -DSIMPLE_ENABLE_PYTHON_TOOLS=OFF -DENABLE_OPENMP=ON -DLIBNEO_REF=f6090e8150c2f5b1c0afde09baadf79b50b1ffe7' \
TEST='^(test_config_reference|test_finite_check|test_profiles|test_deterministic_seed|test_orbit_invariants|test_stencil_utils|test_orbit_symplectic_base|test_newton_solver_status|test_spectre_fo_spline_tok2vol|test_spectre_fo_spline_ncsx_freeboundary|test_diag_albert)$'
The full fast suite contains integration cases with 900 s timeouts; run it in a batch job, not on the login node.
The smoke run traces eight markers for \(10^{-5}\) s in the QA equilibrium that
the test configuration downloads to test/test_data/wout.nc:
mkdir -p run/cineca-smoke
cp examples/hpc/cineca/smoke.in run/cineca-smoke/simple.in
cp test/test_data/wout.nc run/cineca-smoke/wout.nc
(cd run/cineca-smoke && ../../build/simple.x simple.in)
Expected: exit status 0 after about 10 s, 8 rows in times_lost.dat and
orbit_exit_code.dat, 20 rows in confined_fraction.dat, all finite, final
time 1e-5; exit codes four 0 (traced) and four 3 (skipped as strongly
passing, default contr_pp).
As a batch job on the budget-free serial partition (no account needed; one task, four cores, 4 GB, three minutes), submitted from the SIMPLE root:
sbatch examples/hpc/cineca/leonardo-serial.sbatch
sacct -j <job-id> --format=JobID,State,ExitCode,Elapsed
Production jobs follow Clusters; partitions and limits are in Leonardo’s Slurm guide.
Leonardo: CUDA¶
Run GPU jobs only in an allocation with a GPU, never on login or serial nodes. Configuration and valid inputs: GPU tracing. The A100 build uses the CPU stack plus CUDA 12.3:
module load cuda/12.3
cmake -S . -B build-cuda -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DSIMPLE_ENABLE_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=80 \
-DENABLE_PYTHON_INTERFACE=OFF -DSIMPLE_ENABLE_PYTHON_TOOLS=OFF \
-DLIBNEO_REF=f6090e8150c2f5b1c0afde09baadf79b50b1ffe7
cmake --build build-cuda -j 4 --target \
simple.x test_cuda_native_rk54.x test_cuda_native_bridge.x
cuobjdump --list-elf build-cuda/libsimple_cuda_native_rk54.so # expect sm_80
The device code lives in the shared library libsimple_cuda_native_rk54.so.
Validate with make test ... TEST='test_cuda_native_(rk54|bridge)' inside a
GPU job before production.
NVHPC 24.5 (nvfortran) does not build SIMPLE: Fortnum’s
src/verified/fortnum_interval_qp.f90 declares real(real128), for which
NVFORTRAN returns kind -3. Use GNU Fortran with nvcc.
Leonardo: pitfalls¶
netcdf.hnot found intest/tests/generate_test_boozer_chartmap.c: load thenetcdf-cmodule.module load git/2.38.1together with the OpenMPI stack fails (itsopensshdependency loads an older Kerberos). Use/usr/bin/gitaftermodule purge.
Pitagora (untested)¶
Consult the current Pitagora guide.
Use login-dcgp.pitagora.cineca.it for the AMD Turin CPU partition and
login-boost.pitagora.cineca.it for the Intel/H100 Booster. Leonardo’s
module names are not known to exist there: find GCC, CMake, Ninja, Python,
OpenBLAS and NetCDF-C with modmap -m <name>, write the loads into an
environment script like leonardo-gcc-env.sh, export its absolute path as
SIMPLE_ENV, and repeat the Leonardo build, test selection and smoke run on
the destination partition. For the H100 use -DCMAKE_CUDA_ARCHITECTURES=90.
Partition |
Nodes |
Max. nodes/job |
Max. wall time |
|---|---|---|---|
|
2 × AMD EPYC 9745, 256 cores, 768 GiB |
2 / 64 |
30 min / 24 h |
|
64 cores, 4 × H100, 512 GiB |
2 / 16 |
30 min / 24 h |
|
CPU only, budget-free, max. 4 cores |
— |
4 h |
One SIMPLE process uses one node or one GPU. Templates (replace the account before submission):
Template |
Request |
Submit from |
|---|---|---|
|
debug, 4 cores, 3 min |
SIMPLE root, runs |
|
debug, 1 GPU, 3 min |
SIMPLE root, runs |
|
debug, 256 cores, 30 min |
run directory; |
|
debug, 1 H100 + 16 cores, 30 min |
run directory; |
For production, override on the command line, e.g.
sbatch --partition=dcgp_fua_prod --time=24:00:00 examples/hpc/pitagora/dcgp.slurm.
A GPU input sets gpu_mode = 'production', gpu_backend = 'cuda-native',
gpu_method = 'dopri', gpu_num_devices = 1, isw_field_type = 2, with
collisions, walls, classifiers and orbit output off. Native CUDA tracing
needs a Boozer chartmap field; with a VMEC file it stops before tracing
(native CUDA RK requires initialized compact Boozer tables). Compare seeded
CPU and GPU results on the same case before production.