Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Computación Heterogénea con OpenCL
Flores, FacundoUNSAFac. Cs. Exactas
Introducción OpenCL Ejemplo Conclusiones
COMPUTACION HETEROGENEA
Introducción
COMPUTACION HETEROGENEA
● ¿Qué es?
OpenCL Ejemplo Conclusiones
Introducción
COMPUTACION HETEROGENEA
● ¿Qué es?● Un poco de historia
OpenCL Ejemplo Conclusiones
Introducción
COMPUTACION HETEROGENEA
● ¿Qué es?● Un poco de historia
– Inicios de las GPUs
OpenCL Ejemplo Conclusiones
Introducción
COMPUTACION HETEROGENEA
● ¿Qué es?● Un poco de historia
– Inicios de las GPUs
– El futuro many-core
OpenCL Ejemplo Conclusiones
Introducción
COMPUTACION HETEROGENEA
● ¿Qué es?● Un poco de historia
– Inicios de las GPUs
– El futuro many-core
– Plataformas Heterogéneas
OpenCL Ejemplo Conclusiones
Introducción
COMPUTACION HETEROGENEA
● ¿Qué es?● Un poco de historia
– Inicios de las GPUs
– El futuro many-core
– Plataformas Heterogéneas
– Supercomputadoras
OpenCL Ejemplo Conclusiones
Top 3 de las supercomputadoras del 2010(fuente: OpenCL in Action: How to AccelerateGraphics and Computations by Matthew
Scarpino. 2011)
Introducción OpenCL Ejemplo Conclusiones
Introducción
INTRODUCCION A OPENCL
● Inicios de OpenCL
OpenCL Ejemplo Conclusiones
Introducción
INTRODUCCION A OPENCL
● Inicios de OpenCL● ¿Por qué utilizar OpenCL?
OpenCL Ejemplo Conclusiones
Introducción
INTRODUCCION A OPENCL
● Inicios de OpenCL● ¿Por qué utilizar OpenCL?
– Portabilidad
OpenCL Ejemplo Conclusiones
Introducción
INTRODUCCION A OPENCL
● Inicios de OpenCL● ¿Por qué utilizar OpenCL?
– Portabilidad
– Procesamiento estandarizado de vectores
OpenCL Ejemplo Conclusiones
Introducción
INTRODUCCION A OPENCL
● Inicios de OpenCL● ¿Por qué utilizar OpenCL?
– Portabilidad
– Procesamiento estandarizado de vectores
● Software en el mundo Many-Core– Paralelismo
OpenCL Ejemplo Conclusiones
Introducción
INTRODUCCION A OPENCL
● Inicios de OpenCL● ¿Por qué utilizar OpenCL?
– Portabilidad
– Procesamiento estandarizado de vectores
● Software en el mundo Many-Core– Paralelismo
● Paralelismo de tareas● Paralelismo de datos
OpenCL Ejemplo Conclusiones
Introducción
CONCEPTOS BASICOS DE OPENCL
● Descubrir los componentes de nuestro sistema heterogéneo.
● Determinar las características de las componentes del sistema, para que el software se adapte a los diferentes elementos de hardware.
● Crear los bloques de instrucciones que correrán en la plataforma.
● Configurar y manipular los objetos en memoria involucrados en la computación.
● Ejecutar los kernels en el órden correcto y sobre los dispositivos correctos del sistema.
● Recolectar los resultados finales.
OpenCL Ejemplo Conclusiones
Introducción
GPUsOpenCL Ejemplo Conclusiones
Fuente: CUDA_C_Programming_Guide.pdf
Introducción
CPUs/GPUs
● Intel Core i7-3770(Ivy Bridge)– 4 Cores
– 8 Threads(HT)
– 100GFLOPS
– Incluye una poderosa GPU
– ~1.3 GFLOP/Watt
● NVIDIA GeForce 680 (GK104)– 8 SMs
– 1536 Cores
– 2290 GFLOPS
– ~11.7 GFLOP/Watt
OpenCL Ejemplo Conclusiones
Introducción
MODELO DE EJECUCION
● La aplicación consiste en dos partes:– Programa Host
– Kernels
OpenCL Ejemplo Conclusiones
Introducción
MODELO DE EJECUCION
● La aplicación consiste en dos partes:– Programa Host
– Kernels
OpenCL Ejemplo Conclusiones
Introducción
CONTEXTOOpenCL Ejemplo
● EL HOST:– Define el contexto para los kernels.
– Define el NDRange.
– Define las colas de control.
Conclusiones
Introducción
CONTEXTOOpenCL Ejemplo
● Definimos el contexto a través de los siguientes términos:– Devices
– Kernels
– Program objects
– Memory objects
Conclusiones
Introducción
COMMAND-QUEUESOpenCL Ejemplo
● Comandos:– Ejecución del kernel
– Memoria
– Sincronización
● Modos:– In-Order
– Out-of-order
Conclusiones
Fuente: OpenCL Programming Guide by AaftabMunshi, Benedict Gaster, Timothy G. Mattson andJames Fung. 2011
Introducción
MODELO DE PLATAFORMA OPENCL
● Usuario E/S● CPU, GPU, DSP, etc● Caso
CPU/CUDA-GPU– Streaming
Multiprocessor
– Streaming Processor
OpenCL Ejemplo Conclusiones
Fuente: OpenCL Programming Guide by AaftabMunshi, Benedict Gaster, Timothy G. Mattson andJames Fung. 2011
Introducción
Modelo de MemoriaOpenCL Ejemplo
● Host● Global● Constant● Local● Private
Conclusiones
Fuente: OpenCL Programming Guide by AaftabMunshi, Benedict Gaster, Timothy G. Mattson andJames Fung. 2011
Introducción
Modelo de MemoriaOpenCL Ejemplo
●
Conclusiones
Fuente: OpenCL Programming Guide by AaftabMunshi, Benedict Gaster, Timothy G. Mattson andJames Fung. 2011
Introduction
OpenCLOpenCL Ejemplo
● Buenas nuevas:– C/C++
Conclusiones
Introduction
OpenCLOpenCL Ejemplo
● Malas noticias:– 6 nuevas estructuras de datos:
Conclusiones
Introduction
OpenCLOpenCL Ejemplo
● Malas noticias:– 6 nuevas estructuras de datos:
● Platforms● Devices● Contexts● Programs● Command Queues
Conclusiones
Introduction
Tipos de datos primitivosOpenCL Ejemplo Conclusiones
Fuente: OpenCL in Action: How to AccelerateGraphics and Computations by MatthewScarpino. 2011
Introduction
PlatformsOpenCL Ejemplo
● cl_int clGetPlatformIDs
(
cl_uint num_entries,
cl_platform_id *platforms,
cl_uint *num_plaftorms
)
Conclusiones
Introduction
PlatformsOpenCL Ejemplo
/* Definimos los tipos de datos */cl_platform_id *platforms;cl_uint num_platforms;
/* Conseguimos el numero de plataformas disponibles */
clGetPlatformIDs(5, NULL, &num_platforms);
/* Reservamos la memoria */platforms = (cl_platform_id *) malloc((sizeof(cl_platform_id) * num_platforms);
/* Obtenemos las plataformas */clGetPlatformIDs(num_platforms, platforms, NULL);
Conclusiones
Introduction Discussion
DeviceOpenCL Ejemplo
● cl_int clGetDeviceIDs
(
cl_platform_id id_platform,
cl_device_type device_type,
cl_uint num_entries,
cl_device_id *devices,
cl_uint *num_devices
)
Introduction
ContextsOpenCL Ejemplo
● cl_context clCreateContext
(
const cl_context_properties *properties,
cl_uint num_devices,
const cl_devices *devices,
void CL_CALLBACK *notify_func(...),
void *user_data,
cl_int *error
)
Conclusiones
Introduction
ProgramsOpenCL Ejemplo
● clCreateProgramWithSource
(
cl_context context,
cl_uint src_num,
const char **src_strings,
const size_t *src_sizes,
cl_int *error_code
)
Conclusiones
Introduction
Building ProgramsOpenCL Ejemplo
● clBuildProgram
(
cl_program program,
cl_uint num_devices,
const cl_device_id *devices,
const char *options,
void CL_CALLBACK *notify_func(...),
void *user_data
)
Conclusiones
Introduction
Creando KernelsOpenCL Ejemplo
● clCreateKernelsInProgram
(
cl_program program,
cl_uint num_kernels,
cl_kernel *kernels,
cl_uint *num_kernels_ret
)
Conclusiones
Introduction
Command QueuesOpenCL Ejemplo
● clCreateCommandQueue
(
cl_context context,
cl_device_id device,
cl_command_queue_properties properties,
cl_int *err
)
Conclusiones
Introduction
Encolando kernelsOpenCL Ejemplo
● clEnqueueTask
(
cl_command_queue queue,
cl_kernel kernel,
cl_uint num_events,
const cl_event *wait_list,
cl_event *event
)
Conclusiones
Introduction
KERNELSOpenCL Ejemplo
● Tranferencia de datos
Conclusiones
Introduction
KERNELSOpenCL Ejemplo
● Tranferencia de datos
● Particionamiento
Conclusiones
Introduction
Tranferencia de datosOpenCL Ejemplo
● clSetKernelArg
(
clSetKernel kernel,
cl_uint index,
size_t size,
const void *value
)
Conclusiones
Introduction
Tranferencia de datosOpenCL Ejemplo
● clCreateBuffer
(
cl_context context,
cl_mem_flags options,
size_t size,
void *host_ptr,
cl_int *error
)
Conclusiones
Introduction
Tranferencia de datosOpenCL Ejemplo
● clEnqueueReadBuffer(cl_command_queue context, cl_bool blocking, size_t offset, size_t data_size,
void *ptr, cl_uint num_events,
const cl_event *wait_list,
cl_event *event)
Conclusiones
Introduction
Tranferencia de datosOpenCL Ejemplo
● clEnqueueWriteBuffer(cl_command_queue context, cl_mem buffer, cl_bool blocking, size_t offset,
size_t data_size, const void *ptr,
cl_uint num_events, const cl_event *wait_list, cl_event *event)
Conclusiones
Introduction
Particionamiento de DatosOpenCL Ejemplo
● clEnqueueNDRangeKernel(cl_command_queue context, cl_kernel kernel, cl_uint work_dims, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events, const cl_event *wait_list, cl_event *event)
Conclusiones
Introduction
Programación del KernelOpenCL Ejemplo
● Tipos de datos– Tipo de datos vector
● Espacios de dirección– __global
– __constant
– __local
– __private
Conclusiones
Introduction
Programación del KernelOpenCL Ejemplo
● Funciones sobre work-items
Conclusiones
Fuente: OpenCL in Action: How to AccelerateGraphics and Computations by MatthewScarpino. 2011
Introduction
Programación del KernelOpenCL Ejemplo
● Funciones sobre work-groups
Conclusiones
Fuente: OpenCL in Action: How to AccelerateGraphics and Computations by MatthewScarpino. 2011
Introduction Methods
EjemploEjemplo Conclusiones
Introduction Methods
Ejemplo: Caso ParticularEjemplo Conclusiones
Introduction Methods
Ejemplo: Análisis de paralelizaciónEjemplo
● Posibilidad de producto punto
Conclusiones
Introduction Methods Discussion
Ejemplo: Análisis de paralelizaciónEjemplo
__kernel void matrix_vector_mult(__global float4* matrix, __global float4 *vector, __global float *result){
int i = get_global_id(0);result[i] = dot(matrix[i],
vector[0]);}
Introduction Methods
Ejemplo: Análisis de paralelizaciónEjemplo Conclusiones
Introduction Methods
Ejemplo: Muestreo de AplicaciónEjemplo
● Matvec.c● Matvec.cl
Conclusiones
Introduction Methods Results
ConclusionesConclusiones
References
Heterogeneous Computing with OpenCL. Benedict Gaster , Lee Howes , David R. Kaeli , Perhaad Mistry, Dana Schaa. 2011
•OpenCL Programming Guide by Aaftab Munshi, Benedict Gaster, Timothy G. Mattson and James Fung. 2011
•OpenCL in Action: How to Accelerate Graphics and Computations by Matthew Scarpino. 2011
Preguntas?
Muchas gracias!