Использование OpenCL для нескольких устройств (несколько графических процессоров)

Здравствуйте, пользователи Stackru,

У меня есть проблема: у меня есть одно очень большое изображение, над которым я хочу работать. Моя первая идея - разделить большое изображение на пару подизображений, а затем отправить эти подизображения в разные графические процессоры. Я не использую Image-Object, потому что я не работаю со значением RGB, но я использую только значение яркости для манипулирования изображением.

Мой вопрос:

  1. Могу ли я использовать один context со многими commandqueues для каждого устройства? или я должен использовать один context с одним commandqueue для каждого устройства?
  2. Может кто-нибудь дать мне пример или идеи, как я могу динамически изменить inputMem-Data (данные подизображений) для настройки аргументов ядра для отправки на каждое устройство? (Я только знаю, как отправить те же входные данные)
  3. Например, если у меня больше подизображений, чем номер GPU, как я могу распределить подизображения на GPU?
  4. Или, может быть, другой разумный подход?

Я буду признателен за любую помощь и идеи. Большое спасибо.

2 ответа

Решение
  1. Используйте 1 контекст и много очередей. Простой метод - одна очередь на устройство.
  2. Создайте 1 программу и ядро ​​для каждого устройства (созданного из той же программы). Затем создайте разные буферы (по одному на устройство) и установите каждое ядро ​​с каждым буфером. Теперь у вас есть разные ядра, и вы можете поставить их в очередь параллельно с разными аргументами.
  3. Чтобы распределить задания, просто используйте систему событий. Проверка наличия пустого графического процессора и постановка очередного задания.

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

AMD APP SDK содержит несколько примеров обработки нескольких графических процессоров. Вы должны смотреть на эти 2 образца

  1. SimpleMultiDevice: показывает, как создать несколько командных очередей в одном контексте и некоторые результаты производительности
  2. BinomailoptionMultiGPU: посмотрите на метод loadBalancing. Он делит буфер на основе вычислительных единиц и максимальной тактовой частоты доступных графических процессоров.
Другие вопросы по тегам