5

我正在将一个 CUDA 应用程序(如果你必须知道的话)翻译成 OpenCL。原始应用程序使用 C 风格的 CUDA API,使用单个流只是为了避免在读取结果时自动忙等待。

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

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

谢谢!

4

1 回答 1

5

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

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

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

于 2010-08-23T20:41:58.260 回答