Información y ayuda

HPC Universidad de Oriente

Herramientas de usuario

Herramientas del sitio


hpc-gpu-memcompartida

Cálculos con GPU en Memoria Compartida

Los cálculos con GPU en memoria compartida se realizan usando la interfaz de programación OpenMP. El modelo de programación de OpenMP es SMP (Symmetric MultiProcessing), lo que significa que cuando se programa con este todos los hilos comparten la memoria y los datos. Se conoce como multiprocesamiento simétrico o multihilo.

OpenMP soporta diferentes lenguajes como C, Fortan, CUDA y otros.

Para trabajar con OpenMP se debe:

1. Incluir directivas de OpenMP en el código fuente del programa a paralelizar

2. Compilar el código resultante

3. Ejecutar y depurar el programa obtenido

La escritura del código fuente para su paralelización depende del lenguaje que se use y, como resultado, se crean ficheros con extensiones .c, .f, .cu para C, Fortan, CUDA, respectivamente. Evidentemente, hay que conocer la sintaxis del código en particular así como la programación de las directivas de OpenMP.

Las directivas de OpenMP en el código fuente se especifican usado cadenas #pragmas. Los pragmas permiten al programador especificar las regiones paralelas, por ejemplo, mediante la paralelización de ciclos, la especificación de variables en la sección paralela, si los hilos se van a sincronizar, etc.

La compilación del código fuente resultante se realiza según el lenguaje utilizado:

Para C:

$ gcc omp_hello.c -o omp_hello -fopenmp 

Para Fortran:

$ gfortran omp_hello.f -o omp_hello -fopenmp 

Para CUDA:

$ nvcc -Xcompile -fopenmp -o omp_hello -I /usr/local/cuda-10.2/cuda-samples/NVIDIA_CUDA-10.2_Samples/common/inc omp_hello.cu 

Después de compilado, la ejecución del programa se realiza invocando el nombre del fichero compilado en la línea de comandos.

Por ejemplo

$ ./omp_hello.

Ejecución en el HPC UO

Para ejecutar un código OpenMP con GPU, hay que confeccionar un script de Slurm y enviarlo con el comando sbatch. Este script debe contener:

- el comando para cargar los módulos de CUDA y el de OpenMPI (que incluye el módulo de GCC).

- las siguientes directivas específicas del trabajo con la GPU:

#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --gres=gpu:m10:X    # X=1,2,3,4  

- el comando para exportar la variable OMP_NUM_THREADS, especificando el número de hilos a usar

export OMP_NUM_THREADS=Y    # Y=1,2,...

- los comandos de ejecución del código compilado y, si son necesarios, otros como salida hacia algún fichero, hacer el profile con nvprof, etc.

A continuación se listan algunos ejemplos sencillos de cálculos con OpenMP en GPU con sus correspondientes scripts de Slurm.

1. Ejemplo C

2. Ejemplo Fortran

3. Ejemplo CUDA

hpc-gpu-memcompartida.txt · Última modificación: 2022/12/14 15:05 por Beatriz Valdés Díaz