Лучший подход для GPGPU/CUDA / OpenCL в Java?
универсальные вычисления на графических процессорах ( GPGPU) является очень привлекательной концепцией для использования мощности GPU для любого вида вычислений.
Я хотел бы использовать GPGPU для обработки изображений, частиц и быстрых геометрических операций.
прямо сейчас, кажется, два претендента в этом пространстве являются CUDA и OpenCL. Я хотел бы знать:
- можно ли использовать OpenCL еще с Java на Windows / Mac?
- что такое библиотеки способы взаимодействия с OpenCL / CUDA?
- является ли использование JNA непосредственно опцией?
- Я что-то забыла?
любой реальный опыт/примеры/военные истории ценятся.
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.
Следуя последним достижениям Google, я полагаю tensorflow это лучший подход к вычислениям на GPU вообще, а не только OpenCL. Tensorflow поддерживает вычисления OpenCL и CUDA с тем же API.