© Excellent backgrounds/Shutterstock.com
Parallelisierung auf der Grafikkarte mit JNI, Rootbeer und CUDA

High-Performance-Computing mit Java


Während die massive Parallelisierung von Aufgaben auf der Grafikkarte im wissenschaftlichen Bereich bereits seit Jahren Standard ist (Wetterprognosen, pathologische Untersuchungen, Früherkennung von Herzkrankheiten etc.), findet sie in Business­anwendungen noch so gut wie keine Anwendung. Dabei steckt in jedem Desktop-PC häufig mehr Rechenpower als in einem Server. Grafikkarten im mittleren Preissegment sind heute schon mit mehreren Tausend GPU-Kernen ausgestattet und bieten eine immense Rechenleistung. Wegen verschiedener Barrieren bleibt diese GPU-Power aber ungenutzt. Dabei bietet Java über JNI das Potenzial, diese Barrieren zu überwinden. Das Framework Rootbeer [1] hat sich dieses Themas angenommen und soll im Folgenden anhand der Bilderkennungs­software „Visualink“ der Firma gjuce vorgestellt werden.

Die Verteilung von Aufgaben auf mehrere Threads ist nicht erst seit gestern ein Thema. Die Leistung von CPU-Kernen steigt nicht mehr so stark an, dafür werden CPUs jetzt mit mehreren Kernen ausgeliefert und können damit mehrere Threads gleichzeitig verarbeiten. Das Ergebnis ist eine bessere Ausnutzung der Ressourcen und damit eine Steigerung der Performance. Vergleicht man eine aktuelle GPU mit einer CPU (Abb. 1), fällt ein enormer Leistungsunterschied auf. Auch wenn ein direkter Vergleich etwas hinkt (Größenunterschied, Architektur etc.), finden auf einem Intel Core i7 1,4 Milliarden Transistoren Platz, während eine NVIDIA GTX 780M mit 3,8 Milliarden Transistoren ausgestattet ist.

bogaard_1.tif_fmt1.jpgAbb. 1: Entwicklung der theoretischen Leistungsfähigkeit verschiedener GPUs gegenüber CPUs; SP = Single Precision; DP = Double Precision [2]

Der Unterschied ist der, dass die Leistung hier auf mehrere tausend GPU-Kerne verteilt wird und nicht auf einige wenige CPU-Kerne. Das heißt, die einzelnen GPU-Kerne sind zwar tendenziell weniger leistungsfähig, können aber in der Masse parallelisierte Aufgaben besser verarbeiten. Je nach Algorithmus, Datenmenge und GPU sind hier Performanceverbesserungen um mehrere hundert Faktoren möglich.

In diesem Artikel wird der Algorithmus einer Bild­erkennungssoftware zur Verarbeitung auf der GPU portiert. Um hier einen Vergleich mit verschiedenen Parallelisierungsverfahren zu erhalten und den Code Schritt für Schritt anzupassen, wird der Algorithmus zuerst für die Parallelisierung auf der CPU umgestellt (Multi-Threading in Java). Anschließend wird der Rootbeer-GPU-Compiler eingesetzt, um den Code in GPU-Code zu überführen.

Was ist eine Bilderk...

Exklusives Abo-Special

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang