Procesamiento Paralelo - OpenCL - Introducción procesamiento Los dispositivos de de procesamiento...

Post on 30-Apr-2020

16 views 0 download

Transcript of Procesamiento Paralelo - OpenCL - Introducción procesamiento Los dispositivos de de procesamiento...

Procesamiento ParaleloOpenCL - Introduccion

Javier Iparraguirre

Universidad Tecnologica Nacional, Facultad Regional Bahıa Blanca11 de Abril 461, Bahıa Blanca, Argentina

jiparraguirre@frbb.utn.edu.ar

http://www.frbb.utn.edu.ar/hpc/

5 de mayo de 2016

Marco general

¿Que es OpenCL?

• OpenCL (Open Computing Language)• Estandar para programar plataformas heterogeneas:

CPUs, GPUs, DSPs,• Consta de un lenguaje basado en C99 para armar y una

especificacion de la API• Es soportado por la mayorıa (sino todos) en la industria:

AMD, Intel, NVIDIA, Apple, Android

Caracterısticas

• Codigo portable :)• Se define en cuatro partes

• Modelo de la plataforma• Modelo de ejecucion• Modelo de memoria• Modelo de programacion

Arquitecturas

Una computadora contemporanea

Arquitecuta GPU AMD Radeon 6970

Arquitecuta GPU NVIDIA GTX 580

Modelo de la plataforma

Modelo de la plataforma

• Una unidad central (host) y varios dispositivos deprocesamiento

• Los dispositivos de de procesamiento se dividen enunidades de procesamiento

• Las unidades de procesamiento se dividen en uno o varioselementos de procesamiento

• Cada elemento de procesamiento tiene su contador deprograma!!!

Quien es quien

• Los host son procesadores de proposito general: x86 osimilares

• Los dispositivos son los procesadores especializados:GPUs o DSPs

• Dependiendo de las implementaciones, los cores puedenser considerados de diversas formas

Seleccionando una plataforma

• Usualmente, esta funcion se llama dos veces• La primera llamada se usa para ver la cantidad de

plataformas disponibles en la implementacion• Luego hacemos espacio para los objetos de la plataforma• En la segunda llamada obtenemos los objetos de la

plataforma

Seleccionando un dispositivo

• Una vez que seleccionamos la plataforma, consultamospor los dispositivos

• Se puede especificar el tipo de dispositivo que estamosbuscando: todos, solo GPUs, solo CPUs

• Usualmente usamos dos veces a esta funcion como elcaso anterior

Modelo de ejecucion

Contexto

• Un contexto es un espacio para manejar los objetos yrecursos de OpenCL

• En un programa OpenCL los siguientes conceptos estanasociados a un contexto:

• Dispositivos• Objetos de programa: implementacion de los objetos de

computo• Kernels: Funciones que corren en dispositivos OpenCL (el

codigo de los threads)• Objetos de memoria: los datos operados en el dispositivo

(los datos de los threads)• Colas de comandos: mecanismos de interaccion de

dispositivos (transferencia de datos, ejecucion de kernels ysincronizacion)

Contexto

• Cuando se crea un contexto, el programador provee unalista de dispositivos a asociar

Creando un contexto

• Con esta funcion creamos un contexto, se debe pasar lalista de dispositivos

• cl context properties especifica que plataforma a usar(NULL indica que se usa el provisto por el vendedor pordefecto)

• Se provee un mecanismo de callback para reportar erroresal usuario

Colas de comandos

• La cola de comandos es el mecanismo por el cual elprocesador central (host) le pide una accion a undispositivo (device)

• Hay transferencia de datos a la memoria y ejecucion detarea

• Cada dispositivo tiene su cola de comandos• Los comandos pueden ser sincronicos o asincronicos• Los comandos se pueden ejecutar en orden o no

(out-of-order)

Creando un cola de comandos

• Hay relacion entre la cola de comandos y el contexto• En las propiedades se especifica la ejecucion fuera de

orden y el sensado de desempeno (profilling)

Colas de comandos dentro del contexto

• Las colas de comandos asocian a los dispositivos con elcontexto

Contexto

colacomandos

Objetos de memoria

• Los objetos de memoria es la forma de manejar los datos• Se clasifican en buffers o imagenes• Buffers

• Trozos de memoria contıguos (arreglos, punteros,estructuras)

• Se pueden leer y escribir en ellos• Imagenes

• Objetos 2D o 3D• Solo se acceden como read image() y write image()• Por cada kernel solo se puede leer o escribir

Creando buffers

• Con esta funcion creamos un buffer para un contexto dado• Con los flags especificamos:

