【问题标题】:OpenCL Events and Command QueuesOpenCL 事件和命令队列
【发布时间】:2010-08-23 20:34:37
【问题描述】:

我正在将一个 CUDA 应用程序 (this if you must know) 翻译成 OpenCL。原始应用程序使用 C 风格的 CUDA API,使用单个流只是为了避免在读取结果时自动忙等待。

现在我注意到 OpenCL 命令队列看起来很像 CUDA 流。但是在the device read command 中,同样在写入和内核执行命令中,我也注意到了事件的参数。所以我想知道,按顺序执行设备写入、多个内核(例如,一次调用一个内核,然后调用 100 次另一个内核)和读取设备需要什么?

  1. 如果我只是将它们按顺序排入同一个队列,它们会像在 CUDA 中那样按顺序执行吗?
  2. 如果这不起作用,我可以/应该以菊花链方式连接事件,使每个呼叫的等待列表成为上一个呼叫的事件吗?
  3. 或者我应该将所有以前的事件添加到每个呼叫的等待列表中,例如是否有 N^2 次搜索依赖项或其他什么?
  4. 或者我是否只需要为每个调用单独调用 event.wait(),就像在 AMD's tutorial 中所说的那样?

谢谢!

【问题讨论】:

    标签: queue parallel-processing cuda opencl


    【解决方案1】:

    这取决于您如何创建命令队列。在clCreateCommandQueue中有一个properties参数可以包含CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE,可以在命令队列中实现非顺序执行。

    如果设置了该属性,命令可能会乱序或并行执行,同步它们的唯一方法是使用事件。

    如果没有设置该属性,命令会在队列中按顺序执行。

    【讨论】:

    • 我没想到的地方。谢谢!
    • 我将不得不将我的声明修改为“大部分接受”。许多按顺序排队的内核按顺序计算似乎是真的。但是,除非我同时使用事件 等待,否则缓冲区读取和写入似乎执行乱序,即使读取/写入被指定为同步也是如此。另请参阅 BOINC (boinc.berkeley.edu) 中的 atiopencl 示例以获取工作示例。
    • 这不是 CL 的工作方式,请参阅 OpenCL 规范第 5.1 节关于创建命令队列的内容。如果您看到不同的行为,那就是实现错误(错误)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2016-07-05
    • 1970-01-01
    • 2011-03-15
    • 2011-10-25
    • 2020-09-18
    相关资源
    最近更新 更多