Manual de uso

⌘K
  1. Inicio
  2. Manual de uso
  3. 7. Compilación de program...
  4. Programas paralelos y dis...
  5. Paralelización en memoria distribuida (MPI)

Paralelización en memoria distribuida (MPI)

Para compilar programas MPI se recomienda usar sus respectivos wrappersmpicc, mpicxx para C and C++, y  mpif77, mpif90 y mpifort para Fortran. Estos wrappers contienen todas las bibliotecas y herramientas necesarias para la construcción de programas MPI sin tener que especificar los detalles a mano.

Para usar los wrappers, primero hay que cargarlos en nuestra sesión. Cada compilador tiene su propia versión de bibliotecas MPI. Sabiendo esto, es importante cargar las versiones correspondientes:

module load openmpi / module load intel-oneapi-mpi

Para simulaciones que requieren un volumen de cómputo superior a la capacidad de un único nodo físico, se utiliza el paradigma de memoria distribuida mediante la interfaz MPI (Message Passing Interface).

Wrappers de compilación

No se debe compilar un código MPI invocando directamente al compilador base (p.e., gcc o icx) enlazando las bibliotecas a mano. En su lugar, se deben emplear los wrappers estándar del sistema. Estas herramientas actúan como pasarelas que inyectan de forma automática los flags de inclusión (-I), las rutas de búsqueda (-L) y las dependencias de enlazado (-l) necesarias:

  • Para código en C: mpicc

  • Para código en C++: mpicxx (o mpic++)

  • Para código en Fortran: mpifort (Nota: Los wrappers tradicionales mpif77 y mpif90 siguen disponibles por compatibilidad, pero se recomienda estandarizar el uso de mpifort para cualquier estándar moderno de Fortran).

Gestión de entornos e interdependencia de módulos

En PROTEUS coexisten diferentes implementaciones de la especificación MPI (principalmente OpenMPI e Intel MPI). Debido a que las interfaces binarias de las funciones de comunicación dependen estrictamente de la API interna de cada suite, existe una vinculación directa entre el compilador seleccionado y la biblioteca MPI.

Antes de compilar, es necesario cargar en el entorno los módulos complementarios adecuados. Mezclar compiladores y entornos MPI incompatibles generará errores de enlazado (linker errors) o fallos de segmentación en tiempo de ejecución.

Combinaciones de entornos recomendadas:

  1. Suite GNU + OpenMPI o AOCC + OpenMPI: Los compiladores de GNU y los de AOCC deben utilizarse con su versión correspondiente de openMPI

    module purge
    module load gcc/15.1
    module load openmpi/5.0.x  # Ajustar a la versión exacta disponible en el clúster
    

    Comando de compilación (C):

    mpicc mi_simulacion_mpi.c -o sim_mpi.exe
  2. Intel OneAPI + Intel MPI: Combinación altamente optimizada para códigos físicos que se ejecuten en nodos Intel (Kratos, Hermes, Metis)

    module purge
    module load intel-oneapi/2025.3.1
    module load intel-oneapi-mpi/2021.16.0

    Comando de compilación (Fortran):

    mpifort -O3 -xCASCADELAKE mi_simulacion_mpi.f90 -o sim_mpi.exe
    

Diagnóstico de compilación y flags avanzados

Si requiere auditar qué compilador subyacente está invocando el wrapper o qué bibliotecas exactas se están enlazando en su ejecutable científico, puede utilizar el flag de inspección -show:

mpicc -show

Consideraciones para el envío de trabajos (Slurm)

Al construir binarios distribuidos, la ejecución final en los nodos de cómputo asignados no se realiza invocando al ejecutable de forma directa, sino delegando el lanzamiento en el gestor Slurm mediante el comando srun. Este comando se encarga de clonar el mapa de procesos MPI a lo largo de la infraestructura reservada:

# Dentro del script de Slurm (.sh)
srun ./sim_mpi.exe

(Evite el uso del comando tradicional mpirun o mpiexec a menos que requiera un comportamiento no estándar, ya que srun se integra de forma nativa con el control de recursos y la topología de red de Proteus).

¿Cómo podemos ayudarte?