Я использую opencl 1.2 C++ wrapper для моего проекта. Я хочу знать, что является правильным методом для вызова моего ядра. В моем случае у меня есть 2 устройства, и данные должны быть отправлены одновременно им.Каков правильный способ использования queue.flush() и queue.finish() после вызова ядра?
Я делю свои данные на два куска, и оба устройства должны иметь возможность выполнять вычисления по ним отдельно. У них нет взаимосвязи, и им не нужно знать, что происходит на другом устройстве.
Когда данные отправляются на оба устройства, я хочу дождаться окончания ядра до того, как моя программа пойдет дальше. Потому что я буду использовать результаты, возвращенные из обоих ядер. Поэтому я не хочу начинать чтение данных до того, как ядра вернутся.
У меня есть 2 метода. Какой из них является программно правильно в моем случае:
Метод 1:
for (int i = 0; i < numberOfDevices; i++) {
// Enqueue the kernel.
kernelGA(cl::EnqueueArgs(queue[iter],
arguments etc...);
queue[i].flush();
}
// Wait for the kernels to return.
for (int i = 0; i < numberOfDevices; i++) {
queue[i].finish();
}
Метод 2:
for (int i = 0; i < numberOfDevices; i++) {
// Enqueue the kernel.
kernelGA(cl::EnqueueArgs(queue[iter],
arguments etc...);
}
for (int i = 0; i < numberOfDevices; i++) {
queue[i].flush();
}
// Wait for the kernels to return.
for (int i = 0; i < numberOfDevices; i++) {
queue[i].finish();
}
Или ни один из них правильно и есть лучший способ ждать, пока мои ядра вернутся?
Способ 1 является правильным. Однако вы можете сделать это лучше. Прочтите данные из ядра в ожидании без блокировки. А потом закончите. Таким образом, оба ядра могут начать копирование данных обратно на хост, как только они закончат. – DarkZeros