【问题标题】:OpenCL: Synchronization using memory operationsOpenCL:使用内存操作进行同步
【发布时间】:2014-10-12 02:01:09
【问题描述】:

如果有人在Enqueuing kernel 之后立即尝试使用clEnquyeReadBuiffer,这会不会很糟糕,因为复制操作将在内核刚入队后立即开始,而不是执行?

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(queue),保证了host只有在完整的数据复制后才能看到数据,但是如何保证数据本身是正确的,(因为数据复制开始了内核入队后立即)。我的理解有什么问题吗?

【问题讨论】:

    标签: synchronization opencl


    【解决方案1】:

    如果您的命令队列是有序的,那么它工作正常。在内核完成执行之前,读取操作不会开始。

    在乱序命令队列中,结果未定义。

    您如何知道您的命令队列是否有序?仅当您在调用 clCreateCommandQueue 时指定标志 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE 时才会出现故障。如果你使用它,你必须手动设置同步点。

    您也不必将 clFinish 放在那里。您可以简单地将 CL_TRUE 指定为 clEnqueueReadBuffer 的第三个参数,使其成为阻塞读取。这意味着实现将等到所有入队的命令在 readbuffer 完成之前进行读取,然后仅在数据有效且读取完成时才返回。

    【讨论】:

      猜你喜欢
      • 2014-07-21
      • 2017-09-09
      • 2019-06-07
      • 1970-01-01
      • 2011-02-22
      • 2012-03-26
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多