Надежная проверка совместимости?

Я создаю приложение, которое использует ускорение OpenCL GPU в Windows, включая функции OpenCL 2.0+.

На моей машине с совместимым аппаратным обеспечением и новейшими драйверами у меня нет проблем с запуском сборок.

Однако я развертывал его на других машинах и сталкивался с зависаниями / сбоями по разным причинам во время инициализации моих ядер / программ OpenCL / и т. д.

На других машинах либо несовместимое аппаратное обеспечение (без карты gfx или карта gfx, несовместимая с OCL2.0 +), устаревшие драйверы GFX, устаревшие драйверы OpenCL и т. д. Простое обновление их не является решением, поскольку они предназначены для моделирования реальных пользовательских сред (т. е. пользователям, которым я в конечном итоге развертываю свое программное обеспечение, не гарантируется наличие совместимых систем).

Я уже отслеживаю коды ошибок, возвращаемые OpenCL (и останавливаю дальнейшую инициализацию после того, как один из них будет возвращен), но я все еще получаю ошибки сегментации на этих машинах во время инициализации различных функций OpenCL, или они просто зависают во время инициализации программы OCL (в некоторых обстоятельства, даже если коды ошибок OpenCL не возвращаются до запуска проблемных функций).

Как я могу выполнить проверку совместимости крепкий на конкретном компьютере перед запуском каких-либо функций инициализации OpenCL?

Я знаю, что могу запросить информацию об устройстве / драйвере OpenCL, но возвращаемые значения - это просто строки, зависящие от поставщика, и кажется, что попытка предугадывать / анализировать все возможные их комбинации (и, кроме того, нет никакой гарантии, что они даже вернутся) полезная информация вообще). Есть ли более надежный способ узнать, может ли OpenCL (и в частности код OpenCL 2.0 GPU-устройства) выполняться на конкретной машине?

Пожалуйста, уточняйте ваши вопросы. Конечно, вам нужно проверить совместимость ваших ядер и оборудования / драйверов. Вряд ли кто-то может дать исчерпывающий и исчерпывающий ответ и я думаю, что нет смысла спрашивать минимальный воспроизводимый пример

Dmytro Dadyka 21.12.2018 01:54

@DmytroDadyka Ты хоть вопрос читал?

Tyson 21.12.2018 02:15

Конечно. Например, вы пишете «возвращаемые значения - это просто строки, зависящие от поставщика, и попытки предугадывать / анализировать все возможные комбинации кажутся глупой задачей». Это абсолютно верно. Но это единственное, что тебе осталось. Код, использующий OpenCL, почти всегда зависит от оборудования

Dmytro Dadyka 21.12.2018 02:23

@DmytroDadyka Я спросил, как проверить совместимость, и вы ответили: «Конечно, вам нужно проверить совместимость». Это бесполезно. Сказать мне, что код, использующий OpenCL, зависит от оборудования (что я буквально сказал в своем вопросе), тоже не поможет.

Tyson 21.12.2018 07:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда люди пытаются распространять приложения OpenCL, возникают две проблемы.

  1. Вы хотите проверить, есть ли у клиента OpenCL.

  2. Вы хотите проверить, правильная ли версия у клиента.

Решение 1 - небольшая головная боль, поскольку приложения OpenCL обычно вылетают из строя, если OpenCL отсутствует. Вы можете использовать CLEW, который в основном glew для opencl. Это позволит вам проверить, есть ли у клиента opencl или нет.

После этого все, что вам осталось, - это функции запроса устройства / драйвера OpenCL, чтобы проверить, установлена ​​ли у клиента правильная версия.

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

Tyson 21.12.2018 09:19

В зависимости от обстоятельств, если вы просто хотите убедиться, что opencl 2.0, вы можете передать -cl-std=CL2.0 в clBuildProgram. Программа не будет скомпилирована, если она не поддерживает 2.0 на стороне устройства. Программы OpenCL созданы таким образом, что у вас просто нет выхода. Так же, как при игре в игры, игрок обязан проверить, поддерживает ли его система игру, а ваш клиент более или менее обязан проверить, есть ли у него OpenCL и правильная версия. Лучшее, что вы можете сделать, - это указать требования, распечатать информацию о функциях запросов и обеспечить выполнение условий при построении программ.

gallickgunner 21.12.2018 10:15

Спасибо, этот флаг сборки - то, что мне нужно.

Tyson 21.12.2018 12:27

Есть несколько возможных проблем несовместимости, с которыми вы можете столкнуться:

  1. Расширения или дополнительные основные функции

Основные языковые функции описаны в спецификации OpenCL и все функции ядра должны работать в любой системе и с любыми компилятор (при условии, что он поддерживает определенную версию OpenCL).

Также есть набор расширений, которые не являются обязательными и вам необходимо убедитесь, что они поддерживаются системой.

Например, если вы используете тип double, вы должны проверить, что Поддерживается расширение cl_khr_fp64. Вы можете получить список поддерживаемых расширения, вызывая clGetDeviceInfo(CL_DEVICE_EXTENSIONS)

  1. Неопределенное поведение или любая другая ошибка

Когда программа хорошо работает на вашем локальном компьютере и вылетает / зависает когда вы его развертываете, это часто указывает на ошибку в сама программа.

Это могло произойти, если вы (непреднамеренно) использовали драйвер OpenCL. детали реализации (например, как рабочие группы упорядочены, как рабочие задания выполнены). Чтобы этого не произошло, следует строго соблюдать правила спецификации OpenCL, хотя спецификация не всегда идеально.

Например, если у вас есть следующий код:

for (int i = 0; i < N; ++i) {
  if (get_global_id() < M) {
    barrier();
  }
}

Этот код может успешно работать и давать правильные результаты на вашем локальном машина, но она некорректна в соответствии со спецификацией OpenCL (вы не можете есть вызов barrier() в расходящемся блоке), и он сбой / зависание / несоответствие на другой машине.

  1. Ошибки компилятора (или драйвера)

Компиляторы очень стараются оптимизировать вашу программу, но иногда они терпят неудачу чтобы сделать это правильно, особенно в некоторых крайних случаях. Наверное лучший способ обнаружить такие ошибки - написать инструмент самопроверки, который запускает модульный тест для ключевых частей вашей программы и проверяет Результат по ссылке.

Например, если у вас есть алгоритм, скажем, вычисление гистограммы, вы можно изолировать его от остальной программы и убедиться, что вы получили Ожидаемые результаты.

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

Помимо этого, вы можете применить обходной путь на основе идентификатора поставщика, тип устройства, версия драйвера и т. д. Всю эту информацию можно запросить от clGetDeviceInfo, но не стоит относиться к нему как к стабильной интерфейс: имена и версии могут измениться в будущем выпусков, поэтому за этими изменениями сложно следить.

Спасибо за исчерпывающий ответ. Я буду помнить о проблемах с ядром, но сбои / зависания, с которыми я столкнулся, происходили до каких-либо вызовов ядра или даже до регистрации различных ядер. Внедрение флага CL2.0 std, похоже, теперь работает, и это хорошо, учитывая последнее, что вы сказали о нестандартной информации об устройстве. Я тоже сейчас отслеживаю вашу точку зрения о двойных проверках совместимости. Ваше здоровье!

Tyson 21.12.2018 17:45

Другие вопросы по теме