OpenMP

Az OpenMP Application Program Interface Specification egy elérhető párhuzamos programozási modell, amely hordozható kódot biztosít a HPE Cray és más gyártók közt.

A CCE környezet az OpenMP 5.0 specifikációját támogatja, részben a 5.1 és 5.2 verziókban lévő funkciók is használhatók.

OpenMP Példa program

Az alábbi egyszerű program szabványos OpenMP hívást valósit meg. A MPI alkalmazáshoz az omp.h header file funkcióit használjuk.

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    // Beginning of parallel region
    #pragma omp parallel
    {
        printf("Hello World... from thread = %d\n",
               omp_get_thread_num());
    }
    // Ending of parallel region
}

További tudnivalók man intro_openmp parancs segítségével érhetők el. Urás a Cray OpenMP dokumentációra

OpenMP CPU

A Cray környezetben alap esetben nem az OpenMP van használaban, ezért ezt az alábbiak szerint lehet megadni a fordításhoz:

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

A következőképpen lehet ellenőrizni az OpenMP linkelést:

ldd a.out |grep mp
     libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f7576184000)

OpenMP GPU

A GPU gyorsítást az NVIDIA HPC SDK környezet segítségvel lehet biztosítani.

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

A következőképpen lehet ellenőrizni, hogy a GPU-ra optimalizált OpenMP lett-e dinamikusan linkelve:

$ ldd a.out |grep nv
     libgomp.so.1 => /opt/software/packages/nvhpc/Linux_x86_64/23.11/compilers/lib/libgomp.so.1 (0x00007ff3e423e000)

OpenMP CPU Batch Job

Szabványos OpenMP párhuzamos alkalmazásokhoz maximum 1 node-ot lehet lefoglalni. Az OMP szálák számát az OMP_NUM_THREADS környezeti változóval kell megadni. A változót vagy az alkalmazás elé kell írni, vagy exportálni kell az indító parancs előtt.

A következő példában egy taskhoz 16 CPU core-t rendeltünk. 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=openmp-cpu
#SBATCH --output=openmp-cpu.out
#SBATCH --time=06:00:00
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=16
OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK ./openmp-cpu

OpenMP GPU Batch Job

GPU esetén az OMP_TARGET_OFFLOAD=MANDATORY környezeti változót kell beállítani.

#!/bin/bash
#SBATCH -A hpcteszt
#SBATCH --partition=gpu
#SBATCH --job-name=openmp-gpu
#SBATCH --output=openmp-gpu.out
#SBATCH --time=06:00:00
#SBATCH --ntasks=1
#SBATCH --gres=gpu:1
OMP_TARGET_OFFLOAD=MANDATORY ./openmp-gpu