Лучший подход для GPGPU / CUDA / OpenCL в Java?

94

Вычисления общего назначения на графических процессорах ( GPGPU ) - очень привлекательная концепция, позволяющая использовать мощность графического процессора для любых вычислений.

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

Прямо сейчас кажется, что двумя претендентами в этом пространстве являются CUDA и OpenCL. Я хотел бы знать:

  • Можно ли использовать OpenCL с Java на Windows / Mac?
  • Какие существуют способы взаимодействия библиотек с OpenCL / CUDA?
  • Можно ли напрямую использовать JNA?
  • Я что-то забываю?

Приветствуется любой реальный опыт / примеры / военные истории.

Фредерик
источник
1
Я полагаю, что программирование GPU на Java было бы трудным, учитывая, сколько я использую указатели в программировании cuda. Я не знаю, было бы много пользы от использования Java в программировании устройств, поскольку вряд ли у вас будут реализованы полные функции / библиотеки Java, которые отличают Java от C ++
Anycorn,
2
Я видел несколько впечатляющих демонстраций Java, в которых использовались GLSL и, вероятно, CUDA, так что это, безусловно, возможно.
Фредерик,
1
Вы проверяли jcuda.org и jocl.org?
Баккал
1
Я знаю о них, но не могу судить о качестве. Есть ли у вас с ними опыт?
Фредерик,
4
@Nils: вот почему он хочет передать все вычисления на GPU ... В любом случае, даже простой C или x86 asm будет иметь сложную задачу конкурировать с массивными параллельными процессорами данных, такими как графические процессоры.
Stringer

Ответы:

62

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

У него есть демонстрации, которые на самом деле отлично работают из Java Web Start, по крайней мере, на Mac и Windows (чтобы избежать случайных сбоев в Linux, см. Эту страницу вики , например эту демонстрацию частиц .

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

Наконец, это самые старые доступные привязки (с июня 2009 года), и у него есть активное сообщество пользователей .

(Отказ от ответственности: я автор JavaCL :-))

zOlive
источник
О, я был так взволнован JNLP, но, видимо, он не любит мой macbook. Вот и все о кроссплатформенности.
Карл
5
@Karl Ой, извините, я сломал JNLP (JAR недавно изменил имена)! Теперь это исправлено, надеюсь, вы попробуете еще раз ... (и кросс-платформенный: он постоянно ломался на всех платформах ;-))
zOlive
3
Недавнее ужесточение безопасности Java 7 привело к сбою демонстрационного веб-запуска частиц за исключением.
Торбьорн Равн Андерсен
@zOlive Последняя ссылка JavaCl на код Google больше не доступна.
tryman
34

Вы также можете рассмотреть апарапи . Он позволяет писать код на Java и пытается преобразовать байт-код в OpenCL во время выполнения.

Полное раскрытие. Я разработчик Aparapi.

Gfrost
источник
Апарапи все еще сохраняется?
Мистер Джедай,
@MrJedi: Думаю, да, последний коммит на github всего несколько дней назад: github.com/aparapi/aparapi
Айдын К.
Это "несколько поддерживается";) Я сопровождаю.
barneypitt 04
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. С помощью привязок разработчик должен сериализовать сложные графы объектов в массивы примитивных типов. С Rootbeer это делается автоматически. Также с языковыми привязками разработчик должен написать ядро ​​графического процессора на CUDA или OpenCL. С помощью Rootbeer выполняется статический анализ байт-кода Java (с использованием Soot) и автоматически создается код CUDA.

Карл
источник
2

Я также могу порекомендовать JOCL от jogamp.org , работает в Linux, Mac и Windows. CONRAD , например, активно использует OpenCL в сочетании с JOCL.

Майкл Дорнер
источник
1

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

Гийом Суррока
источник