Meilleure approche pour GPGPU / CUDA / OpenCL en Java?

L’informatique à usage général sur les unités de traitement graphique ( GPGPU ) est un concept très attrayant qui exploite la puissance du processeur graphique pour tout type d’informatique.

J’aimerais utiliser GPGPU pour le traitement des images, les particules et les opérations géomésortingques rapides.

En ce moment, il semble que les deux prétendants dans cet espace sont CUDA et OpenCL. J’aimerais savoir:

  • Est-ce que OpenCL est encore utilisable depuis Java sur Windows / Mac?
  • Quels sont les moyens d’interface avec les bibliothèques OpenCL / CUDA?
  • L’utilisation directe de JNA est-elle une option?
  • Est-ce que j’oublie quelque chose?

Toutes les expériences / exemples / histoires de guerre du monde réel sont appréciés.

AFAIK, JavaCL / OpenCL4Java est la seule liaison OpenCL disponible sur toutes les plates-formes (y compris MacOS X, FreeBSD, Linux, Windows, Solaris, toutes les variantes Intel 32, 64 bits et ppc, grâce à son utilisation de JNA ).

Il y a des démos qui fonctionnent bien depuis Java Web Start au moins sur Mac et Windows (pour éviter les plantages aléatoires sous Linux, veuillez consulter cette page du wiki , telle que cette démonstration de Particles) .

Il est également livré avec quelques utilitaires (génération de nombres aléatoires GPGPU, réduction parallèle de base, algèbre linéaire) et un DSL Scala .

Enfin, c’est la plus ancienne des liaisons disponibles (depuis juin 2009) et elle a une communauté d’utilisateurs active .

(Disclaimer: je suis l’auteur de JavaCL :-))

Vous pouvez également envisager Aparapi . Il vous permet d’écrire votre code en Java et tentera de convertir le bytecode en OpenCL au moment de l’exécution.

Divulgation complète. Je suis le développeur d’Aparapi.

Eh bien CUDA est une modification de C, pour écrire le kernel CUDA que vous devez coder en C, puis comstackr en forme exécutable avec le compilateur CUDA de nvidia. Le code natif produit pourrait alors être lié à Java en utilisant JNI. Donc, techniquement, vous ne pouvez pas écrire le code du kernel à partir de Java. Il y a JCUDA http://www.jcuda.de/jcuda/JCuda.html , il vous fournit les apis de cuda pour la gestion générale de la mémoire / des périphériques et certaines méthodes Java implémentées dans les enveloppes CUDA et JNI (FFT, certaines méthodes d’algèbre linéaire .. etc..).

D’autre part, OpenCL n’est qu’une API. Les kernelx OpenCL sont des chaînes simples transmises à l’API. En utilisant OpenCL depuis Java, vous devriez pouvoir spécifier vos propres kernelx. La liaison OpenCL pour Java peut être trouvée ici http://www.jocl.org/ .

J’ai utilisé JOCL et j’en suis très content.

Le principal inconvénient d’OpenCL par rapport à CUDA (du moins pour moi) est le manque de bibliothèques disponibles (Thrust, CUDPP, etc.). Cependant, CUDA peut être facilement porté sur OpenCL, et en examinant le fonctionnement de ces bibliothèques (algorithmes, stratégies, etc.), il est en fait très utile d’apprendre beaucoup de choses.

Je sais qu’il est tard mais regardez ceci: https://github.com/pcpratts/rootbeer1

Je n’ai pas travaillé avec mais semble beaucoup plus facile à utiliser que d’autres solutions.

De la page du projet:

Rootbeer est plus avancé que CUDA ou OpenCL Java Language Bindings. Avec les liaisons, le développeur doit sérialiser les graphiques complexes des objects en tableaux de types primitifs. Avec Rootbeer, cela se fait automatiquement. De plus, avec les liaisons de langage, le développeur doit écrire le kernel GPU dans CUDA ou OpenCL. Avec Rootbeer, une parsing statique du Java Bytecode est effectuée (en utilisant Soot) et le code CUDA est généré automatiquement.

Je peux également recommander JOCL par jogamp.org , fonctionne sur Linux, Mac et Windows. CONRAD , par exemple, utilise fortement OpenCL en combinaison avec JOCL.

Vous pouvez consulter l’API CUDA4J

http://sett.com/gpgpu/the-cuda4j-api

Suite aux dernières réalisations de Google, je suppose que le tensorflow est la meilleure approche du calcul sur GPU, pas seulement OpenCL. Le stream Tensorflow prend en charge les calculs OpenCL et CUDA avec la même API.