Дистрибутив OpenCL

#installation #cross-platform #distribution #opencl #simd

#установка #кроссплатформенный #дистрибутив #opencl #simd

Вопрос:

В настоящее время я разрабатываю OpenCL-приложение для очень разнородного набора компьютеров (для конкретизации используется JavaCL). Чтобы максимизировать производительность, я хочу использовать графический процессор, если он доступен, в противном случае я хочу вернуться к процессору и использовать SIMD-инструкции. Мой план состоит в том, чтобы реализовать OpenCL-код с использованием векторных типов, потому что, насколько я понимаю, это позволяет процессорам векторизировать инструкции и использовать SIMD-инструкции.

Однако мой вопрос заключается в том, какую реализацию OpenCL использовать. Например, если на компьютере установлен графический процессор Nvidia, я предполагаю, что лучше всего использовать библиотеку Nvidia, но если графический процессор недоступен, я хочу использовать библиотеку Intel для использования SIMD-инструкций.

Как мне этого добиться? Обрабатывается ли это автоматически или мне нужно включить все библиотеки и реализовать некоторую логику, чтобы выбрать правильную? Такое ощущение, что с этой проблемой сталкивается больше людей, чем я.

Обновление После тестирования различных OpenCL-драйверов это мой опыт до сих пор:

  • Intel: произошел сбой JVM, когда JavaCL попытался его вызвать. После перезагрузки он не привел к сбою JVM, но также не вернул никаких полезных устройств (я использовал Intel I7-CPU). Когда я скомпилировал OpenCL-код в автономном режиме, казалось, что он может выполнять некоторую автоматическую векторизацию, поэтому компилятор Intel кажется довольно приятным.

  • Nvidia: отказалась устанавливать свои WHQL-драйверы, потому что утверждала, что у меня нет Nvidia-карты (на этом компьютере установлена Geforce GT 330M). Когда я попробовал это на другом компьютере, мне удалось пройти весь путь до создания ядра, но при первом выполнении он сбил драйверы (экран некоторое время мерцал, и Windows 7 сказала, что ей нужно перезапустить драйверы). Второе выполнение вызвало синий экран смерти.

  • AMD / ATI: отказался устанавливать 32-разрядный SDK (я пробовал это, поскольку буду использовать 32-разрядную JVM), но 64-разрядный SDK работал хорошо. Это единственный драйвер, на котором мне удалось выполнить код (после перезагрузки, потому что сначала он выдавал загадочное сообщение об ошибке при компиляции). Однако, похоже, он не может выполнять какую-либо неявную векторизацию, и, поскольку у меня нет графического процессора ATI, я не получил никакого увеличения производительности по сравнению с Java-реализацией. Однако, если я использую векторные типы, я могу увидеть некоторые улучшения.

TL; DR Ни один из драйверов, похоже, не готов к коммерческому использованию. Вероятно, мне лучше создать JNI-модуль с C-кодом, скомпилированным для использования SSE-инструкций.

Ответ №1:

Сначала попытайтесь понять хосты и устройства: http://www.streamcomputing.eu/blog/2011-07-14/basic-concept-hosts-and-devices /

В принципе, вы можете просто сделать именно то, что вы описали: проверить, доступен ли определенный драйвер, и если нет, попробуйте следующий. То, что вы выберете в первую очередь, полностью зависит от ваших собственных предпочтений. Я бы выбрал устройство, на котором я лучше всего протестировал свое ядро. В JavaCL вы можете выбрать самое быстрое устройство с помощью JavaCL.createBestContext и CLPlatform.getBestDevice, проверьте код хоста здесь: http://ochafik.com/blog/?p=501

Знайте, что NVidia не поддерживает процессоры через свой драйвер; только AMD и Intel поддерживают. Также немного сложнее ориентироваться на несколько устройств (скажем, 2 графических процессора и процессор).

Ответ №2:

Нет API, предоставляющего то, что вы хотите. однако вы можете сделать следующее:

я предлагаю вам выполнить итерацию по идентификаторам clgetplatformid и запросить количество устройств (clGetDeviceIDs) и тип устройства для каждого устройства; и выберите платформу, которая имеет оба типа. затем создайте карту в коде u’r, которая отображает для каждого типа список платформ, поддерживающих его, упорядоченный некоторым образом. наконец, просто найдите первый элемент в списке, соответствующий CL_DEVICE_TYPE_CPU, и первый элемент, соответствующий CL_DEVICE_TYPE_GPU . если оба возвращаемых результата равны (platform_cpu == platform_gpu), выберите один из них и используйте его для обоих.

если есть платформа, поддерживающая оба варианта, вы получите совпадение, как и раньше, поскольку у вас есть списки заказов. тогда вы также можете выполнять балансировку нагрузки, если хотите, на одной платформе, например, на Intel.

Ответ №3:

Извините за опоздание на вечеринку, но что касается поведения Intel при реализации JavaCL, боюсь, вас укусила ошибка JavaCL :

https://github.com/ochafik/nativelibs4java/issues/297

Исправлено в JavaCL 1.0.0-RC2 !

Приветствия