  Heterogeneous systems have become one of the most common architectures today,
thanks to their excellent performance and energy consumption. However, due to
their heterogeneity they are very complex to program and even more to achieve
performance portability on different devices. This paper presents EngineCL, a
new OpenCL-based runtime system that outstandingly simplifies the co-execution
of a single massive data-parallel kernel on all the devices of a heterogeneous
system. It performs a set of low level tasks regarding the management of
devices, their disjoint memory spaces and scheduling the workload between the
system devices while providing a layered API. EngineCL has been validated in
two compute nodes (HPC and commodity system), that combine six devices with
different architectures. Experimental results show that it has excellent
usability compared with OpenCL; a maximum 2.8% of overhead compared to the
native version under loads of less than a second of execution and a tendency
towards zero for longer execution times; and it can reach an average efficiency
of 0.89 when balancing the load.
