Лучший подход для GPGPU/CUDA/OpenCL на Java?
Вопрос
Вычисления общего назначения на графических процессорах (ГПГПУ) — очень привлекательная концепция использования мощности графического процессора для любых вычислений.
Мне бы хотелось использовать GPGPU для обработки изображений, частиц и быстрых геометрических операций.
На данный момент кажется, что двумя претендентами на эту роль являются CUDA и OpenCL.Я хотел бы знать:
- Можно ли использовать OpenCL с Java на Windows/Mac?
- Каковы способы взаимодействия библиотек с OpenCL/CUDA?
- Можно ли использовать JNA напрямую?
- Я что-то забыл?
Приветствуется любой реальный опыт/примеры/военные истории.
Решение
НАСКОЛЬКО МНЕ ИЗВЕСТНО, Javacl / opencl4java Это единственное привязка OpenCL, которое доступно на всех платформах прямо сейчас (включая MacOS X, FreeBSD, Linux, Windows, Solaris, все в Intel 32, 64 бита и варианты PPC, благодаря его использованию Jna.).
Он имеет демонстрацию, которые на самом деле работают штрафом из веб-сайта Java, как минимум на Mac и Windows (чтобы избежать случайных аварий на Linux, см. Эта вики, такой как это Демо-частицы.
Он также поставляется с несколькими коммунальными услугами (GPGPU случайное образование числа, основное параллельное снижение, линейная алгебра) и Scala DSL.
Наконец, это старые привязки доступны (с июня 2009 года) и У него есть активное сообщество пользователей.
(Отказ от ответственности: я Javacl.Автор :-))
Другие советы
Вы также можете рассмотреть Афарапи. Отказ Это позволяет вам записывать свой код в Java и попытается преобразовать Bytecode в OpenCL во время выполнения.
Полное раскрытие. Я разработчик Апарапи.
Ну, CUDA — это модификация C, чтобы написать ядро CUDA, вам нужно написать код на C, а затем скомпилировать его в исполняемую форму с помощью компилятора CUDA от nvidia.Созданный собственный код затем можно было связать с 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/.
Я использовал жоокл, и я очень доволен этим.
Основным недостатком OpenCL над CUDA (по крайней мере для меня) является отсутствие доступных библиотек (тяга, CUDPP и т. Д.). Однако куда может быть легко перенесена в OpenCl, и, посмотрев на то, как эти библиотеки работают (алгоритмы, стратегии и т. Д.) На самом деле очень хороши, когда вы многому научитесь с ним.
Я знаю, что уже поздно, но взгляните на это: https://github.com/pcpratts/rootbeer1
Я не работал с ним, но мне кажется, что его гораздо проще использовать, чем другие решения.
Со страницы проекта:
Rootbeer более продвинут, чем CUDA или OpenCL Java Language Bindings.С помощью привязок разработчик должен сериализовать сложные графы объектов в массивы примитивных типов.С Rootbeer это делается автоматически.Также при привязке к языку разработчик должен написать ядро графического процессора на CUDA или OpenCL.С помощью Rootbeer выполняется статический анализ байт-кода Java (с использованием Soot), и автоматически генерируется код CUDA.
Я также могу порекомендовать JoCl jogamp.org., работает на Linux, Mac и Windows. Конрад, Например, использует сильно OpenCL в сочетании с jocl.
Если вы хотите выполнить некоторые обработки изображений или геометрические операции, вы можете захотеть библиотеку линейной алгебры с поддержкой GPU (например, CUDA). Я бы предположил, что ND4J ведьма является линейным альгебром с поддержкой CUDA GPU, на которой построен deepleperning4j. С этим вам не нужно иметь дело с CUDA напрямую и иметь низкий уровень кода в C. Кроме того, если вы хотите сделать больше вещей с изображением с DL4J, у вас будет доступ к определенным операциям обработки изображений, таких как свертка.
Вы можете взглянуть на API Cuda4J