Лучший подход для GPGPU / CUDA / OpenCL в Java? - PullRequest
89 голосов
/ 14 апреля 2010

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

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

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

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

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

Ответы [ 8 ]

58 голосов
/ 22 июля 2010

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

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

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

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

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

33 голосов
/ 06 октября 2011

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

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

12 голосов
/ 15 апреля 2010

Ну, CUDA - это модификация C, чтобы написать ядро ​​CUDA, вы должны написать код на C, а затем скомпилировать в исполняемую форму с помощью компилятора nvidia CUDA.Произведенный нативный код может быть затем связан с 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/.

11 голосов
/ 06 мая 2010

Я использую JOCL, и я очень доволен этим.

Основным недостатком OpenCL над CUDA (по крайней мере для меня) является отсутствие доступных библиотек (Thrust, CUDPP и т. Д.). Однако CUDA можно легко перенести в OpenCL, и, глядя на то, как работают эти библиотеки (алгоритмы, стратегии и т. Д.), На самом деле очень приятно, поскольку вы многому научились с ним.

7 голосов
/ 15 августа 2012

Я знаю, что уже поздно, но взгляните на это: https://github.com/pcpratts/rootbeer1

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

со страницы проекта:

Rootbeer является более продвинутым, чем CUDA или OpenCL Java Language Bindings. С привязками разработчик должен сериализовать сложные графы объектов в массивы примитивных типов. С Rootbeer это делается автоматически. Также с привязкой к языку разработчик должен написать ядро ​​графического процессора в CUDA или OpenCL. С помощью Rootbeer выполняется статический анализ байт-кода Java (с использованием Soot) и автоматически генерируется код CUDA.

2 голосов
/ 18 декабря 2014

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

1 голос
/ 21 июня 2019

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

0 голосов
/ 11 ноября 2015

Вы можете взглянуть на API CUDA4J

http://sett.com/gpgpu/the-cuda4j-api

...