Protokół komunikacyjny MPI (Message Parsing Interface) umożliwia uruchamianie aplikacji na wielu rdzeniach lub węzłach jednocześnie (tzw. obliczenia rozproszone), o ile jest ona kompatybilna z protokołem MPI. Może również służyć do włączania wielu instancji jednego programu w obrębie pojedynczego zadania.
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.
Przydatne opcje przy uruchamianiu zadań:
-c <cpus>
--cpus-per-task=<cpus> Określa liczbę rdzeni przedzielanych każdemu zadaniu
-n <ntasks>
--ntasks=<ntasks> Określa liczbę uruchmaniaych wątków
-N <nodes>
--nodes=<nodes> Określa liczbę nodów
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-c 1 -n 10
spowoduje uruchomienie 10 wątków tego samego procesu.
Dostępne są dwie implementacje 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
source /usr/local/sbin/modules.sh
module load Python
module load OpenMPI
mpiexec python3 symulacja.py
Rekomendowaną metodą korzystania z intel MPI jest uruchamiane zadania 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
source /usr/local/sbin/modules.sh
export I_MPI_PMI_LIBRARY=/opt/slurm/current/lib64/libpmi.so
module load intel/2021a
srun intel_MPI_script.sh