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.
Réponses:
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 :-))
la source
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.
la source
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/ .
la source
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.
la source
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é.
la source
Je peux également recommander JOCL par jogamp.org , fonctionne sur Linux, Mac et Windows. CONRAD , par exemple, utilise fortement OpenCL en combinaison avec JOCL.
la source
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.
la source
Vous pouvez jeter un œil à l'API CUDA4J
http://sett.com/gpgpu/the-cuda4j-api
la source