Hybrid MPI

Hybrid MPI módról akkor beszélünk, ha a párhuzamos alkalmazás Cray MPI-t és OpenMP-t is használ. Az MPI adat továbbítási mechanizmusát lehet kombinálni az OpenMP osztott memória használatával. A hybrid linkelés esetén az alkalmazások kevesebb memóriát képesek fogyasztani az MPI munkamenetekben.

Hybrid Példa program

Az alábbi példa egy hybrid MPI program felépítését mutatja be. Az alkalmazás az mpi.h és az omp.h headerből is tartalmaz funkciókat, azokat kombinálja a lehető legjobb teljesítmény elérése érdekében.

#include <stdio.h>
#include <mpi.h>
#include <omp.h>

int main(int argc, char *argv[])
{
  int numprocs, rank, namelen;
  char processor_name[MPI_MAX_PROCESSOR_NAME];
  int iam = 0, np = 1;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Get_processor_name(processor_name, &namelen);

  #pragma omp parallel default(shared) private(iam, np)
  {
    np = omp_get_num_threads();
    iam = omp_get_thread_num();
    printf("Hello from thread %d out of %d from process %d out of %d on %s\n",
    iam, np, rank, numprocs, processor_name);
  }
MPI_Finalize();
}

További hasznos programozási tudnivalók az OpenMP hivatalos oldalán találhatók. Ugrás a bemutató prezentációhoz

Hybrid MPI CPU

A program fordítása CCE környezetben CPU-hoz:

module swap PrgEnv-cray PrgEnv-gnu
cc hybrid.c -fopenmp

A hybrid dinamikus linkelést a következőképpen lehet ellenőrizni:

$ ldd a.out | grep mp
     libmpi_gnu_103.so.12 => /opt/cray/pe/lib64/libmpi_gnu_103.so.12 (0x00007f871a197000)
     libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f8719f5f000)

Hybrid MPI GPU

A program fordítása CCE környezetben GNU compiler segítségével:

module swap PrgEnv-cray PrgEnv-gnu
module load nvhpc
cc hybrid.c -fopenmp

A hybrid dinamikus linkelést és az Nvidia gyorsítás használatát a következőképpen lehet ellenőrizni:

$ ldd a.out | grep mp
     libmpi_gnu_103.so.12 => /opt/cray/pe/lib64/libmpi_gnu_103.so.12 (0x00007f4ae6c22000)
     libgomp.so.1 => /opt/software/packages/nvhpc/Linux_x86_64/23.11/compilers/lib/libgomp.so.1 (0x00007f4ae5c21000)

Hybrid MPI Nvidia

A program fordítása CCE környezetben Nvidia compiler segítségével:

module swap PrgEnv-cray PrgEnv-nvhpc
cc hybrid.c -mp=gpu -gpu=cc80

A hybrid dinamikus linkelést és az Nvidia gyorsítás használatát a következőképpen lehet ellenőrizni:

$ ldd a.out | grep mp
     libmpi_nvidia.so.12 => /opt/cray/pe/lib64/libmpi_nvidia.so.12 (0x00007f7fa8e98000)
     libnvomp.so => /scratch/software/packages/nvhpc/Linux_x86_64/23.11/compilers/lib/libnvomp.so (0x00007f7fa6db8000)

További példák több GPU kihasználásához az alábbi linken találhatók: https://enccs.github.io/gpu-programming/8-multiple_gpu/#hybrid-mpi-openacc-openmp-with-gpu-awareness-approach

Hybrid CPU Batch Job

Az MPI processzek száma 1-től az egy node-ban található CPU foglalaltok száma. Az OMP szálak ennek megfelelően az egy node-ban található összes CPU core szám vagy annak fele, negyede (értelem szerűen). A jobscript-hez a fenti két mód paramétereit kombinálni kell.

A következő példában 2 node-ot, és node-onként 1-1 taskot indítunk taskonként 16 szállal. A CPU core-ok számát a SLURM_CPUS_PER_TASK változó tartalmazza, és ez állítja be az OMP szálak számát is.

#!/bin/bash
#SBATCH -A hpcteszt
#SBATCH --partition=cpu
#SBATCH --job-name=hybrid-cpu
#SBATCH --output=hybrid-cpu.out
#SBATCH --time=06:00:00
#SBATCH --ntasks=2
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=16
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
srun ./hybrid-cpu

Hybrid GPU Batch Job

GPU futtatás esetén az OMP_TARGET_OFFLOAD=MANDATORY környezeti változót kell beállítani. A példa alkalmazás 1 GPU-t használ.

#!/bin/bash
#SBATCH -A hpcteszt
#SBATCH --partition=gpu
#SBATCH --job-name=hybrid-gpu
#SBATCH --output=hybrid-gpu.out
#SBATCH --time=06:00:00
#SBATCH --ntasks=2
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:1
export OMP_TARGET_OFFLOAD=MANDATORY
srun ./hybrid-gpu