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