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.