====== 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 // 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