Monday, July 18, 2011

GPU programming on Java

Graphical Processing Units (GPUs) are fujitsu btp-b7k8 battery, fujitsu btp-b8k8 battery used more and more as external accelerators to speed-up workloads normally running on CPUs. The main programming languages allowing to program GPUs are CUDA from NVIDIA and OpenCL from the Khronos consortium and there are both based on the C99 programming language. Beside those programming languages there are some APIs allowing to configure the so called computation kernels: setting parameters, transferring memory to and from the target device, starting the computation. Multiple approaches exist to support GPU programming in Java: simple API wrappers, parallelizing Just-In-Time (JIT) compilers and high-level language integrations.

The wrapper approach already allows to get some good performance improvements when offloading algorithms that match properly the GPU philosophy (data parallelism, good ratio instruction/memory accesses). However, while they allow to control GPU devices from For more information regarding Java, they still require to write native CUDA or OpenCL code to implement the so called computational kernels. And as this step can be quite cumbersome, especially for Java developers, this approach can limits the productivity of developers when trying to port large scale applications on GPUs.

The second technology relies on the asus a42-ul80 battery, asus ul50 battery ability of a JIT compiler to automatically extract from the Java byte-code the kind of parallel computations that could be efficiently executed on a massively parallel Java GPU architecture. This approach is very convenient for the developer as the source code does not require any change, but as automatic generation of efficient parallel code is a very difficult problem, it is quite tricky to understand why the parallelization does not occur in some cases and debugging performance related issue is also difficult as the compiler is the only one to decide where, when and how to generate GPU kernels.

The last approach consists in injecting some GPU specific concepts (memory transfers, memory hierarchy, parallelism, vector types) into the Java language in order to present a unified programming environment to the Java developer. This generally means using some annotations or keywords to tag pieces of Java code that should become kernels, re-targeting parallel constructs or loop iterators to define on which index space a kernel should be executed and relying on nested syntactical scopes or dedicated variable qualifiers to define how variables should be mapped to the private, local or global memory hierarchies available on a GPU. This approach has the advantage of giving more control to the user while not requiring to learn a new programming language, thus making For dell latitude e6120 battery, dell latitude e6220 battery more information regarding GPU programming in Java simple and productive.

No comments:

Post a Comment