Najlepsze podejście do GPGPU / CUDA / OpenCL w Javie?

94

Obliczenia ogólnego przeznaczenia na procesorach graficznych ( GPGPU ) to bardzo atrakcyjna koncepcja wykorzystania mocy GPU do dowolnego rodzaju przetwarzania.

Bardzo chciałbym używać GPGPU do przetwarzania obrazu, cząstek i szybkich operacji geometrycznych.

W tej chwili wydaje się, że dwoma rywalami w tej przestrzeni są CUDA i OpenCL. Chciałbym wiedzieć:

  • Czy OpenCL jest już użyteczny w Javie na Windows / Mac?
  • Jakie są sposoby łączenia się bibliotek z OpenCL / CUDA?
  • Czy używanie JNA jest bezpośrednią opcją?
  • Czy o czymś zapominam?

Wszelkie doświadczenia / przykłady / historie wojenne z życia wzięte są mile widziane.

Frederik
źródło
1
Wyobrażałbym sobie, że programowanie GPU w Javie byłoby trudne, biorąc pod uwagę, jak często używam wskaźników w programowaniu CUDA. Nie wiem, czy korzystanie z Javy w programowaniu urządzeń przyniosłoby wiele korzyści, ponieważ jest mało prawdopodobne, aby zaimplementowano pełne funkcje / biblioteki Java, które odróżniają Javę od C ++
Anycorn
2
Widziałem kilka imponujących demonstracji Javy, które korzystały z GLSL i prawdopodobnie CUDA, więc z pewnością jest to możliwe.
Frederik,
1
Czy sprawdziłeś jcuda.org i jocl.org?
bakkal
1
Wiem o nich, ale nie potrafię ocenić jakości. Czy masz z nimi jakieś doświadczenie?
Frederik,
4
@Nils: i dlatego chce wcisnąć wszystkie liczby na GPU ... W każdym razie, nawet zwykły C lub x86 asm miałby trudne zadanie, aby konkurować z ogromnymi równoległymi procesorami danych, takimi jak GPU.
Stringer

Odpowiedzi:

62

AFAIK, JavaCL / OpenCL4Java to jedyne powiązanie OpenCL, które jest obecnie dostępne na wszystkich platformach (w tym MacOS X, FreeBSD, Linux, Windows, Solaris, wszystkie w wersjach Intela 32, 64 bity i ppc, dzięki wykorzystaniu JNA ).

Ma wersje demonstracyjne, które faktycznie działają dobrze z Java Web Start, przynajmniej na Mac i Windows (aby uniknąć przypadkowych awarii w Linuksie, odwiedź tę stronę wiki , taką jak to Demo Particles .

Jest również wyposażony w kilka narzędzi (generowanie liczb losowych GPGPU, podstawowa redukcja równoległa, algebra liniowa) i Scala DSL .

Wreszcie, jest to najstarsze dostępne powiązanie (od czerwca 2009) i ma aktywną społeczność użytkowników .

(Zastrzeżenie: jestem autorem JavaCL :-))

zOlive
źródło
Och, byłem bardzo podekscytowany JNLP, ale najwyraźniej nie podoba mi się mój Macbook. Tyle na temat wielu platform.
Karl
5
@Karl O przepraszam, zepsułem JNLP (ostatnio JAR zmienił nazwy)! To już naprawione, mam nadzieję, że spróbujesz ponownie ... (i na różnych platformach: został zepsuty konsekwentnie na wszystkich platformach ;-))
zOlive
3
Niedawne zaostrzenie bezpieczeństwa Java 7 powoduje, że Particle Demo Web Start kończy się niepowodzeniem z wyjątkiem.
Thorbjørn Ravn Andersen
@zOlive Ostatni link JavaCl do kodu google nie jest już dostępny.
tryman
34

Możesz również rozważyć Aparapi . Umożliwia pisanie kodu w Javie i podejmuje próbę konwersji kodu bajtowego na OpenCL w czasie wykonywania.

