Moisés Viñas Buceta

Inicio

Hola, soy Moisés Viñas Buceta y trabajo como investigador en el Grupo de Arquitectura de Computadores (GAC) de la Universidade da Coruña.

Mi investigación se centra principalmente en la computación GPGPU usando CUDA y OpenCL. El tema de mi tesis se centra en el desarrollo de HPL, una librería que sirve de ayuda al programador para paralelizar su código muy fácilmente sobre sistemas heterogéneos que emplea OpenCL como backend.

Vayamos al grano...

Vamos a mostrar cuales serían las diferencias de la implementación de un mismo programa en OpenCL y HPL. En el caso que nos ocupa, elegiremos un programa que toma una imagen de entrada, le aplica un filtro sepia y nos devuelve la misma imagen filtrada.

Imagen a filtrar Imagen filtrada
Figura 1. Imagen a filtrar Figura 2. Imagen filtrada

La estructura de un programa OpenCL típico tiene principalmente los siguientes 6 bloques de código:

  1. Puesta en marcha del entorno: Se caracteriza por ir al inicio del programa y por ser posiblemente la tarea más tediosa y propensa a fallos de todo el programa. En este bloque, el usuario debe comunicarse con los dispositivos OpenCL del sistema para permitir posteriormente la ejecución de kernels sobre ellos. En esta etapa también tendremos que tratar con un cantidad ingente de términos OpenCL.
  2. Creación de buffers: Una vez el entorno está preparado, necesitamos decirle qué datos usará el dispositivo.
  3. Carga de datos en el dispositivo: Nuestros datos estarán reservados en el espacio de memoria del hilo de nuestro programa. En este bloque, cargamos los buffers del dispositivo con estos datos.
  4. Creación del kernel: Implementamos el kernel que ejecutaremos en el dispositivo que hayamos seleccionado.
  5. Ejecución del kernel: Con los buffers cargados con los datos correctos, sólo resta la ejecución del kernel que queramos.
  6. Vaciado de datos del dispositivo: Una vez haya concluido la ejecución, los datos del dispositivo han del volver a nuestro programa principal para seguir con el resto del programa que presumiblemente empleará estos datos
Nótese que son los bloques de un programa típico donde únicamente se lanza un kernel una única vez. Este esquema se complicaría en el momento en que estuvíésemos ante sentencias condicionales. HPL elimina estas complicaciones tal y como veremos en la siguiente tabla. Esta tabla recoge las líneas de código de las 6 etapas del programa de filtrado en sus dos implementaciones, OpenCL y HPL.

BLOQUE OpenCL HPL
12900
220
350
41614
5211
650

Si mantienes el interés que has demostrado al leer hasta aquí, te invitamos a que pruebes este test y el resto que puedes descargar de aquí .