Нет, вы не можете связать два устройства в одну очередь. Вам нужно две очереди для двух устройств. Но ... Если вы читаете документацию clEnqueueMigrateMemObjects, там написано:
Как правило, объекты памяти неявно переносятся на устройство, для которого предназначены команды в очереди, использующие объект памяти
Другими словами, среда выполнения OpenCL отвечает за автоматическую миграцию необходимых буферов на устройство, где будет использоваться thqy.
Вопрос в том, является ли буфер, который вы хотите разделить между устройствами, доступным только для чтения, или он будет записан ядром? Если он предназначен только для чтения, вам вообще не нужно беспокоиться о каких-либо миграциях, просто поставьте ядро в очередь, и среда выполнения скопирует буфер один раз и снова его использует. Если он написан ядрами из обеих очередей (= устройств), то вам нужно правильно упорядочить ядра в очереди с зависимостями событий; в противном случае ядра могут работать в неправильном порядке, и содержимое буфера становится бессмысленным.
Но в любом случае среда выполнения выполняет миграции в фоновом режиме с максимальной эффективностью. clEnqueueMigrateMemObjects полезен только в качестве оптимизации - если вы хотите вручную перекрывать передачу памяти с выполнением ядра. Я бы сконцентрировался на том, чтобы приложение работало надежно, прежде чем пытаться делать какие-либо уловки с clEnqueueMigrateMemObjects.