---
# System prepended metadata

title: IFS-NEMO MN5-ACC (GPU)

---

# IFS-NEMO MN5-ACC (GPU)

## Build

### Forks and branches to use:

Use the forks and branches as listed below:

1) Exact pull-request source code state:

- ifs-bundle:  
  - `ssh://git@git.ecmwf.int/~ecme6549/ifs-bundle-accel.git`
  - `feature/mn5-accel-partition`
- RAPS:
  - export IFS_BUNDLE_RAPS_GIT:
    `ssh://git@git.ecmwf.int/~ecme6549/raps-accel.git`
  - export IFS_BUNDLE_RAPS_VERSION:
    `feature/mn5-accel-partition`
- ifs-source:
  - export IFS_BUNDLE_IFS_SOURCE_GIT:
    `ssh://git@git.ecmwf.int/~ecme6549/ifs-source-accel.git`
  - export IFS_BUNDLE_IFS_SOURCE_VERSION:
    `feature/mn5-accel-partition`
    
2) Or ifs-bundle branch tuned for local tests:

- ifs-bundle:  
  - `ssh://git@git.ecmwf.int/~ecme6549/ifs-bundle-accel.git`
  - `feature/mn5-accel-partition-localtest`

### Bundle build args:

The `ifs-bundle build` flags that I use:

```
./ifs-bundle build --arch arch/eurohpc/mn5-acc --with-single-precision \
    --with-gpu --with-gpu-aware-mpi \ 
    --with-double-precision-nemo --nemo-version=V40 \
    --nemo-grid-config=eORCA1_GO8_Z75 --nemo-ice-config=SI3 \
    --with-multio-for-nemo-sglexe --dry-run --verbose \
    --nemovar-grid-config=ORCA1_Z42 --nemovar-ver=DEV --build-dir=build
```

### VERY important notes:

**NOTE:** mind the `--with-gpu` and `--with-gpu-aware-mpi` flags!

**NOTE:** build can be made **only** on MN5-ACC compute nodes. On GPP nodes you'll have module load errors. On MN5-ACC *login* node you'll have out-of-memory in the middle of compilation process.

**NOTE:** `make -j16` seems to be a good enough parallel compilation parameter. But even with 16 parallel processes, compilation stops sometimes on ~25% progress mark with sympthoms of race condition in a Makefile. This happens rarely, but still be aware of possible spontanious compilation failure. Compilation restart helps.

---


## Runtime

### DVC repositories for tco399 and tco1279:

```
rm -rf dvc-cache-de340
export DNB_IFSNEMO_DVC_INIT="module load singularity"
export DNB_IFSNEMO_DVC_CMD="singularity exec -e --bind /gpfs/projects/bsc32/bsc032120/dvc-cache-de340_container /gpfs/projects/bsc32/bsc032120/dvc.sif dvc"
export DNB_IFSNEMO_DVC_CACHE_DIR="/gpfs/scratch/ehpc01/data/.dvc.ehpc01/cache"

branch=ClimateDT-phase2
eval $DNB_IFSNEMO_DVC_INIT
git clone -b $branch https://earth.bsc.es/gitlab/kkeller/dvc-cache-de340.git
cd dvc-cache-de340
$DNB_IFSNEMO_DVC_CMD config --project cache.dir $DNB_IFSNEMO_DVC_CACHE_DIR
$DNB_IFSNEMO_DVC_CMD checkout

# tco1279:
#        nemogrid=eORCA12_Z75
#        icmcl=ICMCL_1279_1990_extra
#        resol=1279
#        yyyymmddzz=1990010100
#        expver=hz9o

# tco399:
#        !!NOTE!! ntsres=1200 -> ntsres=900 in hres!! 
#        nemogrid=eORCA025_Z75
#        icmcl=ICMCL_399_1990
#        resol=399
#        yyyymmddzz=1990010100
#        expver=hz9n  
```

**NOTE:** double-check the values for the dvc repository branch and cache dir

**NOTE:** for `tco399` we have to manually decrease the NEMO timestep to `900` in the hres file, otherwise it hits instability checks in NEMO at the beginning of the simulation (the same for CPU version).


### Model params:

General idea is given in the file `bin/SLURM/mn5/hres_tco79.eORCA1.mn5-acc.slurm` inside RAPS.

Also duplicating the idea below (but here can be a different, most up to date flags' set):

```
export DR_HOOK_TRAPFPE=0
wrapper=affinity_setup_mn5-acc.sh
hres \
    -n $nodes -p $mpi -t $omp -h $ht \
    -j $jobid -J $jobname \
    -H $host -C $compiler \
    -d $yyyymmddzz -e $expver -L $label \
    --nemo-grid=$nemogrid --icmcl $icmcl \
    -T $gtype -r $resol -l $levels -f $fclen \
    --inproot-namelists \
    -N $nproma \
    -x $ifsMASTER \
    -w $wrapper \
    $MODEL_ARGS \
    --run-directory="$run_dir" --ifs-bundle-build-dir="$build_dir" 
```

where `MODEL_ARGS` for now looks like:

```
MODEL_ARGS+="--experiment=hist "
MODEL_ARGS+="--nemo --nemo-ver=V40 --nonemopart -R --deep "
MODEL_ARGS+="--keepnetcdf "
MODEL_ARGS+="--teos10 "
MODEL_ARGS+="--nemo-xproc=-1 --nemo-yproc=-1 "
MODEL_ARGS+="--no-ozone --sicoupl=1 "
MODEL_ARGS+="--noreferencecheck "
MODEL_ARGS+="--realization=1 "
```

This set of model args is for IFS-NEMO simulation without I/O. Additionally we may take the options for I/O, that may look like this in case of tco399 on 16 nodes:

```
ioflags+="--multio-write-fdb "
ioflags+="--keep-fdb "
ioflags+="--ifs-and-wam-multio "
ioflags+="--nextgemsout=6 "
ioflags+="--iotasks=16 "
ioflags+="--nemo-multio-server-num=2 "
```



**NOTE:** parallel configuration: 16 ranks per node, 5 OpenMP threads

**NOTE:** NPROMA=32

**NOTE:** mind the `export DR_HOOK_TRAPFPE=0` export, otherwise it tends to fail with SIGFPEs due to nvfortran (NVHPC) known issues

**NOTE:** mind the `--inproot-namelists` flag, which is a required one for the latests RAPS versions

### Runtime configuration, queues and accounts:

The modules which are expected to be loaded at runtime:

```
module load nvidia-hpc-sdk/25.1 mkl/2024.0 hdf5/1.14.1-2-nvidia-nvhpcx fftw/3.3.10-gcc-nvhpc pnetcdf/1.12.3-nvidia-nvhpcx aec/1.1.2-gcc eccodes/2.34.1-gcc python/3.11 gdb/14.2-gcc
```

(must be the same as listed in: `ifs-bundle/arch/eurohpc/mn5-acc/default/env.sh` but that `env.sh` list also contains some modules that are required on a build stage only).

Possible account/qos combinations for SLURM:
- bsc32 / acc_debug (or acc_bsces)
- ehpc01 / acc_debug (or acc_bsces)
- ehpc01 / acc_ehpc

**NOTE:** always compile and run from the *accelerated parttion* login or compute nodes! Running/compiling from general purpose partition nodes will fail with some weird dignostics.
