Лучший подход для 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, у вас будет доступ к определенным операциям обработки изображений, таким как свертка.
Ответ 8
Вы можете взглянуть на API CUDA4J
http://sett.com/gpgpu/the-cuda4j-api
Ответ 9
Следуя последним достижениям Google, я полагаю, что tensorflow - лучший подход к вычислению на GPU вообще, а не OpenCL только. Tensorflow поддерживает вычисления OpenCL и CUDA с одним и тем же API.