Как указывает Dithermaster, вы сначала создаете отдельную очередь команд для каждого устройства, например, у вас может быть несколько графических процессоров. Вы можете поместить их в массив, например, здесь является указателем на массив, который вы можете настроить:
cl_command_queue* commandQueues;
Однако в моем опыте он не всегда был «слэм-данк» в получении различных команду очереди, выполняемые одновременно, как можно проверить с помощью информации о времени события (проверка на перекрытие), которую вы можете получить через свое профилирование или используя сторонние инструменты профилирования. Вы должны сделать этот шаг в любом случае, чтобы проверить, что работает или не работает в вашей настройке.
Альтернативный подход, который может работать достаточно хорошо, чтобы использовать OpenMP для выполнения очереди команд одновременно, например, вы делаете что-то вроде:
#pragma omp parallel for default(shared)
for (int i = 0; i < numDevices; ++i) {
someOpenCLFunction(commandQueues[i], ....);
}
Создайте отдельные контексты для каждого устройства и выполните их в отдельных потоках (например, с помощью pthreads). –