Bester Ansatz für GPGPU / CUDA / OpenCL in Java?

94

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.

Frederik
quelle
1
Ich würde mir vorstellen, dass das Programmieren einer GPU in Java schwierig ist, wenn man bedenkt, wie oft ich Zeiger in der Cuda-Programmierung verwende. Ich weiß nicht, ob die Verwendung von Java in der Geräteprogrammierung von großem Nutzen wäre, da es unwahrscheinlich ist, dass vollständige Java-Funktionen / -Bibliotheken implementiert sind, die Java von C ++ unterscheiden
Anycorn
2
Ich habe einige beeindruckende Java-Demos gesehen, die GLSL und wahrscheinlich CUDA verwendeten, also ist es sicherlich möglich.
Frederik
1
Haben Sie jcuda.org und jocl.org überprüft?
Bakkal
1
Ich weiß über sie Bescheid, kann aber die Qualität nicht beurteilen. Hast du irgendwelche Erfahrungen mit ihnen?
Frederik
4
@Nils: und deshalb möchte er die ganze Zahl auf die GPU drücken ... Wie auch immer, selbst C- oder x86-Asm hätten eine schwierige Aufgabe, sich gegen massive datenparallele Prozessoren wie GPUs zu behaupten.
Stringer

Antworten:

61

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 :-))

zOlive
quelle
Oh, ich war so aufgeregt für das JNLP, aber anscheinend mag es mein Macbook nicht. Soviel zum plattformübergreifenden.
Karl
5
@ Karl Oh, tut mir leid, ich habe die JNLP gebrochen (die JAR hat kürzlich ihren Namen geändert)! Das ist jetzt behoben, hoffe du versuchst es noch einmal ... (und plattformübergreifend: es war auf allen Plattformen konsistent kaputt
;-)
3
Die kürzliche Verschärfung der Java 7-Sicherheit führt dazu, dass der Particle Demo Web Start mit einer Ausnahme fehlschlägt.
Thorbjørn Ravn Andersen
@zOlive Der letzte JavaCl-Link zu Google Code ist nicht mehr verfügbar.
Tryman
34

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.

gfrost
quelle
Wird Aparapi noch gepflegt?
Herr Jedi
@ MrJedi: Ich denke schon, das letzte Commit für Github ist nur einige Tage alt: github.com/aparapi/aparapi
Aydin K.
Es ist "etwas gepflegt";) Ich bin ein Betreuer.
Barneypitt
12

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

Ivan
quelle
2
Wenn JNA ( jna.dev.java.net ) auf Ihrer Plattform unterstützt wird, würde ich dies verwenden, um den nativen Code aufzurufen, da dies viel weniger Aufwand bedeutet als das Codieren einer JNI-Bibliothek.
Mdma
11

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.

Halfwarp
quelle
7

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.

karl
quelle
2

Ich kann JOCL auch von jogamp.org empfehlen , funktioniert unter Linux, Mac und Windows. CONRAD verwendet beispielsweise stark OpenCL in Kombination mit JOCL.

Michael Dorner
quelle
1

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.

Guillaume Surroca
quelle