【发布时间】:2017-06-25 02:32:56
【问题描述】:
我正在为我的项目使用 opencl 1.2 c++ 包装器。我想知道调用内核的正确方法是什么。就我而言,我有 2 台设备,数据应该同时发送给它们。
我将我的数据分成两个块,两个设备应该能够分别对它们执行计算。它们没有互连,也不需要知道其他设备中发生了什么。
当数据被发送到两个设备时,我想在我的程序继续之前等待内核完成。因为我将使用从两个内核返回的结果。所以我不想在内核返回之前开始读取数据。
我有两种方法。就我而言,哪一个在编程上是正确的:
方法一:
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();
}
方法二:
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();
}
或者它们都不正确并且有更好的方法来等待我的内核返回?
【问题讨论】:
-
方法一是正确的。但是,您可以做得更好。在非阻塞等待中从内核读回数据。然后完成。这样,两个内核都可以在完成后立即开始将数据复制回主机。