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


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

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

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

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

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

8 86

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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