Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gpu OpenCL是否保证多个命令队列的缓冲区内存完整性?_Gpu_Opencl - Fatal编程技术网

Gpu OpenCL是否保证多个命令队列的缓冲区内存完整性?

Gpu OpenCL是否保证多个命令队列的缓冲区内存完整性?,gpu,opencl,Gpu,Opencl,简化问题 我有两个主机线程,每个线程都有自己的命令队列连接到同一个GPU设备。这两个队列都是无序的,使用等待事件显式管理执行顺序(简化的示例不需要这样做,但实际应用程序需要这样做) ThreadA是一种轻量级处理管道,在获取新数据时实时运行ThreadB是一个重量级的较慢处理管道,它使用相同的输入数据,但以较慢的速度异步处理数据。我使用双缓冲区来保持管道分离,但允许ThreadB处理ThreadA写入设备的相同输入数据 线程a的循环: 数据可用时从网络中提取图像 使用clEnqueueWrite

简化问题 我有两个主机线程,每个线程都有自己的命令队列连接到同一个GPU设备。这两个队列都是无序的,使用等待事件显式管理执行顺序(简化的示例不需要这样做,但实际应用程序需要这样做)

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

  • OpenCL是否提供任何不发生这种情况的隐式保证
  • 如果不是,如果我在
    ThreadB
    步骤2中使用
    clEnqueueCopyBuffer(CommandQueueA)
    使写入和复制操作都在同一个命令队列中,这是否保证即使队列允许无序执行,它们也不能同时运行
  • 如果没有,还有比将
    ThreadA
    中的WriteBuffer事件添加到
    ThreadB
    中的CopyBuffer命令的等待列表更好的解决方案吗
  • 看起来所有这些都应该起作用,但我在OpenCL规范中找不到它说这很好的地方。如果可能,请在回答中引用OpenCL规范

    OpenCL是否提供任何不发生这种情况的隐式保证

    不,除非使用单个顺序命令队列,否则不存在隐式同步

    如果不是,如果我改为使用ThreadB步骤2 clEnqueueCopyBuffer(CommandQueueA),以便 复制操作在同一个命令队列中,是吗 确保它们不能同时运行,即使 队列是否允许无序执行

    否,无论队列类型如何(有序与无序), OpenCL运行时不跟踪的内存依赖项 命令。用户负责在等待列表中指定事件, 如果命令之间存在任何依赖关系

    以下引文可作为证明:

    s3.2.1执行模型:上下文和命令队列

    无序执行:命令按顺序发出,但不按顺序执行 在执行以下命令之前不要等待完成。任何 顺序约束由程序员通过 显式同步命令

    这不是对你问题的直接回答,但我认为如果 如果提供了任何担保,则应在本文中提及 节

    如果没有,是否有比添加 将ThreadA中的Buffer事件写入 ThreadB中的CopyBuffer命令

    如果您可以使用单个顺序队列,则可能是 比跨队列事件更高效,至少对某些人来说是这样 实现

    OpenCL是否提供任何不发生这种情况的隐式保证

    不,除非使用单个顺序命令队列,否则不存在隐式同步

    如果不是,如果我改为使用ThreadB步骤2 clEnqueueCopyBuffer(CommandQueueA),以便 复制操作在同一个命令队列中,是吗 确保它们不能同时运行,即使 队列是否允许无序执行

    否,无论队列类型如何(有序与无序), OpenCL运行时不跟踪的内存依赖项 命令。用户负责在等待列表中指定事件, 如果命令之间存在任何依赖关系

    以下引文可作为证明:

    s3.2.1执行模型:上下文和命令队列

    无序执行:命令按顺序发出,但不按顺序执行 在执行以下命令之前不要等待完成。任何 顺序约束由程序员通过 显式同步命令

    这不是对你问题的直接回答,但我认为如果 如果提供了任何担保,则应在本文中提及 节

    如果没有,是否有比添加 将ThreadA中的Buffer事件写入 ThreadB中的CopyBuffer命令

    如果您可以使用单个顺序队列,则可能是 比跨队列事件更高效,至少对某些人来说是这样 实现