Использование OpenCL для нескольких устройств (несколько графических процессоров)
Здравствуйте, пользователи Stackru,
У меня есть проблема: у меня есть одно очень большое изображение, над которым я хочу работать. Моя первая идея - разделить большое изображение на пару подизображений, а затем отправить эти подизображения в разные графические процессоры. Я не использую Image-Object, потому что я не работаю со значением RGB, но я использую только значение яркости для манипулирования изображением.
Мой вопрос:
- Могу ли я использовать один
context
со многимиcommandqueues
для каждого устройства? или я должен использовать одинcontext
с однимcommandqueue
для каждого устройства? - Может кто-нибудь дать мне пример или идеи, как я могу динамически изменить inputMem-Data (данные подизображений) для настройки аргументов ядра для отправки на каждое устройство? (Я только знаю, как отправить те же входные данные)
- Например, если у меня больше подизображений, чем номер GPU, как я могу распределить подизображения на GPU?
- Или, может быть, другой разумный подход?
Я буду признателен за любую помощь и идеи. Большое спасибо.
2 ответа
Решение
- Используйте 1 контекст и много очередей. Простой метод - одна очередь на устройство.
- Создайте 1 программу и ядро для каждого устройства (созданного из той же программы). Затем создайте разные буферы (по одному на устройство) и установите каждое ядро с каждым буфером. Теперь у вас есть разные ядра, и вы можете поставить их в очередь параллельно с разными аргументами.
- Чтобы распределить задания, просто используйте систему событий. Проверка наличия пустого графического процессора и постановка очередного задания.
Я могу предоставить более подробный пример с кодом, но в качестве общего наброска, который должен быть способ следовать.
AMD APP SDK содержит несколько примеров обработки нескольких графических процессоров. Вы должны смотреть на эти 2 образца
- SimpleMultiDevice: показывает, как создать несколько командных очередей в одном контексте и некоторые результаты производительности
- BinomailoptionMultiGPU: посмотрите на метод loadBalancing. Он делит буфер на основе вычислительных единиц и максимальной тактовой частоты доступных графических процессоров.