Распределение OpenCL

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

6
задан Yrlec 13 October 2011 в 19:30
поделиться