Вычисления общего назначения на графических процессорах ( GPGPU ) - очень привлекательная концепция, позволяющая использовать мощность графического процессора для любых вычислений.
Я бы хотел использовать GPGPU для обработки изображений, частиц и быстрых геометрических операций.
Прямо сейчас кажется, что двумя претендентами в этом пространстве являются CUDA и OpenCL. Я хотел бы знать:
- Можно ли использовать OpenCL с Java на Windows / Mac?
- Какие существуют способы взаимодействия библиотек с OpenCL / CUDA?
- Можно ли напрямую использовать JNA?
- Я что-то забываю?
Приветствуется любой реальный опыт / примеры / военные истории.
Ответы:
AFAIK , JavaCL / OpenCL4Java - единственная привязка OpenCL, которая доступна на всех платформах прямо сейчас (включая MacOS X, FreeBSD, Linux, Windows, Solaris, все в вариантах Intel 32, 64 бит и ppc, благодаря использованию JNA ).
У него есть демонстрации, которые на самом деле отлично работают из Java Web Start, по крайней мере, на Mac и Windows (чтобы избежать случайных сбоев в Linux, см. Эту страницу вики , например эту демонстрацию частиц .
Он также поставляется с несколькими утилитами (генерация случайных чисел GPGPU, базовое параллельное сокращение, линейная алгебра) и Scala DSL .
Наконец, это самые старые доступные привязки (с июня 2009 года), и у него есть активное сообщество пользователей .
(Отказ от ответственности: я автор JavaCL :-))
источник
Вы также можете рассмотреть апарапи . Он позволяет писать код на Java и пытается преобразовать байт-код в OpenCL во время выполнения.
Полное раскрытие. Я разработчик Aparapi.
источник
Что ж, 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/ .
источник
Я использую JOCL, и я очень им доволен.
Основным недостатком OpenCL над CUDA (по крайней мере, для меня) является отсутствие доступных библиотек (Thrust, CUDPP и т. Д.). Однако CUDA можно легко портировать на OpenCL, и взглянув на то, как работают эти библиотеки (алгоритмы, стратегии и т. Д.), На самом деле очень приятно, поскольку вы многому научитесь с ним.
источник
Я знаю, что уже поздно, но взгляните на это: https://github.com/pcpratts/rootbeer1
Я не работал с ним, но мне кажется, что его гораздо проще использовать, чем другие решения.
Со страницы проекта:
Rootbeer более продвинутый, чем языковые привязки CUDA или OpenCL Java. С помощью привязок разработчик должен сериализовать сложные графы объектов в массивы примитивных типов. С Rootbeer это делается автоматически. Также с языковыми привязками разработчик должен написать ядро графического процессора на CUDA или OpenCL. С помощью Rootbeer выполняется статический анализ байт-кода Java (с использованием Soot) и автоматически создается код CUDA.
источник
Я также могу порекомендовать JOCL от jogamp.org , работает в Linux, Mac и Windows. CONRAD , например, активно использует OpenCL в сочетании с JOCL.
источник
Если вы хотите выполнить некоторую обработку изображений или геометрические операции, вам может потребоваться библиотека линейной алгебры с поддержкой графического процессора (например, с CUDA). Я бы посоветовал вам ND4J, ведьма - это линейная алгебра с поддержкой CUDA GPU, на которой построен DeepLearning4J. При этом вам не нужно иметь дело с CUDA напрямую, и вам нужно писать код низкого уровня в c. Кроме того, если вы хотите делать больше с изображением с помощью DL4J, у вас будет доступ к определенным операциям обработки изображений, таким как свертка.
источник
Вы можете взглянуть на CUDA4J API
http://sett.com/gpgpu/the-cuda4j-api
источник