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.
Odpowiedzi:
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 :-))
źródło
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.
źródło
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/ .
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
Możesz rzucić okiem na CUDA4J API
http://sett.com/gpgpu/the-cuda4j-api
źródło