Phil Pratt-Szeliga, an instructor at Syracuse University, has released the source code for the Rootbeer compiler – a tool he and colleagues Jim Fawcett and Roy Welch claim makes it significantly easier to write code for execution on a graphics processor.
The benefits of running highly parallel code on a graphics processor – which typically has hundreds or thousands of cores, compared to a CPU’s half-dozen – is well known. Projects including DirectCompute, OpenCL and CUDA all aim to allow coders to port the parallel portions of their programs to GPUs – but Pratt-Szeliga claims they don’t make it easy.
‘When converting a serial program to a parallel program that can run on a graphics processing unit, the developer must choose what functions will run on the GPU‘ explains Pratt-Szeliga. ‘For each function the developer chooses, he or she needs to manually write code to: serialise state to GPU memory; define the kernel code that the GPU will execute; control the kernel launch; and deserialise state back to CPU memory.‘
Seeing that as far too many steps, Pratt-Szeliga developed Rootbeer, a compiler which allows programmers to access the power of the GPU directly within Java. ‘Rootbeer [...] allows developers to simply write code in Java and the (de)serialisation, kernel code generation and kernel launch is done automatically,‘ Pratt-Szeliga explains. ‘This is in contrast to Java language bindings for CUDA or OpenCL, where the developer still has to do these things manually.‘
The Rootbeer compiler supports all the standard Java features, with the exception of dynamic method invocation, reflection and native methods. Despite these restrictions, it promises much: in testing, Pratt-Szeliga and his team developed three performance example applications with the best demonstrating a 100x performance boost compared to CPU-based execution; the worst, admittedly, slowed down by 3x compared to its original version.
While Rootbeer certainly isn’t suitable for every case, it’s a remarkable attempt to bring the benefits of GPGPU computing to additional program types – and for those, like the best-performing test case, that are suited to parallel execution, promises significant performance gains for a very small investment of time and effort.
The full source code for Rootbeer can be downloaded from GitHub.
When converting a serial program to a parallel program that can run on a Graphics Processing Unit (GPU) the developer must choose what functions will run on the GPU. For each function the developer chooses, he or she needs to manually write code to: 1) serialize state to GPU memory, 2) define the kernel code that the GPU will execute, 3) control the kernel launch and 4) deserialize state back to CPU memory.
Rootbeer is a project that allows developers to simply write code in Java and the (de)serialization, kernel code generation and kernel launch is done automatically. This is in contrast to Java language bindings for CUDA or OpenCL where the developer still has to do these things manually.
Rootbeer supports all features of the Java Programming Language except dynamic method invocation, reflection and native methods. The features that are supported are: 1) single and multi-dimensional arrays of primitive and reference types, 2) composite objects, 3) instance and static fields, 4) dynamic memory allocation, 5) inner classes, 6) synchronized methods and monitors, 7) strings and 8) exceptions that are thrown or caught on the GPU. Rootbeer is the most full-featured tool to enable GPU computing from within Java to date.
Rootbeer is highly tested. We have 21k lines of product code and 6.5k lines of test cases that all pass on both Windows and Linux. We have created 3 performance example applications with results ranging from 3X slow-downs to 100X speed-ups. Rootbeer is free and open-source software licensed under the GNU General Public License version 3 (GPLv3).
“Rootbeer: Seamlessly using GPUs from Java” Philip C. Pratt-Szeliga, James W. Fawcett, Roy D. Welch. To appear in HPCC-2012. [pdf]