Текущая практика развертывания кода GPU для разных семейств GPU

Ситуация такова; набор вычислений (написанных на C++), которые лучше всего выполнять с использованием любого графического процессора, доступного в системе пользователя, или его ЦП, если такого графического процессора не существует, где эта пользовательская система не является машиной для сборки и будет неизвестной (но довольно стандартная настольная) конфигурация.

В настоящее время я могу писать код с помощью Thrust, но (если я не ошибаюсь) в момент его фактической сборки цель установлена ​​(в широком смысле, Nvidia или просто ЦП), и двоичный файл будет использовать только аппаратное обеспечение графического процессора на компьютере пользователя ( возможно, иначе даже не запустится), если он из того же семейства графических процессоров, для которого был создан двоичный файл.

Что бы я хотел в волшебном идеальном мире, так это двоичный файл, который будет определять, какое (если есть) семейство графических процессоров (Nvidia, ATI, откат к простому процессору) доступно на машине, на которой оно работает, и использовать его. Необходимость создавать три отдельные версии и убедиться, что каждый пользователь получает правильную версию для своей конкретной машины, не является стартовой задачей (целями являются довольно стандартные рабочие столы; каждый из этих трех вполне приемлем; цель состоит в том, чтобы иметь двоичный файл для каждой из этих трех целей, который идентифицирует и использует доступный графический процессор сам по себе, будь то Nvidia, ATI или просто ЦП).

Я набирал несколько обнадеживающих терминов в Google, но пока не нашел ничего, что касалось бы этого; насколько я знаю, это полностью решенная проблема, и я просто не набрал нужных слов.

Может ли кто-нибудь сказать мне, что (если есть) стандартный способ сделать это?

Правки: удалена информация о неверной тяге, добавлено примечание об оборудовании конечной цели.


person Moschops    schedule 19.07.2015    source источник
comment
Нет такого понятия как тяга для ATI. Это библиотека шаблонов только для CUDA. На платформах NVIDIA вы можете создавать столько архитектур CUDA, сколько захотите, а выбор архитектуры графического процессора происходит автоматически, вам не нужно ничего делать.   -  person talonmies    schedule 19.07.2015
comment
это вопросы, которые задает nvidia-nsight, для проектов, которые напрямую используют функции cuda   -  person Behrooz    schedule 19.07.2015
comment
На самом деле это вопрос о рекомендации стороннего ресурса (языка/среды программирования GPU).   -  person Puppy    schedule 19.07.2015
comment
Это действительно вопрос о рекомендации стороннего ресурса Гоша, не так ли? Я думал, что это был вопрос о том, какова текущая передовая практика. Я сам могу найти кучу сторонних ресурсов по программированию на GPU. Чего я не могу найти, так это того, как другие люди справляются с необходимостью ориентироваться на несколько систем конечных пользователей.   -  person Moschops    schedule 19.07.2015


Ответы (2)


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

person Behrooz    schedule 19.07.2015

Насколько мне известно, единственным стандартом, работающим как с AMD/ATI, так и с Nvidia GPGPU, является OpenCL. CUDA — это запатентованная технология Nvidia. Конечно, для этого требуется, чтобы реализация OpenCL была доступна (и ее было бы целесообразно использовать).

Вас могут заинтересовать PIPS4U, OpenACC, OpenMP или даже MPI и т. д. Также обратите внимание на многопоточность, например с поддержкой C++11 thread.

Обратите внимание, что на некоторых компьютерах (например, на многих серверах) нет GPGPU. У других может быть GPGPU, который медленнее, чем их процессор, поэтому его не стоит использовать для вычислительных задач. Некоторые чипы AMD имеют APU. Другие имеют HSA. Гетерогенные вычисления с помощью GPGPU недостаточно стандартизированы.

Имейте в виду, что программное обеспечение GPGPU должно быть настроено (или настроено) в соответствии с конкретным оборудованием, на котором оно работает... Вот почему трудно кодировать эффективное программное обеспечение OpenCL (или Cuda).

Кстати, может быть какая-то странная конфигурация. Представьте себе систему с процессором со встроенным графическим процессором (например, Intel i4770K, Intel i5775C), одной высококачественной графической картой AMD GPGPU и другой высокопроизводительной графической картой NVIDIA GPGPU... Возможно, вы захотите запустить OpenCL. на всех трех...

Вы можете рассмотреть некоторую архитектуру плагина (например, с использованием dlopen & dlsym из POSIX). Вы могли бы рассмотреть некоторые рамки C++ (Qt, POCO), предоставляющий интерфейсы для подключаемых модулей независимым от ОС способом.

Но есть не серебряная пуля ; возможно, хорошим подходом может быть определение и общедоступное документирование архитектуры плагинов (например, соглашения об именах и вызовах плагинов), а затем публикация как бесплатное программное обеспечение, несколько реализаций (выше OpenCL, Cuda, OpenACC, OpenMP, MPI, ....) подобных плагинов, вписывающихся в эту архитектуру. Помните о изменении имен, поэтому объявите extern "C" публичные функции ваших плагинов. Вы можете смешать это с некоторым подходом метапрограммирования, когда ваше приложение генерирует C++ (и/или OpenCL и т. ..) код во время выполнения, затем компилируется и загружается как плагин (на компьютере пользователя).

person Basile Starynkevitch    schedule 19.07.2015
comment
Конечно, но устанавливает ли OpenCL целевое оборудование во время компиляции или во время выполнения? Из того, что я прочитал, я думаю, что это может быть сделано во время выполнения с определенным для системы набором библиотек OpenCL, которые пользователь должен будет установить. - person Moschops; 19.07.2015
comment
Аппаратно-независимый. Работает, пока драйвер поддерживает OpenCL - person Behrooz; 19.07.2015
comment
Это не ответ. OpenCL не будет работать, если на машине не установлена ​​реализация OpenCL, что нормально для довольно стандартной конфигурации. - person stgatilov; 19.07.2015
comment
@Moschops OpenCL ничего не устанавливает, вы получаете список устройств и отправляете команды на то, что вам нравится. - person RamblingMad; 19.07.2015
comment
@stgatilov Конечно, идеальной была бы довольно стандартная конфигурация, но из-за отсутствия лучшего ответа я пока возьму OpenCL, но вам нужно будет распространять некоторые библиотеки OpenCL, которые пользователям необходимо будет установить на свою конкретную машину. если это лучшее, что мы можем сделать сегодня. - person Moschops; 19.07.2015
comment
@stgatilov ничем не отличается от зависимости от сторонней библиотеки. - person RamblingMad; 19.07.2015
comment
Насколько я знаю, nvidia, intel и amd поставляют библиотеки opencl со своими графическими драйверами. в Linux вы можете установить их отдельно. - person Behrooz; 19.07.2015