Protokół komunikacyjny MPI (Message Parsing Interface) umożliwia pracę aplikacji na wielu rdzeniach lub węzłach jednocześnie (tzw. obliczenia rozproszone), o ile jest ona kompatybilna z protokołem. MPI może jednak służyć również do włączania wielu instancji jednego programu w obrębie pojedynczego zadania.
Przy zadaniach MPI bardzo ważne jest rozróżnienie paramertów
-c
oraz-n
, podanie-c 10
bez-n
spowoduje uruchomienie 10 niezależnych od siebie procesów MPI - tak jak by zostało uruchomionych 10 różnych zadań, każde na jednym rdzeniu.
Podanie-n 10
spowoduje prawidłowe uruchomienie 10 procesów MPI.
Przykładowy mpijob.sh
uruchamiający 10 procesów MPI na dwóch węzłach:
#!/bin/bash
#SBATCH -N2
#SBATCH -n10
#SBATCH --ntasks-per-node=5
#SBATCH -c1
#SBATCH --mem-per-cpu=300
#SBATCH -t10
module load Python
module load OpenMPI
mpiexec python3 symulacja.py
Rozdzielanie zadania na wiele węzłów może okazać się przydatne, gdy jeden węzeł nie posiada oczekiwanej liczby wolnych rdzeni lub też w przypadku, gdy prędkość obliczeń jest ograniczona przepustowością pamięci RAM.
Rekomendowaną metodą uruchamiania intel MPI jest uruchamiane za pomocą srun po wcześniejszym wskazaniu lokalizacji biblioteki slurm PMI.
Przykładowy skrypt do zadania uruchamianego z Intel MPI:
#!/bin/bash
#SBATCH -N2
#SBATCH -n10
#SBATCH --mem=10gb
#SBATCH --time=1:00:00
#SBATCH --job-name=intel_MPI_test
export I_MPI_PMI_LIBRARY=/opt/slurm/current/lib64/libpmi.so
module load intel/2021a
srun intel_MPI_script.sh