  Heterogeneous programming has started becoming the norm in order to achieve
better performance by running portions of code on the most appropriate hardware
resource. Currently, significant engineering efforts are undertaken in order to
enable existing programming languages to perform heterogeneous execution mainly
on GPUs. In this paper we describe Jacc, an experimental framework which allows
developers to program GPGPUs directly from Java. By using the Jacc framework,
developers have the ability to add GPGPU support into their applications with
minimal code refactoring.
  To simplify the development of GPGPU applications we allow developers to
model heterogeneous code using two key abstractions: \textit{tasks}, which
encapsulate all the information needed to execute code on a GPGPU; and
\textit{task graphs}, which capture the inter-task control-flow of the
application. Using this information the Jacc runtime is able to automatically
handle data movement and synchronization between the host and the GPGPU;
eliminating the need for explicitly managing disparate memory spaces.
  In order to generate highly parallel GPGPU code, Jacc provides developers
with the ability to decorate key aspects of their code using annotations. The
compiler, in turn, exploits this information in order to automatically generate
code without requiring additional code refactoring.
  Finally, we demonstrate the advantages of Jacc, both in terms of
programmability and performance, by evaluating it against existing Java
frameworks. Experimental results show an average performance speedup of 32x and
a 4.4x code decrease across eight evaluated benchmarks on a NVIDIA Tesla K20m
GPU.
