Дистрибутив OpenCL - PullRequest
       22

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

6 голосов
/ 13 октября 2011

В настоящее время я разрабатываю 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-инструкций.

Ответы [ 3 ]

4 голосов
/ 13 октября 2011

Сначала попытайтесь понять хосты и устройства: 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 GPU и CPU).

2 голосов
/ 13 октября 2011

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

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

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

1 голос
/ 11 мая 2012

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

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

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

Приветствия

...