Allzweck-Computing auf Grafikprozessoren ( GPGPU ) ist ein sehr attraktives Konzept, um die Leistung der GPU für jede Art von Computing zu nutzen.
Ich würde GPGPU gerne für Bildverarbeitung, Partikel und schnelle geometrische Operationen verwenden.
Momentan scheinen die beiden Konkurrenten in diesem Bereich CUDA und OpenCL zu sein. Ich würde gerne wissen:
- Ist OpenCL noch von Java unter Windows / Mac aus verwendbar?
- Welche Möglichkeiten für Bibliotheken gibt es, um eine Schnittstelle zu OpenCL / CUDA herzustellen?
- Ist die direkte Verwendung von JNA eine Option?
- Vergesse ich etwas?
Alle realen Erfahrungen / Beispiele / Kriegsgeschichten werden geschätzt.
Antworten:
AFAIK, JavaCL / OpenCL4Java ist die einzige OpenCL-Bindung , die derzeit auf allen Plattformen verfügbar ist (einschließlich MacOS X, FreeBSD, Linux, Windows, Solaris, alle in Intel 32-, 64-Bit- und ppc-Varianten, dank der Verwendung von JNA ).
Es gibt Demos, die von Java Web Start aus zumindest unter Mac und Windows einwandfrei funktionieren (um zufällige Abstürze unter Linux zu vermeiden, lesen Sie bitte diese Wiki-Seite , z. B. diese Partikel-Demo .
Es enthält außerdem einige Dienstprogramme (GPGPU-Zufallszahlengenerierung, grundlegende parallele Reduktion, lineare Algebra) und eine Scala-DSL .
Schließlich ist es die älteste verfügbare Bindung (seit Juni 2009) und es gibt eine aktive Benutzergemeinschaft .
(Haftungsausschluss: Ich bin der Autor von JavaCL :-))
quelle
Sie können auch Aparapi in Betracht ziehen . Sie können Ihren Code in Java schreiben und versuchen, den Bytecode zur Laufzeit in OpenCL zu konvertieren.
Vollständige Offenlegung. Ich bin der Aparapi-Entwickler.
quelle
Nun, CUDA ist eine Modifikation von C. Um einen CUDA-Kernel zu schreiben, müssen Sie in C codieren und dann mit dem CUDA-Compiler von nvidia in eine ausführbare Form kompilieren. Der produzierte native Code könnte dann mithilfe von JNI mit Java verknüpft werden. Technisch gesehen kann man also keinen Kernel-Code aus Java schreiben. Es gibt JCUDA http://www.jcuda.de/jcuda/JCuda.html , es bietet Ihnen cudas APIs für die allgemeine Speicher- / Geräteverwaltung und einige Java-Methoden, die in CUDA- und JNI-Wrapped implementiert sind (FFT, einige lineare Algebra-Methoden) .. etc etc ..).
Andererseits ist OpenCL nur eine API. OpenCL-Kernel sind einfache Zeichenfolgen, die an die API übergeben werden. Wenn Sie also OpenCL aus Java verwenden, sollten Sie in der Lage sein, Ihre eigenen Kernel anzugeben. Die OpenCL-Bindung für Java finden Sie hier http://www.jocl.org/ .
quelle
Ich habe JOCL verwendet und bin sehr zufrieden damit.
Der Hauptnachteil von OpenCL gegenüber CUDA (zumindest für mich) ist der Mangel an verfügbaren Bibliotheken (Thrust, CUDPP usw.). CUDA kann jedoch problemlos auf OpenCL portiert werden. Wenn Sie sich ansehen, wie diese Bibliotheken funktionieren (Algorithmen, Strategien usw.), ist dies tatsächlich sehr hilfreich, da Sie viel damit lernen.
quelle
Ich weiß, dass es spät ist, aber sehen Sie sich das an: https://github.com/pcpratts/rootbeer1
Ich habe nicht damit gearbeitet, aber es scheint viel einfacher zu sein als andere Lösungen.
Von der Projektseite:
Rootbeer ist weiter fortgeschritten als CUDA- oder OpenCL-Java-Sprachbindungen. Bei Bindungen muss der Entwickler komplexe Diagramme von Objekten in Arrays primitiver Typen serialisieren. Bei Rootbeer erfolgt dies automatisch. Auch bei Sprachbindungen muss der Entwickler den GPU-Kernel in CUDA oder OpenCL schreiben. Mit Rootbeer wird eine statische Analyse des Java-Bytecodes (unter Verwendung von Soot) durchgeführt und automatisch CUDA-Code generiert.
quelle
Ich kann JOCL auch von jogamp.org empfehlen , funktioniert unter Linux, Mac und Windows. CONRAD verwendet beispielsweise stark OpenCL in Kombination mit JOCL.
quelle
Wenn Sie Bildverarbeitung oder geometrische Operationen ausführen möchten, benötigen Sie möglicherweise eine lineare Algebra-Bibliothek mit GPU-Unterstützung (z. B. mit CUDA). Ich würde Ihnen vorschlagen, dass ND4J die lineare Algrebra mit CUDA-GPU-Unterstützung ist, auf der DeepLearning4J basiert. Damit müssen Sie sich nicht direkt mit CUDA befassen und müssen Code in c auf niedriger Ebene verwenden. Wenn Sie mit DL4J mehr mit Bildern tun möchten, haben Sie Zugriff auf bestimmte Bildverarbeitungsvorgänge wie Faltung.
quelle
Sie können sich die CUDA4J-API ansehen
http://sett.com/gpgpu/the-cuda4j-api
quelle