【问题标题】:Can I invoke OpenCL kernels one after another, on the same device buffers?我可以在同一个设备缓冲区上一个接一个地调用 OpenCL 内核吗?
【发布时间】:2017-04-04 13:13:39
【问题描述】:

假设我使用clEnqueueWriteBuffer 将数据复制到设备,并假设数据是RGB 值(unsigned chars)的缓冲区。我想首先通过仅在输入缓冲区上操作(例如通过覆盖R 组件)将图像转换为灰度,然后我想将生成的图像调整为输出缓冲区。然后我会使用clEnqueueReadBuffer 将输出复制回主机内存。

由于我无法编写包含所有逻辑的单个内核(由于 OpenCL 处理固有的无序性质),我正在考虑使用以下序列:clEnqueueWriteBuffer - 两个 clEnqueueNDRangeKernels - clEnqueueReadBuffer

这种方法正确吗?在规范中的哪里可以找到有关此的更多详细信息?

【问题讨论】:

    标签: c++ opencl gpgpu simd


    【解决方案1】:

    如果所有命令都在同一个命令队列中,并且命令队列是有序类型,那么它可以工作。

    有序队列按顺序执行所有命令。每个命令都会看到它之前的最新命令的结果。

    这里: https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/clCreateCommandQueue.html

    它说

    例如,如果应用程序调用 clEnqueueNDRangeKernel 来 执行内核 A 后跟一个 clEnqueueNDRangeKernel 来执行 内核 B,应用程序可以假设内核 A 先完成,然后 然后执行内核 B。如果内核 A 输出的内存对象 是内核 B 的输入,那么内核 B 将在 内核 A 执行产生的内存对象。如果


    注意:如果您不使用原始灰度并且它是缩小而不是放大,则在调整大小后应用灰度可能会更有效。如果只需要调整大小的图像灰度,您也可以在单个内核中执行这两项操作。当 re-size 工作项为结果像素选择一些像素时,您可以在结果像素上应用灰度。

    如果您要同时使用灰度原始图像和灰度调整大小的图像,您可以有两个输出(不改变原始图像)并有两个并行的命令队列以更快地完成整个工作(如果内核启动开销与内核相当执行开销),但这将需要两个队列的同步点,并且对于非常小的图像可能会变得更慢(一个队列需要查看来自另一个队列的缓冲区副本,并且两者都必须稍后完成才能获得两个结果)。来自两个队列的两个内核可以使用相同的缓冲区进行只读,没有任何问题。

    只注意在将命令排入队列之前为内核设置正确的参数(不能保证它们不会立即启动)

    您可以根据需要执行多个内核,但设置参数不是队列操作,因此需要在开始时进行处理。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      相关资源
      最近更新 更多