Alto rendimiento (HPC)

Optimización de rendimiento y escalabilidad paralela con MPI en OpenFOAM

Guía práctica para maximizar el uso de procesadores multi-núcleo y nodos de clúster, afinando la descomposición con Scotch y el binding de CPU.

D

Dra. Elena Vázquez

Investigadora en HPC & Fluidodinámica

Publicado: 5 de enero de 202513 min de lectura

Optimización de Rendimiento Paralelo en OpenFOAM con MPI

OpenFOAM utiliza el modelo de paso de mensajes MPI (Message Passing Interface) para descomponer espacialmente el dominio de cálculo y repartir el trabajo entre múltiples núcleos de CPU.


1. La Regla de Oro del Escalado Paralelo

Para mantener una eficiencia paralela superior al 80%, debes mantener entre 50.000 y 100.000 celdas por núcleo de CPU.

  • Si asignas menos de 20.000 celdas por núcleo, el tiempo que el procesador dedica a sincronizar las caras de frontera inter-procesador a través del bus de memoria superará al tiempo de cálculo matemático.
  • Esto provoca el fenómeno de escalado negativo (negative scaling), donde añadir más núcleos ralentiza la simulación.

2. Configuración Óptima de decomposeParDict

El método por teoría de grafos `scotch` o `ptscotch` es el estándar de la industria, ya que minimiza la cantidad de caras compartidas entre dominios y balancea automáticamente la carga computacional en geometrías complejas:

text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FoamFile { version 2.0; format ascii; class dictionary; object decomposeParDict; } numberOfSubdomains 32; method scotch; scotchCoeffs { processorWeights ( 1 1 1 1 ... ); }

3. Parámetros de Ejecución con mpirun y Slurm

Para evitar contención en las memorias intermedias L3 (cache thrashing), asegura el binding estricto de hilos a núcleos físicos:

bash
1
2
# Ejecución en estación de trabajo local (16 núcleos físicos) mpirun -np 16 --bind-to core --report-bindings simpleFoam -parallel > log.simpleFoam &

Script de envío para clúster Slurm:

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash #SBATCH --job-name=openfoam_hpc #SBATCH --nodes=2 #SBATCH --ntasks-per-node=64 #SBATCH --time=12:00:00 #SBATCH --partition=compute module load openmpi openfoam/v2606 source $FOAM_BASHRC decomposePar -force srun --mpi=pmi2 simpleFoam -parallel > log.simpleFoam reconstructPar -latestTime