2014-02-10 2 views
2

Я разработал приложение C++ на основе архитектуры OpenCL на базе NVidia и хочу распространять его для конечных пользователей.Какие распространяемые ресурсы необходимы конечным пользователям для запуска приложений OpenCL?

К сожалению, похоже, что пользователи с карточкой ATI не могут запускать мою игру, так как DLL, содержащая мой код OpenCL, даже не загружается (динамически), в то время как пользователь с драйверами NVidia может загружать мою dll.

Что такое рекомендуемая «лучшая практика» при отправке приложения на базе OpenCL, которое «работает где угодно»? Возможно ли, чтобы поставщик приложений вставлял все DLL, которые позволят всем пользователям использовать приложение, или пользователи из разных OpenCL-архитектуры вынуждены загружать OpenCL SDK этой архитектуры?

Большое спасибо!

EDIT: Любопытно, что отсутствующая зависимость dll была решена путем добавления NVCuda.dll к моей сборке. (Хотелось бы удалить это!) Однако приведенные здесь ответы весьма полезны для «лучшей практики» в отношении создания приложения OpenCL, которое может работать на большинстве платформ ...

ответ

2

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

Компиляция компилятора устройства AMD требует некоторого времени, в то время как Nvidia может быстро компилироваться. Время компиляции очень низкое, когда вы нацеливаете CPU. Я преобразовал базовую симуляцию C++ Liquid & в opencl-версию и скомпилировал ее через 3 минуты! (Я имею в виду устройство opencl-c компиляции ядер). Если вы хотите дать людям уже скомпилированный проект, то вам нужно будет иметь каждый тип карты на ваш доступ и компиляция & сохранить двоичные файлы для всех них.

Некоторые операции совместного доступа gl-cl-dx могут быть несовместимы между поставщиками.

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

Сообщите своим друзьям о вашей целевой версии opencl.

Не используйте размер локальной рабочей группы размером более 256 для вычислений графических процессоров. Максимальная локальная рабочая группа AMD GPU составляет 256, а Nvidia - 1024.

Не пропустите частные регистры, уменьшите глубину псевдорекурсивных функций, если вам это нужно плохо. Иногда компилятор AMD пытается оптимизировать так сильно, что он взрывается в режиме компиляции собственного устройства.

Используйте «платформу & обертки устройства», которая находит правильный gpu, а не просто получает платформу [0] или устройство [0]. У пользователей может быть несколько платформ, таких как Intel для CPU и AMD для GPU, возможно, все из них. Включенные графические процессоры APU могут быть известны как ACC вместо GPU (Im не уверены в этом)

Ваша неявная синхронизация ядер & buffer_transfers может успешно работать в вашей системе, а не в других системах.

Проверьте, являются ли ваши DLL-приложения или приложения такими же, как и у других людей. & ОС. Если вы нацелились на 64-битный, и у них 32-битная ОС, это не сработает.

+0

Большое спасибо за эту ценную информацию. Похоже, мое использование 1024, которое было так красиво в моей версии NVdia, должно быть сокращено до 256, как вы говорите, и это будет болезненным изменением! Итак, если я правильно прочитал, чем мои пользователи с достойной картой NVidia или AMD, все, что им нужно для компиляции, в то время как пользователям только с процессором Intel требуется загрузка, в то время как у пользователей только с процессором AMD есть все необходимое для компиляции? – Jeepster

+0

Похоже, мой выбор параметров, таких как размер рабочей группы = 1024, будет преследовать меня ... Кто-нибудь видел список «безопасных настроек», которые должны запускаться на самой достойной платформе для ПК-геймеров, предполагая достойную карту AMD или NVidia чем 3 года? – Jeepster

0

Недавние драйверы Catalyst от AMD уже должны обеспечивать поддержку OpenCL. Конечно, когда у кого-то есть старая карта без поддержки OpenCL и/или не установлена ​​последние драйверы, она может вернуться к CPU-OpenCL, иначе она может вообще не работать.Я не уверен, какие предположения вы можете сделать (в отношении системных требований, которые вы заявляете для своей программы), но по крайней мере не должно быть необходимости в собственных специализированных «перераспределяемых», когда у целевой системы есть современные драйверы.

+0

Спасибо, Марко13 за этот полезный пост. Мне придется приспособиться к тому, что платформа более подходит ... просто получил бит, потому что используемый мною алгоритм «префиксной суммы» больше не работает на платформах AMD, и мне нужно найти еще один alg для использования! – Jeepster

0

Вы должны сделать это:

  1. Использование динамических «OpenCL.dll/так» загрузки, таким образом, ваш пользователь не нужно иметь OpenCL вообще. (Необязательно, но очень полезно, вы даже можете вернуться в режим CPU. Кроме того, это заставит вас использовать только чистые вызовы OpenCL)
  2. Используйте только распространенные методы OpenCL, никогда не используйте методы, настроенные компанией, которые зависят от дополнительных DLL , nVIDIA, например, имеет множество инструментов в библиотеке OpenCL, что заставляет вас использовать его с библиотеками и драйверами nVIDIA. Это, например, звонки, которые начинаются с oclXXX().
  3. Напишите ядра и код в общем виде, не ожидайте, что у всех будут одинаковые размеры, память и т. Д. Вы должны иметь возможность обнаруживать ситуации и приспосабливать свое ядро ​​к этим фактам. Используйте на месте компиляцию ядер и добавьте #defines, которые контролируют ваше поведение внутри ядра. Затем вы можете определить их извне, установив обнаруженные аппаратные функции. (Только если вы на самом деле не заботится о вашей безопасности кода

Отвечая на ваши вопросы:.

  • Вам необходимо перераспределить в случае необходимости в DLL от поставщика, который вы используете (т.е.: NVidia) в клиент должен иметь надлежащий OpenCL, даже если он принадлежит другому производителю, он должен работать.
  • Рекомендации по использованию чистого (не относящегося к вендору) OpenCL-кода, поэтому вы не заставляете клиента устанавливать любая конкретная библиотека, и вам не нужно ее устанавливать или распространять с вашим приложением.
+0

Большое спасибо DarkZeros за полезный пост. О вашей точке № 2 о том, что вы не используете вызовы oclXXX(), просматривая мой код, я вижу такие вызовы, как oclGetPlatformID(), oclLoadProgSource(), oclPrintDevInfo(), oclLogBuildInfo() ... вы говорите, что мое приложение не может работать из-за этих вызовов? – Jeepster

Смежные вопросы