Pełne ujawnienie informacji. Jestem programistą Aparapi.

gfrost
źródło
Czy aparapi jest nadal utrzymywane?
Pan Jedi
@MrJedi: Myślę, że tak, ostatnie zatwierdzenie na githubie ma dopiero kilka dni: github.com/aparapi/aparapi
Aydin K.
Jest "trochę utrzymywany";) Jestem opiekunem.
barneypitt
12

Cóż, CUDA jest modyfikacją C, aby napisać jądro CUDA, musisz kodować w C, a następnie skompilować do postaci wykonywalnej za pomocą kompilatora CUDA firmy nvidia. Utworzony kod natywny można następnie połączyć z Javą za pomocą JNI. Więc technicznie nie można pisać kodu jądra z Javy. Jest JCUDA http://www.jcuda.de/jcuda/JCuda.html , zawiera apis Cuda do ogólnego zarządzania pamięcią / urządzeniami oraz niektóre metody Java, które są zaimplementowane w CUDA i JNI (FFT, niektóre metody algebry liniowej .. itd itd..).

Z drugiej strony OpenCL to tylko API. Jądra OpenCL to zwykłe ciągi znaków przekazywane do API, więc używając OpenCL z Javy powinieneś być w stanie określić własne jądra. Wiązanie OpenCL dla java można znaleźć tutaj http://www.jocl.org/ .

Ivan
źródło
2
jeśli JNA ( jna.dev.java.net ) jest obsługiwana na twojej platformie, użyłbym tego do wywołania kodu natywnego, ponieważ jest to znacznie mniej wymagające niż kodowanie biblioteki JNI.
mdma
11

Używam JOCL i jestem z niego bardzo zadowolony.

Główną wadą OpenCL over CUDA (przynajmniej dla mnie) jest brak dostępnych bibliotek (Thrust, CUDPP itp.). Jednak CUDA można łatwo przeportować do OpenCL, a spojrzenie na to, jak działają te biblioteki (algorytmy, strategie itp.), Jest w rzeczywistości bardzo przyjemne, ponieważ wiele się z nim nauczysz.

półwarp
źródło
7

Wiem, że jest późno, ale spójrz na to: https://github.com/pcpratts/rootbeer1

Nie pracowałem z tym, ale wydaje się znacznie łatwiejszy w użyciu niż inne rozwiązania.

Ze strony projektu:

Rootbeer jest bardziej zaawansowany niż CUDA lub OpenCL Java Language Bindings. W przypadku powiązań deweloper musi serializować złożone wykresy obiektów w tablice typów pierwotnych. W przypadku Rootbeer odbywa się to automatycznie. Również w przypadku powiązań językowych programista musi napisać jądro GPU w CUDA lub OpenCL. Dzięki Rootbeer wykonywana jest statyczna analiza kodu bajtowego Java (przy użyciu Soot), a kod CUDA jest generowany automatycznie.

karl
źródło
2

Mogę również polecić JOCL z jogamp.org , działa na Linuksie, Macu i Windowsie. Na przykład CONRAD w dużym stopniu wykorzystuje OpenCL w połączeniu z JOCL.

Michael Dorner
źródło
1

Jeśli chcesz wykonać jakieś przetwarzanie obrazu lub operacje geometryczne, możesz potrzebować biblioteki do algebry liniowej z obsługą GPU (na przykład z CUDA). Sugerowałbym, że ND4J to liniowa algrebra z obsługą GPU CUDA, na której zbudowano DeepLearning4J. Dzięki temu nie musisz bezpośrednio zajmować się CUDA i musisz kodować niskiego poziomu w c. Dodatkowo, jeśli chcesz robić więcej rzeczy z obrazem za pomocą DL4J, będziesz mieć dostęp do określonych operacji przetwarzania obrazu, takich jak konwolucja.

Guillaume Surroca
źródło