Найкращий підхід для GPGPU / CUDA / OpenCL в Java?


94

Загальнообробні обчислення на графічних процесорах ( GPGPU ) - це дуже приваблива концепція для використання потужності графічного процесора для будь-яких обчислень.

Я хотів би використовувати GPGPU для обробки зображень, частинок та швидких геометричних операцій.

Зараз, здається, двома претендентами в цьому просторі є CUDA та OpenCL. Я хотів би знати:

  • Чи можна OpenCL ще використовувати з Java на Windows / Mac?
  • Які бібліотечні способи взаємодії з OpenCL / CUDA?
  • Чи є використання JNA безпосередньо варіантом?
  • Я щось забуваю?

Будь-який реальний досвід / приклади / історії війни цінуються.


1
Я думаю, програмування графічного процесора на Java буде важким, враховуючи, наскільки я використовую покажчики в програмуванні cuda. Я не знаю, чи було б багато користі від використання Java у програмуванні пристроїв, оскільки навряд чи у вас будуть реалізовані повні функції / бібліотеки Java, які відрізняють Java від C ++
Anycorn

2
Я бачив кілька вражаючих демо-версій Java, які використовували GLSL і, мабуть, CUDA, тому це, безумовно, можливо.
Фредерік,

1
Ви перевіряли jcuda.org та jocl.org?
баккал

1
Я знаю про них, проте не можу судити про якість. Чи є у вас досвід із ними?
Фредерік,

4
@Nils: і тому він хоче, щоб натиснути все число, що хрумтить на графічному процесорі ... У будь-якому випадку, навіть звичайний C або x86 asm мав би важке завдання для конкуренції з масивними паралельними процесорами даних, такими як графічні процесори.
Стрингер

Відповіді:


62

AFAIK, JavaCL / OpenCL4Java - це єдине прив'язування OpenCL, яке зараз доступне на всіх платформах (включаючи MacOS X, FreeBSD, Linux, Windows, Solaris, усі у варіантах Intel 32, 64 біти та ppc, завдяки використанню JNA ).

У ньому є демонстраційні програми, які насправді чудово працюють із Java Web Start, принаймні на Mac та Windows (щоб уникнути випадкових збоїв у Linux, перегляньте цю вікі-сторінку , наприклад, цю Демо- версію Particles .

Він також постачається з декількома утилітами (генерація випадкових чисел GPGPU, базове паралельне скорочення, лінійна алгебра) та Scala DSL .

Нарешті, це найдавніші доступні прив’язки (з червня 2009 р.), І вона має активну спільноту користувачів .

(Застереження: я автор JavaCL :-))


О, я був так схвильований за JNLP, але, мабуть, це не подобається моєму macbook. Стільки про крос-платформу.
Карл,

5
@Karl Ой, вибачте, я зламав JNLP (JAR нещодавно змінив імена)! Зараз це виправлено, сподіваюся, ви спробуєте ще раз ... (і на різних платформах: це було порушено послідовно на всіх платформах ;-))
zOlive

3
Нещодавнє посилення безпеки в Java 7 призводить до виходу з ладу Particle Demo Web Start, за винятком.
Thorbjørn Ravn Andersen

@zOlive Останнє посилання JavaCl на код Google більше недоступне.
tryman

34

Ви також можете розглянути Апарапі . Це дозволяє вам писати свій код на Java і намагатиметься перетворити байт-код у OpenCL під час виконання.

Повне розкриття. Я розробник Aparapi.


Чи все ще зберігаються апарапі?
Містер Джедай,

@MrJedi: Я думаю, так, останній коміт на github налічує
Айдін К.

Це "дещо підтримується";) Я супроводжуючий.
barneypitt

12

Ну CUDA - це модифікація C, для написання ядра CUDA вам потрібно закодувати C, а потім скомпілювати у виконувану форму за допомогою компілятора CUDA nvidia. Потім створений власний код можна зв’язати з Java за допомогою JNI. Тож технічно ви не можете писати код ядра з Java. Існує JCUDA http://www.jcuda.de/jcuda/JCuda.html , він надає вам API Cuda для загального управління пам’яттю / пристроєм та деякі методи Java, які реалізовані в CUDA та JNI, обгорнуті (FFT, деякі методи лінійної алгебри .. тощо тощо.).

З іншого боку, OpenCL - це просто API. Ядра OpenCL - це звичайні рядки, передані API, тому, використовуючи OpenCL з Java, ви зможете вказати власні ядра. Прив'язку OpenCL для Java можна знайти тут http://www.jocl.org/ .


2
якщо JNA ( jna.dev.java.net ) підтримується на вашій платформі, я б використав це для виклику власного коду, оскільки це набагато менше зусиль, ніж кодування бібліотеки JNI.
mdma

11

Я використовую JOCL, і я дуже задоволений цим.

Основним недоліком OpenCL перед CUDA (принаймні для мене) є відсутність доступних бібліотек (Thrust, CUDPP тощо). Однак CUDA можна легко перенести на OpenCL, і, подивившись, як працюють ці бібліотеки (алгоритми, стратегії тощо), насправді дуже приємно, оскільки ви багато чого з ним дізнаєтесь.


7

Я знаю, що пізно, але погляньте на це: https://github.com/pcpratts/rootbeer1

Я не працював із цим, але здається набагато простішим у використанні, ніж іншими рішеннями.

На сторінці проекту:

Rootbeer є більш просунутим, ніж CUDA або OpenCL Java Language Bindings. За допомогою прив’язок розробник повинен серіалізувати складні графіки об’єктів у масиви примітивних типів. З Rootbeer це робиться автоматично. Також з мовними прив'язками розробник повинен написати ядро ​​графічного процесора в CUDA або OpenCL. З Rootbeer проводиться статичний аналіз байт-коду Java (за допомогою Soot) і автоматично генерується код CUDA.



1

Якщо ви хочете зробити якусь обробку зображень або геометричні операції, вам може знадобитися бібліотека лінійної алгебри з підтримкою gpu (наприклад, з CUDA). Я б запропонував вам відьму ND4J - це лінійна алгребра з підтримкою графічного процесора CUDA, на якій побудовано DeepLearning4J. Зважаючи на це, вам не доведеться мати справу з CUDA безпосередньо, а потрібно мати код низького рівня в c. Крім того, якщо ви хочете зробити більше речей із зображеннями за допомогою DL4J, ви матимете доступ до певних операцій обробки зображень, таких як згортка.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.