• La combinacion de lectura/escritura permitida en los datos• El uso de host pinter para guardar los datos• La copia de los datos desde el host pointer

Objetos de memoria

• Los objetos de memoria estan asociados con un contexto• Deben ser explıcitamente transferidos a los dispositivos

antes de realizar la ejecucion

Contexto

Objetos OpenCL no-inicializados

(se debe transefir los datos)

Transfiriendo datos

• Los comandos para transferir hacia y desde losdispositivos son:

• clEnqueueRead/WriteBuffer/Image• Copiando datos desde el anfitrion (host) al dispositivo

(device) es una escritura• Copiar desde el dispositivo al host es una lectura

• El comando de escritura inicializa el objeto de memoria ylo ubica en un dispositivo

• OpenCL tiene directivas para mapear directamenteobjetos de memoria a un puntero en el host

Transfiriendo datos

• La funcion inicializa el objeto de memoria y escribe losdatos en el dispositivo asociado con la cola de comandos

• El comando va a escribir datos desde un puntero del host(ptr) al dispositivo

• El parametro blocking write especifica si el comandoretorna antes que la transferencia de datos seacompletada

• Los eventos especifica que comandos deben sercompletados antes que este se ejecute

Transfiriendo datos

• Los objetos de memoria se transfieren a los dispositivosespecificando una accion (lectura/escritura) y una cola decomandos

• La especificacion de OpenCL deja abierta la validez deobjetos en multiples dispositivos (depende el proveedor)

Contexto

Las imágenes están en el dispositivo pero son parte del contexto y las ve el host!!

Programas

• En terminos generales, un objeto programa es unacoleccion de Kernels OpenCL

• Puede ser codigo fuente (texto) o un binario compiladopreviamente

• Puede contener datos constantes o funciones auxiliares

• Para crear un objeto programa se requiere leer un archivode texto (codigo fuente) o un binario compilado

• Para compilar son necesarios los siguientesrequerimientos:

• Especificar el dispositivo destino (hay compilacion paracada dispositivo)

• Pasar parametros al compilador (opcional)• Manejar errores de compilacion (opcional)

Programas

• Un objeto de programa es creado y compilado cuando seprovee los fuentes o un binario

Contexto

Objeto programa

Creando un programa

• La funcion crea un objeto programa usando un archivo detexto conteniendo fuentes

• count especifica la cantidad de lıneas en el archivo fuente• El programador debe crear una funcion para leer el codigo

• Si nos las cadenas de caracteres no terminan en NULL,los campos lengths especifican los largos

Compilando un programa

• Esta funcion compila y linkea un ejecutable desde el objetoprograma a cada dispositivo en el ambiente

• En caso de proveer una lista de dispositivos, solo se envıael ejecutable a los dispositivos en la lista

• El el argumento opcional se puede especificarpreprocesador y optimizaciones entre otros

Reportando errores de compilacion

• Si hay un error de compilacion, OpenCL requiere que elprogramador adquiera la salida del compilador

• El error se determina por el valor de error retornado porclBuildProgram()

• Para obtener el mensaje como una cadena de caracteresse debe llamar a clGetProgramBuildInfo() con el objetoprograma y el parametro CL PROGRAM BUILD STATUS

Kernels

• Un kernel es una funcion declarada en un programa quees ejecutada en un dispositivo OpenCL

• Un objeto kernel esta compuesto por la funcion y losargumentos asociados

• Un objeto kernel es creado desde un programa compilado• El programa debe asociar explıcitamente argumentos

(objetos de memoria y primitivas entre otras) con el objetokernel

Kernels

• El objeto kernel es creado por el objeto programa

Contexto

Objeto kernel

Creando un Kernel

• Esta funcion crea un kernel a partir de un objeto programadado

• El objeto kernel creado es especificado por una cadena decaracteres que coincide con el nombre de la funciondentro del programa

Compilacion en tiempo de ejecucion

• Es costoso compilar programas y crear kernels en tiempode ejecucion

• Lo ideal es hacer estas operaciones una sola vez alcomienzo del programa

• Los objetos kernel pueden ser reusados con diferentesargumentos de entrada

cargar código fuenteen un arreglo clCreateProgramWithSource

clCreateProgramWithBinary

clBuildProgramm clCreatekernel

Definiendo argumentos del kernel

• Se debe llamar la funcion clSetKernelArgs• Se debe especificar el ındice del argumento como aparece

en la funcion, el tamano y el puntero a los datos

Ejemplos argumentos del kernel

/ / pr imer ejemploc lSetKerne lArg ( kernel , 0 , s i z e o f ( cl mem ) ,

( vo id ∗)& d i Image ) ;

