【问题标题】:Waiting for a single event in OpenCL在 OpenCL 中等待单个事件
【发布时间】:2011-12-28 09:37:45
【问题描述】:

我正在编写一个 OpenCL 程序,其中在多个设备上调用多个内核。在我将所有内核排入队列后,我想等到它们中的任何一个完成后,然后将该设备的工作排入队列。

例如,我有设备 A 和 B,它们每个都有一个内核。如果 A 先完成,我想在完成一些工作后将一个新内核加入其中。如果 B 先完成,我想在做一些工作后为它加入一个新内核。我正在寻找类似clWaitForAnyEvent 的东西,它将在传入的任何事件完成后返回。

查看规范,我看到了一个clWaitForEvents 方法,但似乎它会等待所有事件完成后再继续,我想在一个事件之后继续(并且需要知道哪个事件完成) .

我现在能想到的选项是:

  1. 忙等待使用clGetEventInfo 来测试事件是否完成。

  2. 多线程,每个事件都有一个线程(只需要几个线程,但我使用 CPU 作为设备之一)

  3. 在规范中遗漏了一些东西,实际上有一种方法可以为我做到这一点。

关于如何进行的任何建议或我缺少的东西?

谢谢!

【问题讨论】:

    标签: c opencl


    【解决方案1】:

    你的答案是 3。

    clWaitForEvents 会做你想做的事。假设您有一个设备的命令队列,我们​​将其称为klee_dev。您可以像这样将 klee_dev 上的工作排入队列:

    cl_event event;
    cl_int status = clEnqueueNDRangeKernel(queue_for_klee_dev, ..., &event);
    
    /* enqueue other work on other devices, perhaps even klee_dev */
    
    clWaitForEvents(1, &event);
    

    clWaitForEvents 的调用将阻塞,直到您在klee_dev 的命令队列中排队的工作完成。它不会等待其他工作完成;只是与该事件关联的入队调用指定的工作。

    编辑:

    我误解了最初的问题,下面对此进行了澄清。 OP 询问 CL 规范中是否有一个方法,给定 set 个事件,将阻塞直到 任何一个 事件完成。目前没有这种方法。

    再次编辑:

    您可以使用clSetEventCallback 为每个事件注册一个回调方法。在回调中,您可以使用clGetEventInfo 查询事件以找出与该事件关联的命令队列。

    我认为这可以满足您的需求:任何事件完成的通知,以及找出与该事件相关联的命令队列的能力。

    【讨论】:

    • 是的,但假设我有 4 个队列,并在它们上排列 4 个不同的内核。我想等到其中一个完成(任何一个)并想知道它来自哪个队列。使用这种方法,我将只等待一个工作单元。
    • 啊,我明白了。那么,我认为您需要重新表述您的原始问题。如所写,尚不清楚。考虑将您的上述评论纳入您的问题。
    • 我对这个问题的解释与詹姆斯完全一样。 KLee1,您需要重新表述您的问题;这非常具有误导性,尤其是您说“我想等到其中一个完成...”的部分。
    • 好的,我将编辑我的问题以使其更清楚。谢谢!
    • Klee1,我修改了答案以更好地解决您的实际问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    相关资源
    最近更新 更多