Запуск OpenCL на оборудовании от разных производителей
Я играл с реализацией ATI OpenCL в их бета-версии Stream 2.0. OpenCL в текущей бета-версии пока использует только процессор, а следующая версия должна поддерживать ядра GPU. Я скачал Stream, потому что на моей машине установлен графический процессор ATI.
Я пишу программное обеспечение, которое получит огромную выгоду от использования графического процессора. Однако это программное обеспечение работает на клиентских компьютерах, и я не могу позволить себе роскошь (как это делают многие научные вычислительные среды) выбирать точное оборудование для разработки и оптимизировать его. Поэтому мой вопрос: если я распространю реализацию ATI OpenCL вместе с моим приложением, будет ли это означать, что он никогда не сможет использовать, например, видеокарты NVidia? И если я использую NVidia OpenCL SDK, он никогда не будет оптимально работать на чипах AMD (учитывая связь ATI/AMD)?
Другими словами, кто в конце концов отвечает за обеспечение реализации OpenCL? Смогут ли пользователи, например, установить "драйвер" OpenCL для своей видеокарты NVidia вместе с "драйвером", который дает им оптимальную производительность на процессоре AMD?
Кроме того, есть ли хорошие / активные форумы поддержки OpenCL, кроме досок объявлений Khronos, или это то место, куда можно пойти? Я видел, что у ATI есть плата, а у NVidia, по-видимому, есть своя, где тусуется сообщество пользователей / разработчиков OpenCL? Это уже объединено в одно место?
2 ответа
В конечном счете, OpenCL будет работать так же, как OpenGL. То есть пользователи будут устанавливать текущие драйверы от своих поставщиков оборудования (ATI, NVIDIA, Intel). Вы, как разработчик, просто будете ссылаться на библиотеку OpenCL при создании ваших приложений. Когда пользователи запускают ваше приложение, оно будет перенаправлено в соответствующие библиотеки конкретных поставщиков, предоставляемые драйверами.
Это способ, которым он будет работать, но он еще не работает таким образом.
Еще одна важная вещь, о которой следует помнить, это то, что вам, вероятно, все равно придется указывать пути к конкретному поставщику, поскольку код, работающий на CPU с использованием OpenCL, вероятно, будет использовать оптимизированные параметры ядра, отличные от кода, работающего на GPU. То же самое, вероятно, справедливо для различий между поставщиками графических процессоров.
Я знаю, что это старый вопрос со старыми ответами выше. Думал, что обновлю его актуальным ответом.
Да, одна реализация ядер и кода OpenCL будет работать на самых разных устройствах сегодня с правильно написанным кодом платформы и перечисления устройств. Правильный код перечисления платформы и устройства довольно просто написать, сложнее всего выбрать, какую платформу или устройство. Вам, вероятно, следует представить в своем приложении параметр конфигурации, в котором пользователь может выбрать один из них или запустить микробенчмарк для каждого из них, динамически выбрать один и кэшировать результаты тестирования.
Люди могут и будут иметь более одной платформы. Например, моя система имеет GTX 580 SLI, поэтому она имеет два устройства на платформе NVidia. Он также имеет Intel OpenCL SDK, поэтому мой процессор CoreI7 990x Extreme также подходит как устройство на платформе Intel.
Да, бинарный файл, разработанный и собранный с использованием, например, NVidia OpenCL SDK, будет работать на ATI или Intel OpenCL, и наоборот. Больше не нужно об этом беспокоиться.
Очевидно, что конечный пользователь может вообще не иметь OpenCL, поэтому вам может потребоваться отложенная загрузка или LoadLibrary opencl.dll и динамическая ссылка.
Я настоятельно рекомендую протестировать ваш код на основе Intel OpenCL SDK, на графических процессорах NVidia и на графических процессорах AMD. Вы, вероятно, найдете ошибки, которые вызывают проблемы на одной платформе, но отлично работают на других. Вы также, вероятно, обнаружите, что совершенно хороший код загадочным образом не дает правильных результатов на одной из этих платформ из-за ошибок драйверов.