web-dev-qa-db-fra.com

Meilleure approche pour GPGPU / CUDA / OpenCL en Java?

Le calcul général sur des unités de traitement graphique ( GPGPU ) est un concept très attrayant 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.

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

  • OpenCL est-il encore utilisable depuis Java sur Windows/Mac?
  • Quels sont les moyens utilisés par les bibliothèques pour s'interfacer avec OpenCL/CUDA?
  • L'utilisation directe de JNA est-elle une option?
  • Suis-je en train d'oublier quelque chose?

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

89
Frederik

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

Il a des démos qui fonctionnent réellement à partir de Java Web Start au moins sur Mac et Windows (pour éviter les plantages aléatoires sous Linux, veuillez voir cette page wiki , comme celle-ci) Démo des 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 Scala DSL .

Enfin, ce sont les plus anciennes liaisons disponibles (depuis juin 2009) et il a une communauté d'utilisateurs active .

(Avertissement: je suis JavaCL auteur de :-))

58
zOlive

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 développeur Aparapi.

33
gfrost

Eh bien CUDA est une modification de C, pour écrire le noyau CUDA, vous devez coder en C, puis compiler sous forme exécutable avec le compilateur CUDA de nvidia. Le code natif produit pourrait alors être lié avec Java en utilisant JNI. Donc, techniquement, vous ne pouvez pas écrire de code de 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/du périphérique et certaines méthodes Java qui sont implémentées dans CUDA et JNI encapsulées (FFT, certaines méthodes d'algèbre linéaire). . etc..).

D'un autre côté, 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 pouvoir spécifier vos propres noyaux. Liaison OpenCL pour Java peut être trouvé ici http://www.jocl.org/ .

12
Ivan

J'utilise JOCL et j'en suis très content.

Le principal inconvénient d'OpenCL sur 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 avec.

11
halfwarp

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 CUDA ou OpenCL Java Liaisons de langage. Avec les liaisons, le développeur doit sérialiser des graphiques complexes d'objets en tableaux de types primitifs. Avec Rootbeer, cela se fait automatiquement. Aussi avec les liaisons de langue, le le développeur doit écrire le noyau GPU dans CUDA ou OpenCL. Avec Rootbeer une analyse statique du Java Bytecode est effectuée (en utilisant Soot) et le code CUDA est généré automatiquement.

7
karl

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

2
Michael Dorner

Si vous voulez faire du traitement d'image ou des opérations géométriques, vous voudrez peut-être une bibliothèque d'algèbre linéaire avec support gpu (avec CUDA par exemple). Je vous suggère que la sorcière ND4J est l'algèbre linéaire avec prise en charge du processeur graphique CUDA sur laquelle DeepLearning4J est construit. Avec cela, vous n'avez pas à traiter directement avec CUDA et à coder 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.

1
Guillaume Surroca

Vous pouvez jeter un œil à l'API CUDA4J

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

0
user1197918