[en] ABSTRACT: This project explores the possibility of executing a program capable of doing real time video processing on a low computing power and low energy consumption heterogeneous system, which is composed by a CPU and a GPU. To achieve this, different programming models will be used such as programming using thread parallelism and host-device programming. To do this, tools like OpenMP and OpenCL were used. Real time video processing is possible to do on the Raspberry Pi but, obtaining results such as 25 – 30 FPS is not possible due to the low computing capabilities of the system. OpenMP and OpenCL get similar performances about 15 FPS. This platform can execute OpenCL kernels on CPU without issues, but to execute the same code on GPU there are several limitations that stem from the low compute power and experimental OpenCL implementation on the VideoCore IV. Nevertheless, OpenCL is portable, kernel code can be used on other systems without modifying it if the target system supports everything needed in the kernel. For this reason and its similar performance to OpenMP, it is recommended to use OpenCL. Even if perfect results are not achieved, the platform is still interesting from a learning standpoint. It is a cheap and accessible system that can be used to learn parallel programming using shared-memory, distributed memory, or the host-device paradigm. Moreover, it is still possible to explore this kind of system by using similar yet more powerful hardware or using other programming interfaces.

[es] RESUMEN: En este proyecto se explora la posibilidad de realizar procesamiento de vídeo en tiempo real en sistemas heterogéneos compuestos por una CPU y una GPU. Estos sistemas tienen una potencia de cómputo limitada, pero con la ventaja de tener un consumo de energía muy reducido. Para ello se medirá y optimizará el rendimiento de un programa desarrollado utilizando diferentes modelos de programación. Los modelos utilizados son el modelo de memoria compartida y el modelo anfitrión-dispositivo usando herramientas como OpenMP y OpenCL respectivamente. Se ha encontrado que el procesamiento de vídeo en tiempo real es posible, aunque no obtiene resultados satisfactorios (25 - 30 FPS) dada la baja potencia del dispositivo utilizado. Utilizando tanto OpenCL como OpenMP se obtienen rendimientos similares, en torno a 15 FPS. Se ha visto que la plataforma puede ejecutar kernels de OpenCL en CPU sin problemas, pero, para ejecutar el mismo código en GPU existen varias limitaciones debido a la limitada potencia de cálculo y la implementación experimental de OpenCL en Videocore IV. De todas formas, el código de los kernels de OpenCL es portable, por lo que se puede ejecutar en otra plataforma sin necesidad de modificar el kernel mientras tengan todo lo necesario para ejecutarlo. Por esta razón y su similitud de rendimiento con OpenMP, es conveniente utilizar OpenCL directamente. Aunque no se obtengan los resultados esperados, la plataforma sigue siendo interesante desde el punto de vista de aprendizaje puesto que es un sistema barato, accesible y se puede utilizar para aprender a programar aplicaciones paralelas ya sea siguiendo el paradigma de memoria compartida, de memoria distribuida o el paradigma host-device. Además, todavía es posible explorar este tipo de sistema en mayor profundidad ya sea utilizando otro hardware similar pero más potente o explorando otras interfaces de programación.