Moisés Viñas Buceta

Comezo

Ola, son Moisés Viñas Buceta e son estudante de doutoramento no Grupo de Arquitectura de Computadores (GAC) da Universidade da Coruña.

A miña investigación céntrase principalmente na computación GPGPU usando CUDA e OpenCL. O tema da miña tese baséase no desenrolo de HPL, unha librería que serve de axuda ó programador para paralelizar o seu código de forma sinxela sobre sistemas heteroxéneos empregando OpenCL como backend.

Probemos un exemplo...

Imos a mostrar cales serían as diferencias de implementación dun mesmo programa en OpenCL e HPL. No caso que nos ocupa, elexiremos un programa que toma unha imaxe de entrada, aplícalle un filtro sepia e nos devolve a mema imaxe filtrada.

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

A estrutura dun programa OpenCL típico ten principalmente os seguintes 6 bloques de código:

  1. Posta en marcha do entorno OpenCL: Caracterízase por ir ó comezo do programa e por ser posiblemente a tarefa más tediosa e propensa a erros de todo o programa. Neste bloque, o usuario debe comunicarse cos dispositivos OpenCL do sistema para permitir posteriormente a execución de kernels sobre eles. Nesta etapa, tamén teremos que tratar cunha cantidade inxente de termos OpenCL.
  2. Creación de buffers: Unha vez o entorno está preparado, necesitamos decirlle qué datos usará o dispositivo.
  3. Carga de datos no dispositivo: Os nosos datos estarán reservados no espacio de memoria do fio do noso programa principal. Neste bloque, cargamos os buffers do dispositivo con estes datos.
  4. Creación do kernel: Implementamos o kernel que executaremos no dispositivo que teñamos seleccionado.
  5. Execución do kernel: Cos buffers cargados cos datos correctos, sólo resta a execución do kernel que queiramos.
  6. Vaciado de datos do dispositivo: Unha vez rematada a execución, os datos do dispositivo volven ó programa principal para seguir co resto do programa que presumiblemente empregará estes datos.
Nótese que son os bloques dun programa típico onde únicamente se lanza un kernel unha única vez. Este esquema complicaríase no momento en que estivésemos ante sentencias condicionales. HPL elimina estas complicacións tal e como veremos na seguinte táboa. Esta táboa recolle as liñas de código das 6 etapas do programa de filtrado nas súas dúas implementacións, OpenCL e HPL.

BLOQUE OpenCL HPL
12900
220
350
41614
5211
650

Se aínda mantés a interese que demostraches ó ler ata aquí, invitámoste a que probes este test e mailo resto que podes descargar de aquí .