/ / segundo ejemploc lSetKerne lArg ( kernel , 1 , s i z e o f ( i n t ) , ( vo id ∗)&a ) ;

Imagenes como argumentos de kernels

• Los objetos de memoria y datos individuales pueden sepasados como argumentos de kernels

Contexto

argumentos de kernel

Estructura de threads

• En los programas masivamente paralelos cada threadcomputa una parte del problema

• En el caso de una suma de vectores, cada thread va asumar un elemento del arreglo

• Si lo pensamos de una manera visual, los threads se van aordenar en la misma forma que los datos

Estructura de threads

• Hagamos una suma simple de vectores de 16 elementosC=A+B

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

A

+

B

=

C

índices vectores

suma vectores

Estructura de threads

• Creamos una estructura de threads 1D para resolver elproblema

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

A

+

B

=

C

threads

suma vectores

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Estructura de threads

• Cada thread suma un componente del vector

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

A

+

B

=

C

threads

suma vectores

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Estructura de threads

• La estructura de threads esta disenada para ser escalable• Cada instancia de un kernel es llamada un ıtem de trabajo

(puede ser thread)• Los ıtems de trabajo se organizan en grupos de trabajo• Los grupos de trabajo son independientes entre si (esto

permite escalar)• Un espacio de ındices define una jerarquıa grupos de

trabajo e ıtems de trabajo

Estructura de threads

Estructura de threads

• OpenCL permite identificar a los threads en si mismo y asus datos

• Los threads pueden determinar el ID global en cadadimension

• get global id(dim)• get global size(dim)

• Los threads pueden determinar el ID del grupo de trabajoy el ID dentro del grupo

• get group id(dim)• get num groups(dim)• get local id(dim)• get local size(dim)

• get global id(0) = column, get global id(1) = row• get num groups(0) * get local size(0) == get global size(0)

Modelo de memoria

Modelo de Memoria

• OpenCL define varios tipos de memoria• Esta muy relacionada con la arquitectura del hardware

• Memoria global: accesible a todos los ıtems de trabajo• Memoria constante: solo lectura y global• Memoria local: local a el grupo de trabajo• Memoria privada: privada a un ıtem de trabajo

Modelo de memoria

Modelo de Memoria

• El manejo de memoria es explicito• Se debe mover datos desde el host al dispositivo• Dentro del dispositivo hay que mover los datos desde la

memoria global a la local• Los grupos de trabajo son asignados a ejecutar sobre

unidades de computo• No hay garantıa de coherencia de datos entre dos grupos

de trabajo (no hay mecanismo de software en laespecificacion de openCL)

Escribiendo un kernel

• Una instancia de kernel es creada por cada thread• Los kernels tienen las siguientes caracterısticas:

• Deben comenzar con la palabra clave kernel• Deben tener tipo de retorno void• Debe declarar el espacio de memoria para cada argumento

que es un objeto de memoria (ahora lo vemos)• Debe usar las funciones de la API (por ejemplo

get global id()) para determinar sobre que datos que cadathread va a trabajar

Identificadores de espacios de memoria

• kernel toma memoria desde el espacio global dememoria

• constant un tipo especial de memoria solo lectura• local memoria compartida por el grupo de trabajo• private privado a cada ıtem de trabajo• read only read only usado en imagenes• Los argumentos del kernel que son objetos de memoria

deben ser globales, locales o constantes

Ejemplo de kernel

• Suma simple de dos vectores

k e r n e l

vo id sumaVectores ( g l o b a l i n t ∗ A,g l o b a l i n t ∗ B,g l o b a l i n t ∗ C) {

i n t t i d = g e t g l o b a l i d ( 0 ) ;C[ t i d ] = A [ t i d ] + B [ t i d ] ;

}

Modelo de ejecucion

Ejecutando el kernel

• Se necesita definir las dimensiones del espacio de ındicesy los tamanos de los grupos de trabajo

• Los kernels se ejecutan asinconicamente• clEnqueueNDRangeKernel lo agrega a la cola de

ejecucion, no garantiza el momento de comienzo

Ejecutando el kernel

• La estructura de los threads es definida por el espacio deındices que es creado

• Cada thread ejecuta el mismo kernel sobre una partediferente de los datos

Contexto

se crea un espacio de índices relacionadoa las dimensionesde los datos

Ejecutando el kernel

• La estructura de los threads es definida por el espacio deındices que es creado

• Cada thread ejecuta el mismo kernel sobre una partediferente de los datos

Contexto

se crea un espacio de índices relacionadoa las dimensionesde los datos

Ejecutando el kernel

• La funcion le dice al dispositivo asociado con una cola decomandos que comience a ejecutar el kernel

