Meilleure approche pour GPGPU / CUDA / OpenCL en Java?

94

Le calcul général sur unités de traitement graphique ( GPGPU ) est un concept très attractif pour exploiter la puissance du GPU pour tout type de calcul.

J'adorerais utiliser GPGPU pour le traitement d'image, les particules et les opérations géométriques rapides.

À l'heure actuelle, il semble que les deux prétendants dans cet espace soient CUDA et OpenCL. J'aimerais savoir:

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

Toute expérience / exemples / histoires de guerre du monde réel sont appréciés.

Frederik
la source
1
J'imagine que la programmation du GPU en Java serait difficile, compte tenu de combien j'utilise des pointeurs dans la programmation cuda. Je ne sais pas s'il y aurait beaucoup d'avantages à utiliser Java dans la programmation de périphériques, car il est peu probable que vous ayez implémenté des fonctionnalités / bibliothèques Java complètes qui différencient Java de C ++
Anycorn
2
J'ai vu des démos Java impressionnantes qui utilisaient GLSL et probablement CUDA, donc c'est certainement possible.
Frederik
1
Avez-vous vérifié jcuda.org et jocl.org?
bakkal
1
Je les connais, mais je ne peux pas juger de la qualité. Avez-vous une expérience avec eux?
Frederik
4
@Nils: et c'est pourquoi il veut pousser tout le nombre de calculs sur le GPU ... Quoi qu'il en soit, même C ou x86 asm aurait une tâche difficile pour rivaliser avec d'énormes processeurs parallèles de données comme les GPU.
Stringer

Réponses:

62

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

Il contient des démos qui fonctionnent correctement à partir de Java Web Start au moins sur Mac et Windows (pour éviter les plantages aléatoires sous Linux, veuillez consulter cette page wiki , telle que cette démo de particules .

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, il s'agit de la plus ancienne liaison disponible (depuis juin 2009) et elle dispose d'une communauté d'utilisateurs active .

(Clause de non-responsabilité: je suis l'auteur de JavaCL :-))

zOlive
la source
Oh, j'étais tellement excité pour le JNLP, mais apparemment il n'aime pas mon macbook. Voilà pour multiplateforme.
Karl
5
@Karl Oh désolé, j'ai cassé le JNLP (le JAR a récemment changé de nom)! C'est maintenant corrigé, j'espère que vous réessayez ... (et multi-plateforme: il a été cassé de manière cohérente sur toutes les plateformes ;-))
zOlive
3
Le récent resserrement de la sécurité Java 7 entraîne l'échec du Particle Demo Web Start avec une exception.
Thorbjørn Ravn Andersen
@zOlive Le dernier lien JavaCl vers le code google n'est plus disponible.
tryman
34

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 Aparapi.

gfrost
la source
Aparapi est-il toujours maintenu?
Mr Jedi
@MrJedi: Je pense que oui, le dernier commit sur github n'a que quelques jours: github.com/aparapi/aparapi
Aydin K.
Il est "quelque peu maintenu";) Je suis un mainteneur.
barneypitt
12

Eh bien, CUDA est une modification de C, pour écrire le noyau CUDA, vous devez coder en C, puis compiler sous une 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 de code noyau à partir de Java. Il y a JCUDA http://www.jcuda.de/jcuda/JCuda.html , il vous fournit les API de cuda pour la gestion générale de la mémoire / des périphériques et certaines méthodes Java qui sont implémentées dans CUDA et JNI wrapped (FFT, certaines méthodes d'algèbre linéaire .. etc..).

D'autre part, OpenCL n'est qu'une API. Les noyaux OpenCL sont des chaînes simples passées à l'API, donc en utilisant OpenCL de Java, vous devriez être en mesure de spécifier vos propres noyaux. La liaison OpenCL pour java peut être trouvée ici http://www.jocl.org/ .

Ivan
la source
2
si JNA ( jna.dev.java.net ) est pris en charge sur votre plate-forme, je l'utiliserais pour appeler le code natif, car c'est beaucoup moins d'effort que de coder une bibliothèque JNI.
mdma
11

J'utilise 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 regardant comment ces bibliothèques fonctionnent (algorithmes, stratégies, etc.) est en fait très agréable car vous en apprenez beaucoup.

demi-déformation
la source
7

Je sais qu'il est tard mais jetez un œil à ceci: https://github.com/pcpratts/rootbeer1

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

Depuis la page du projet:

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

Karl
la source
2

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

Michael Dorner
la source
1

Si vous souhaitez effectuer des traitements d'images ou des opérations géométriques, vous pouvez souhaiter une bibliothèque d'algèbre linéaire avec support gpu (avec CUDA par exemple). Je vous suggère que ND4J soit l'algèbre linéaire avec le support du GPU CUDA sur lequel DeepLearning4J est construit. Avec cela, vous n'avez pas à traiter directement avec CUDA et à code de bas niveau en c. De plus, si vous voulez faire plus de choses avec l'image avec DL4J, vous aurez accès à des opérations de traitement d'image spécifiques telles que la convolution.

Guillaume Surroca
la source