Información y ayuda

HPC Universidad de Oriente

Herramientas de usuario

Herramientas del sitio


hpc-script-openmp

APLICACIÓN OpenMP

OpenMP es una API (Application Programming Interface) para la programación de multiprocesos en memoria compartida. Ese tipo de aplicación usa SMP (Symmetric Multi-Processing) y se conocen como aplicaciones de memoria compartida o aplicación multihilos.

En el HPC UO una aplicación OpenMP se ejecuta en 1 nodo y emplea varios núcleos (cores) de CPU.

1. Compilación

Primero hay que escribir el código OpenMP. Estos códigos tienen directivas pragmas de OpenMP, como por ejemplo #pragma omp <options> para C/C++:

#pragma omp parallel for reduction(+: sum) 
for (i = 0; i < NUM_STEPS; i++) {
    x = 2.0 * (double)i / (double)(NUM_STEPS); /* value of x */
    sum += x * x;
}

La compilación de un código OpenMP se hace con gcc de GNU usando la opción -fopenmp.

Por ejemplo, para compilar openmp-app.c y crear el código compilado openmp-app.x, se carga el módulo GCC y se ejecuta el comando gcc:

module load GCC
gcc -fopenmp -o openmp-app.x openmp-app.c

2. Envío

Para enviar la aplicación compilada, se usa un script de Slurm en el que hay que solicitar los núcleos de CPU que se necesita en un mismo nodo.

Por ejemplo, para solicitar 16 procesos OpenMP para ejecutar openmp-app.x:

#!/bin/bash

#SBATCH --nodes=1                
#SBATCH --ntasks-per-node=16    # 16 procesos totales (verificar que no exceda los 32 hilos)

module load OpenMPI
export OMP_NUM_THREADS=16

cd $SLURM_SUBMIT_DIR
./openmp-app.x 

Se debe notar que se ha usado --ntasks-per-node= para especificar el número de núcleos (cores) de CPU que se quiere usar, en este caso 16. Adicionalmente, se especifica que se requiere 1 nodo.

También hay que limitar el número de núcleos de CPU que se usará con OMP_NUM_THREADS. Esta especificación tiene que ser igual al valor de --ntasks-per-node=.

Para ejecutar la aplicación compilada se usa ./ y a continuación el nombre de la aplicación sin espacios entre ambos.

Otra forma de especificar los hilos del programa es sustituir:

#SBATCH --nodes=1                
#SBATCH --ntasks-per-node=16    # 16 procesos por nodo (16 hilos)

por:

#SBATCH --ntasks=1              # 1 proceso
#SBATCH --cpus-per-task=16      # 16 hilos por proceso

En el caso que exista un requerimiento de memoria, se puede añadir:

#SBATCH --mem-per-cpu=1024      # Memoria mínima requerida por cpu (en megabytes)

O para especificar la memoria total:

#SBATCH --mem=2048              # Memoria requerida por todos los núcleos de CPU
hpc-script-openmp.txt · Última modificación: 2022/12/06 18:25 por Beatriz Valdés Díaz