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

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

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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

Ну CUDA - это модификация C, чтобы написать ядро ​​CUDA, которое вы должны закодировать на C, а затем скомпилировать в исполняемую форму с помощью компилятора nvidia CUDA. Затем полученный собственный код можно связать с Java с помощью JNI. Так что технически вы не можете написать код ядра с Java. Существует JCUDA http://www.jcuda.de/jcuda/JCuda.html, он предоставляет вам cuda apis для общего управления памятью/устройством и некоторые Java-методы, которые реализованы в CUDA и JNI, завернутых (FFT, некоторые методы линейной алгебры.. и т.д. И т.д.).

С другой стороны, OpenCL - это просто API. Ядро OpenCL - это простые строки, переданные API, поэтому с помощью OpenCL с Java вы можете указать свои собственные ядра. Связывание OpenCL для java можно найти здесь http://www.jocl.org/.

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 9

Следуя последним достижениям Google, я полагаю, что tensorflow - лучший подход к вычислению на GPU вообще, а не OpenCL только. Tensorflow поддерживает вычисления OpenCL и CUDA с одним и тем же API.