Gpu OpenCL是否保证多个命令队列的缓冲区内存完整性?
简化问题 我有两个主机线程,每个线程都有自己的命令队列连接到同一个GPU设备。这两个队列都是无序的,使用等待事件显式管理执行顺序(简化的示例不需要这样做,但实际应用程序需要这样做)Gpu OpenCL是否保证多个命令队列的缓冲区内存完整性?,gpu,opencl,Gpu,Opencl,简化问题 我有两个主机线程,每个线程都有自己的命令队列连接到同一个GPU设备。这两个队列都是无序的,使用等待事件显式管理执行顺序(简化的示例不需要这样做,但实际应用程序需要这样做) ThreadA是一种轻量级处理管道,在获取新数据时实时运行ThreadB是一个重量级的较慢处理管道,它使用相同的输入数据,但以较慢的速度异步处理数据。我使用双缓冲区来保持管道分离,但允许ThreadB处理ThreadA写入设备的相同输入数据 线程a的循环: 数据可用时从网络中提取图像 使用clEnqueueWrite
ThreadA
是一种轻量级处理管道,在获取新数据时实时运行ThreadB
是一个重量级的较慢处理管道,它使用相同的输入数据,但以较慢的速度异步处理数据。我使用双缓冲区来保持管道分离,但允许ThreadB
处理ThreadA
写入设备的相同输入数据
线程a
的循环:
clEnqueueWriteBuffer(CommandQueueA)将图像写入设备cl\u mem BufferA
clenqueueendrangekernel(CommandQueueA)
调用图像处理KernelA
(内核将结果输出到cl\u mem OutputA
)clenqueueradbuffer(CommandQueueA)
ThreadB
的循环
clEnqueueCopyBuffer(CommandQueueB)
(双缓冲区交换)将BufferA
复制到BufferB
clenqueueendrangekernel(CommandQueueB)
调用较慢的图像处理KernelB
(内核将结果输出到cl\u mem OutputB
)clenqueueradbuffer(CommandQueueB)
ThreadA
的步骤2和ThreadB
的步骤2之间存在潜在的争用条件。我不在乎先执行哪个,我只想确保在写入BufferA
时不会将BufferA
复制到BufferB
ThreadB
步骤2中使用clEnqueueCopyBuffer(CommandQueueA)
使写入和复制操作都在同一个命令队列中,这是否保证即使队列允许无序执行,它们也不能同时运行ThreadA
中的WriteBuffer事件添加到ThreadB
中的CopyBuffer命令的等待列表更好的解决方案吗