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