• El espacio global debe ser especificado y el tamano de losgrupos de trabajo local es opcional

• Se puede proveer una lista de eventos que debencumplirse antes que la operacion se ejecute

Copiando datos al anfitrion

• El ultimo paso es copiar los datos desde el dispositivo alCPU

• Similar a la escritura de datos, pero en este caso haytransferencia del dispositivo al CPU

Copiando datos al anfitrion

Contexto

Liberando recursos

• La matorıa de los objetos OpenCL son deben serliberados luego de ser usados

• Hay una funcion clRelease{Recurso} para la mayorıa delos tipos OpenCL

• Algunos ejemplos son clReleaseProgramm() oclReleaseMemObject()

Verificado errores

• Los comandos OpenCL retornan errores como enterosnegativos

• El valor cero significa ejecucion exitosa CL SUCCESS• Una breve lista de errores:

• -1 CL DEVICE NOT FOUND• -2 CL DEVICE NOT AVAILABLE• -3 CL COMPILER NOT AVAILABLE• -4 CL MEM OBJECT ALLOCATION FAILURE• -5 CL OUT OF RESOURCES

Todo en una foto

Modelo de programacion

• Paralelismo de datos• Mapeo uno-a-uno entre ıtems de trabajo y elementos en

objetos de memoria• Los grupos de trabajo pueden ser definidos explıcitamente

o implıcitamente (se definen los ıtems de trabajo y OpenCLcrea los grupos de trabajo)

• Paralelismo de tareas• El kernel es ejecutado independientemente del espacio de

ındices• Otras formas de paralelismo: enviar a la cola tareas

multiples, usar tipos de vectores especıficos para algundispositivo particular

• Sinconizacion• Es posible entre ıtems en un grupo de trabajo• Es posible entre comandos en una cola de comandos del

mismo contexto

Resumiendo

• OpenCL provee herramientas para operar entre el CPU yGPU

• Se necesita crear un contexto para contener toda lainformacion y datos requeridos en un programa OpenCL

• Se crean objetos de memoria para moverlos hacia y desdelos dispositivos

• Los programas y los kernels contienen el codigo que losdispositivos ejecutan

Compilando

Compilando el primer programa

# Compilando :gcc − I / usr / i nc lude /CL / −lOpenCL \−o a p p l i c a t i o n Vec to rAdd i t i on . cpp

# Ejecutando :. / a p p l i c a t i o n

En detalle

jav ier@orca : ˜ / Downloads / lec02 03 code$ l lt o t a l 16−rw−r−−r−− 1 j a v i e r j a v i e r 176 Jan 17 2011 vectoradd . c l−rw−r−−r−− 1 j a v i e r j a v i e r 10092 Jan 17 2011 Vec to rAdd i t i on . cppjavier@orca : ˜ / Downloads / lec02 03 code$ gcc −I / usr / i nc lude /CL / −lOpenCL −o f i r s t −a p p l i c a t i o n−openCL Vec to rAdd i t i on . cppjavier@orca : ˜ / Downloads / lec02 03 code$ l lt o t a l 32−rwxr−xr−x 1 j a v i e r j a v i e r 12751 Oct 13 15:32 f i r s t −a p p l i c a t i o n−openCL−rw−r−−r−− 1 j a v i e r j a v i e r 176 Jan 17 2011 vectoradd . c l−rw−r−−r−− 1 j a v i e r j a v i e r 10092 Jan 17 2011 Vec to rAdd i t i on . cppjavier@orca : ˜ / Downloads / lec02 03 code$ . / f i r s t −a p p l i c a t i o n−openCLRunning Vector Add i t i on program

1 p la t fo rms detectedPla t fo rm 0:

Vendor : NVIDIA Corporat ionName: NVIDIA CUDA

1 devices detectedDevice 0 :

Device : NVIDIA Corporat ionName: GeForce GTS 450

No b u i l d e r r o r sOutput i s c o r r e c tjav ier@orca : ˜ / Downloads / lec02 03 code$

Profiling

NVIDIA Visual Profiler

• En Linux se ejecuta como nvvp

Comienzo

Profiler

Contacto

¡Muchas gracias!

¿Preguntas?jiparraguirre@frbb.utn.edu.ar

Referencias

• A. Munshi, B. Gaster, T. G. Mattson, J. Fung, D. Ginsburg,“OpenCL Programming Guide”, Addison-WesleyProfessional, 2011.

• B. Gaster, L. Howes, D. R. Kaeli, P. Mistry, D. Schaa,“Heterogeneous Computing with OpenCL”, MorganKaufmann, 2011.

• AMD OpenCL University Kit• NVIDIA CUDA Toolkit