【问题标题】:How to ensure the order of user callback function in OpenCL?OpenCL中如何保证用户回调函数的顺序?
【发布时间】:2021-06-10 05:03:10
【问题描述】:

我正在研究 OpenCL 实现,其中主机端特定函数必须在每次 clEnqueueReadBuffer 执行完毕时调用。

我正在循环调用内核。它看起来像下面的有序队列。 clEnqueueNDRangeKernel() -> clEnqueueReadBuffer(&Event) -> clEnqueueNDRangeKernel() -> clEnqueueReadBuffer(&Event) .......

我使用 clSetEventCall() 在每个读取命令中注册事件以执行回调函数。我观察到,虽然命令队列是有序队列,但是回调函数的执行顺序并没有按顺序执行。

此外,在 OpenCL 1.2 中,它有如下提及。

注册用户回调函数的调用顺序 是未定义的。不保证回调函数 为事件注册的各种执行状态值将是 按照命令执行状态的确切顺序调用 变化。

谁能给我一个解决方案?我想按顺序执行回调函数。

【问题讨论】:

    标签: callback opencl nvidia


    【解决方案1】:

    一个简单的解决方案是为这两个事件订阅相同的回调函数。在回调代码中,您可以查看每个相关事件的状态,并进行相应的操作。

    请注意,在某些实现中,驱动程序会批量执行多个命令。 直接影响是多个事件将“一次”发出信号,即使相关命令在不同时间完成。

    // event1 & event2 are likely to be signaled at once:
    clEnqueueNDRangeKernel();
    clEnqueueReadBuffer(&event1);
    clEnqueueNDRangeKernel();
    clEnqueueReadBuffer(&event2);
    

    在哪里:

    // event1 is likely to be signaled before event2:
    clEnqueueNDRangeKernel();
    clEnqueueReadBuffer(&event1);
    clflush(queue);
    clEnqueueNDRangeKernel();
    clEnqueueReadBuffer(&event2); 
    clflush(queue);
    

    我还会检查调用回调的确切线程。 每次都是同一个线程吗?还是一个不同的?如果实现为此任务打开了一个新线程,您最好自己打开一个线程并按照您希望的顺序等待事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多