是否可以在同一设备缓冲区上一个接一个地调用 OpenCL 内核?

Can I invoke OpenCL kernels one after another, on the same device buffers?

本文关键字:一个 调用 内核 OpenCL 上一个 是否 缓冲区      更新时间:2023-10-16

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

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

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

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

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

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

它说

例如,如果应用程序调用 clEnqueueNDRangeKernel 到 执行内核 A,后跟要执行的 clEnqueueNDRangeKernel 内核 B,应用程序可以假定内核 A 首先完成并且 然后执行内核 B。如果内核 A 输出的内存对象 是内核 B 的输入,则内核 B 将看到正确的数据 执行内核 A 生成的内存对象。如果


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

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

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

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