2017-04-04 73 views
3

假设我使用clEnqueueWriteBuffer将数据复制到设备,并且假设数据是RGB值(unsigned char s)的缓冲区。我想先通过操作输入缓冲区(例如通过覆盖R组件)来将图像转换为灰度,然后我想将生成的图像调整为输出缓冲区。然后我会使用clEnqueueReadBuffer将输出复制回主机内存。由于我不能编写一个包含所有逻辑的单个内核(因为OpenCL处理的内在无序性),所以我在考虑使用以下序列:clEnqueueWriteBuffer - 两个clEnqueueNDRangeKernel s - 。我可以在相同的设备缓冲区中一个接一个地调用OpenCL内核吗?

这种方法是否正确?规范中的哪些地方可以找到更多关于此的细节?

回答

1

如果所有在同一个命令队列和命令队列是一个有序的类型,那么它的工作。

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

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

它说

例如,如果一个应用程序调用clEnqueueNDRangeKernel到 执行内核后跟一个clEnqueueNDRangeKernel执行 内核B,应用程序可以假定内核首先完成并且 然后内核B被执行。如果通过存储器内核对象输出的 被输入到内核B,则内核乙将看到 存储器中的对象由内核A的执行所产生如果


注意正确的数据:将灰度如果不使用原始灰度级,重新调整尺寸可能更有效,而且尺寸缩小而不是升级。如果只需要重新调整大小的图像,则可以在单内核中同时执行灰度。当重新调整大小的工作项目为结果像素选取一些像素时,可以对结果像素应用灰度。

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

只注意正确的参数设置为内核进行排队命令队列(有没有保证,他们不会立即开始)

根据您的需要,但设置的参数是不是你可以有很多执行内核之前队列操作在开始时需要被照顾。

相关问题