[en] ABSTRACT: Due to the emergence of GPUs as general purpose devices with great parallel computing capabilities, heterogeneous systems, which use GPUs and CPUs, have gained special prominence in the field of High Performance Computing. As a result of this, some programming models that make working with heterogeneous devices possible have been developed. However, the support of several different devices offered by these models has an important drawback: device management has to be done independently for each device, with all the difficulties that this carries. Obtaining of a good performance, making the most of all the available resources, is not a trivial task either, because it implies distributing the workload taking the computational power of each device into account and managing memory correctly, because, usually, the memory of the devices is separated. The purpose of this project is developing a programming model that makes distributing the workload among all the resources available in a system possible, transparently to the programmer and making the most of the available computational power. To accomplish this, the model implements 4 load balancing techniques, so workload distribution can be adapted to the needs of each application and resources adequately used. The notion of using an only system, which enables the programmer to communicate with the whole system, instead of communicating with a myriad of isolated devices, is presented too. This idea makes source code portable to systems with different hardware and also reduces the source code length needed to run an application, making programming easier.

[es] RESUMEN: A causa del surgimiento de las GPUs como dispositivos de propósito general con gran capacidad de cómputo paralelo, los sistemas heterogéneos, que utilizan GPUs y CPUs, han cobrado especial protagonismo en el ámbito de la computación de alto rendimiento. A raí z de esto, se han desarrollado modelos de programación que permiten trabajar con dispositivos heterogéneos dentro de un sistema. Sin embargo, el soporte a multitud de dispositivos muy dispares, ofrecido por estos modelos, tiene un inconveniente fundamental: es necesario que la gestión del hardware se realice de forma individual para cada dispositivo, con las dificultades que esto conlleva. Asimismo, la obtención de un buen rendimiento, aprovechando todos los recursos del sistema, no resulta una tarea trivial, pues implica distribuir la carga de trabajo en función de la potencia de cómputo de cada dispositivo y gestionar la memoria adecuadamente, pues, en general, la memoria de cada dispositivo se encuentra separada. El propósito de este proyecto es desarrollar un modelo de programación que permita distribuir el trabajo entre todos los recursos de los que disponga un sistema, de manera transparente al programador y aprovechando toda la potencia de cómputo disponible. Para ello, el modelo implementa 4 técnicas de balanceo de carga que permiten adaptar la forma de distribución de trabajo a las necesidades de cada aplicación, de modo que se aprovechen los recursos adecuadamente. Por otro lado, se introduce la noción de "sistema único", que permite que el usuario se comunique con el sistema completo, en lugar de con una miríada de dispositivos aislados. Esta idea permite que el código sea portable a otros sistemas con hardware diferente y, además, resulta en una disminución de la cantidad de las l neas de código necesarias para ejecutar una aplicación, facilitando la labor de programación.