Saltar a contenido

Tareas paralelas con MPI

Cuando tu código usa MPI (o simplemente quieres varias tareas simultáneas), SLURM lanza las tareas y srun las distribuye.

"Hola mundo" paralelo con srun

Script mpi_hola.sh — distribuye 4 tareas en la cola de CPU:

#!/bin/bash
#SBATCH --job-name=mpi-hola
#SBATCH --partition=cpu
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --cpus-per-task=1
#SBATCH --mem=1G
#SBATCH --time=00:05:00
#SBATCH --output=mpi_hola_%j.out

module load openmpi/4.1.8-gcc12
srun bash -c 'echo "Hola desde la tarea numero $SLURM_PROCID de $SLURM_NTASKS"'

Resultado real del job 31344:

Hola desde la tarea numero 2 de 4
Hola desde la tarea numero 1 de 4
Hola desde la tarea numero 0 de 4
Hola desde la tarea numero 3 de 4

Cada línea es una tarea diferente — por eso el orden no es predecible: las tareas corren en paralelo.

sacct -j 31344 -X --format=JobID,JobName,Partition,State,ExitCode,Elapsed
JobID           JobName  Partition      State ExitCode    Elapsed 
------------ ---------- ---------- ---------- -------- ---------- 
31344          mpi-hola        cpu  COMPLETED      0:0   00:00:05 

Compilar tu propio código MPI

module load gcc/12.3.0 openmpi/4.1.8-gcc12
mpicc -O2 hola_mpi.c -o hola_mpi

Y en tu script SLURM, en lugar del srun bash -c ... del ejemplo:

srun ./hola_mpi

¿Cuántas tareas pedir?

Situación Directivas
Código MPI (una tarea por núcleo) --ntasks=64 --cpus-per-task=1
Código OpenMP (hilos dentro de 1 tarea) --ntasks=1 --cpus-per-task=16
Mixto MPI+OpenMP --ntasks=4 --cpus-per-task=16

Para jobs que necesiten más de un nodo, usa la partición multinodo.

Versión del módulo, tal cual

openmpi/4.1.8-gcc12 está compilado con gcc/12.3.0; también existe openmpi/4.1.8-nvhpc24.3 (compiladores NVHPC) y openmpi/4.1.6-gcc12. Compila siempre con la pareja que corresponda a tu aplicación.