如果有人试图在clEnquyeReadBuiffer
内核之后立即使用Enqueuing
,那么这不会是坏事,因为复制操作会在内核刚入队后立即启动,而不会被执行吗?
clEnqueueNDRangeKernel(
queue,
kernel,
1,
NULL,
globalws,
localws,
0,
NULL,
NULL);
//this will start immediately, since above call is async
clEnqueueReadBuffer(
queue,
bufferOut,
CL_FALSE,
0,
10 * sizeof(int),
out,
0,
0,
0);
clFinish(queue);
在上面虽然因为clFinish(队列),但保证主机只在复制完整数据后才能看到数据,但是如何保证数据本身是正确的(自数据复制开始以来)在内核入队后立即)。我的理解有什么不对吗?
答案 0 :(得分:2)
如果你的命令队列是有序的,那么它可以正常工作。在内核完成执行之前,不会开始读取操作。
在Out of Order命令队列中,结果未定义。
您如何知道您的命令队列是按顺序还是乱序?只有在调用clCreateCommandQueue时指定标志CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE时,它才会出现故障。如果使用它,则必须手动设置同步点。
你也不必把clFinish放在那里。您可以简单地将CL_TRUE指定为clEnqueueReadBuffer的第三个参数,以使其成为阻塞读取。这意味着实现将等待所有命令在readbuffer完成之前排队,读取然后仅在数据有效且读取完成时返回。