是否可以在同一设备缓冲区上一个接一个地调用 OpenCL 内核?
Can I invoke OpenCL kernels one after another, on the same device buffers?
假设我使用clEnqueueWriteBuffer
将数据复制到设备,并假设数据是RGB
值(unsigned char
s)的缓冲区。我想首先通过仅在输入缓冲区上操作(例如通过覆盖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 生成的内存对象。如果
注意:如果您不使用原始灰度,则在重新调整大小后应用灰度可能会更有效,并且它是缩小而不是放大。如果只需要灰度调整大小的图像,您也可以在单个内核中执行这两项操作。当调整工作项的大小为生成的像素选取一些像素时,可以对生成的像素应用灰度。
如果要同时使用灰度原始图像和灰度调整大小的图像,则可以有两个输出(不更改原始图像)并并行使用两个命令队列以更快地完成整个作业(如果内核启动开销与内核执行开销相当),但这需要两个队列的同步点,并且对于非常小的图像可能会变慢(一个队列需要查看来自另一个队列的缓冲区副本,并且两者都需要必须稍后完成才能获得两个结果)。两个队列中的两个内核可以使用相同的缓冲区进行只读,没有任何问题。
在将命令排队到队列之前,只注意为内核设置正确的参数(不能保证它们不会立即启动)
您可以根据需要执行任意数量的内核,但设置参数不是队列操作,因此需要在开始时处理。
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 构造函数正在调用一个使用当前类类型的函数
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 在另一个线程中调用luaL_error会引发qWarning
- 如何在qt中从另一个类调用函数
- 检查哪个对象调用了另一个对象的对象方法
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 我有一个调用ID3D11DeviceContext::CopySubresourceRegion的循环.我怎么能强制等待
- 当另一个调用 lambda 使用默认捕获时,lambda 的闭包可能会被破坏吗?
- 在C++中嵌入Python:在Python脚本中导入模块在一个函数调用过程中有效,但在另一个调用过程中无效
- 如何在一个调用中释放多个互斥对象
- 我希望计时器只在上一个调用返回或完成执行时调用代码
- 定义一个调用其他函数的内联函数是否有意义
- 我如何测试一个调用是在谷歌测试延迟后使用嘲讽框架进行的
- 我想创建一个调用函数的源文件,而不必创建对象
- 是否有可能制作一个调用jdbc的Java JNI
- 如果您有一个调用其他内部函数的类接口函数
- 打开文件来自一个调用请求在黑莓10级联
- 创建一个调用另一个可执行文件的可执行文件
- 什么是崩溃我的应用程序的异常,给定一个调用堆栈与UnhandledExceptionFilter