Documentos de Académico
Documentos de Profesional
Documentos de Cultura
paralelo?
Cmputo serial
Cmputo paralelo
CPU vs GPU
CPU
GPU
OpenCL
Work-items
Kernels
OpenCL en resumen
Memoria
En OpenCL, grandes objetos de memoria principal del host o del dispositivo
(GPU, Acelerador, etc) necesita un tratamiento especial, la primera razn es
porque esta memoria es relativamente lenta, la segunda es porque las copias
a travs del PCI-Express toman tiempo.
Memoria
clCreateBuffer ( y otras funciones equivalentes )
especifican una serie de banderas que definen el
comportamiento y utilizacin de los buffers de
memoria.
Dichas banderas se pueden clasificar en 3 clases.
Pinned Memory
Este tipo de memoria es especial, una regin de memoria en el
host se liga con una regin de memoria en el dispositivo, durante
las transferencias se le dan accesos exclusivos a cada parte
(Host y dispositivo) para leer o escribir a travs de DMA (Direct
memory access), resultando en tiempos de transferencia
menores.
En OpenCL se habilita utilizando las banderas
CL_MEM_USE_HOST_PTR y CL_MEM_ALLOC_HOST_PTR
junto con las funciones:
clEnqueueMapBuffer
clEnqueueUnmapMemObject
clEnqueueMapBuffer y
clEnqueueUnmapMemObject
Estas funciones hacen lock y un unlock en regiones de memoria ligadas.
CL_MAP_WRITE: Se puede escribir en el buffer, se transferirn datos al
dispositivo por DMA.
CL_MAP_READ: Se puede leer el buffer, se transferirn datos desde el
dispositivo por DMA.
CL_MAP_READ | CL_MAP_WRITE: Habr transferencias durante la
lectura y escritura de la memoria.
Kernel y Work-Items
Work-Items
Work-Items
work_dim indica el numero de
ndices que identifican a cada
Work-Item.
global_work_size es el
nmero total de Work-Items
por cada dimensin.
local_work_size es el nmero
de Work-Items por cada
dimensin de cada WorkGroup.
Kernel
El Kernel es la funcin principal que se ejecutara en paralelo, cada WorkItem ejecuta una copia del kernel.
El modelo de programacin paralela de
datos en OpenCL es de dos tipos:
Explcita: El programador especifica el numero
de Work-Items que ejecutarn el kernel y define
la divisin de Work-Items entre Work-Groups.
Implcita: El programador especifica el numero
de Work-Items que ejecutarn el kernel, y
OpenCL definir la divisin de Work-Items entre
Work-Groups.
Kernel: Definicin
void VectorAdd(float *vector1, float *vector2, float *total)
{
for(int index = 0; index < VECTOR_SIZE; index++)
total[index] = vector1[index] + vector2[index];
}
Definicin serial
__kernel void VectorAdd(__global float *vector1, __global float *vector2, __global float *total)
{
uint index = get_global_id(0);
Definicin paralela
total[index] = vector1[index] + vector2[index];
}
Kernel: Vectores
Imgenes
Imgenes
OpenCL posee una serie de funciones primitivas para la manipulacin de
imgenes, la utilizacin de imgenes en lugar de buffers de datos puede ser
beneficioso en ciertos casos.
Las imgenes se guardan en el cache de texturas del dispositivo (si este lo
soporta).
Este cache de textura permite accesos ms rpidos a los bytes.
Hasta el estndar 1.2, las imgenes solo pueden ser de solo lectura o solo
escritura.
La creacin de estos buffers es diferente del lado del host
El acceso a los datos de la imagen es diferente del lado del Kernel.
Imgenes (Host)
La creacin de buffers de imagen desde el host, se hace a travs de las
funciones:
clCreateImage2D: crea un buffer de imagen de dos dimensiones.
clCreateImage3D: crea un buffer de imagen de tres dimensiones.
clCreateImage: crea un buffer de imagen de cualquier tipo.
Estas funciones son anlogas a clCreateBuffer.
clCreateImage2D y clCreateImage3D son funciones eliminadas desde el
estndar
1.2 y reemplazadas con clCreateImage.
Imgenes (Host)
Imgenes (Kernel)
Los tipos de imgen que son soportados por el kernel.
image2d_t: Una imgen 2D.
image3d_t: Una imgen 3D.
image2d_array_t: Un arreglo de imgenes 2D.
image1d_t: Una imagen 1D
image1d_buffer_t: Una imagen 1D creada desde buffer
image1d_array_t: Un arreglo de imgenes de 1D.
Estos tipos van precedidos por los Calificadores de acceso:
__read_only: Solo lectura.
__write_only: Solo escritura.
Work-groups y Sincronizacin
Work-groups y sincronizacin
Un aspecto esencial del modelo de ejecucin de OpenCL es la definicin de
un ID nico global y una serie de ID nicos locales para los Work-Items.
Estos IDs nos permiten identificar, donde reside cada instancia paralela del
Kernel en el espacio de los ndices.
Work-groups y sincronizacin
Los work-items se ejecutan en grupos, dentro de estos grupos, los work-items
comparten algunos recursos y pueden sincronizarse entre ellos.
La sincronizacin viene a travs de las funciones mem_fence y barrier.
mem_fence: Todos los work-items dentro del work-group deben terminar su
lectura o escritura a memoria al pasar esta funcin, recibe como parmetro,
cualquiera de estas dos constantes o combinacin :
CLK_LOCAL_MEM_FENCE, CLK_GLOBAL_MEM_FENCE.
barrier: Cada work-items dentro del work-group debe esperar en esta
funcin hasta que el resto de los work-items lleguen, recibe como parmetro
cualquiera de estas dos constantes o combinacin:
CLK_LOCAL_MEM_FENCE, CLK_GLOBAL_MEM_FENCE
MinMax
El algoritmo de bsqueda del menor y mayor nmero en un vector, es un
algoritmo iterativo que no se puede paralelizar con la simple tcnica de un
dato por work-item.
MinMax: paralelo
Interoperabilidad entre
OpenCL y OpenGL
Interoperabilidad
OpenCL y OpenGL son dos API con una eficiente interoperabilidad. Por
un lado OpenCL esta diseado para computo paralelo para diferentes
plataformas, mientras que OpenGL es una popular API grfica.
Esta interoperabilidad brinda algunas ventajas:
La programacin de kernels en OpenCL es mas sencillo que utilizar el
lenguaje de sombreado de OpenGL (GLSL).
El cmputo de kernels es asncrono al sistema de render de OpenGL.
OpenCL funciona en otros dispositivos adems de las GPUs.
No hay necesidad de transferencias por el PCIe.
Interoperabilidad
Esta interoperabilidad se logra creando un contexto compartido entre
OpenCL y OpenGL.
Interoperabilidad
Habilitar esta interoperabilidad se hace a travs de la funcin clCreateContext. El
primer parmetro de la funcin define las propiedades del contexto.
Estas propiedades dependen del sistema operativo:
A travs de un Contexto KHR en Linux y Windows:
Linux
glXGetCurrentContext
glXGetCurrentDisplay
Windows
wglGetCurrentContext
wglGetCurrentDC
Y a travs de un Sharegroup en Mac:
CGLGetCurrentContext
CGLGetShareGroup