procesamiento paralelo - opencl - introducción procesamiento los dispositivos de de procesamiento...
Post on 30-Apr-2020
23 Views
Preview:
TRANSCRIPT
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
top related