【问题标题】:Is it defined to write to the same buffer from different kernels?是否定义为从不同内核写入相同的缓冲区?
【发布时间】:2015-08-05 04:34:41
【问题描述】:

我有OpenCL 1.1,一台设备,乱序执行命令队列, 并希望多个内核将它们的结果输出到一个缓冲区到不同的、不重叠的、任意的区域。 有可能吗?

cl::CommandQueue commandQueue(context, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE);

cl::Buffer buf_as(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, data_size, &as[0]);
cl::Buffer buf_bs(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, data_size, &bs[0]);

cl::Buffer buf_rs(context, CL_MEM_WRITE_ONLY, data_size, NULL);

cl::Kernel kernel(program, "dist");

kernel.setArg(0, buf_as);
kernel.setArg(1, buf_bs);

int const N = 4;
int const d = data_size / N;
std::vector<cl::Event> events(N);

for(int i = 0; i != N; ++i) {
    int const beg = d * i;
    int const len = d;

    kernel_leaf.setArg(2, beg);
    kernel_leaf.setArg(3, len);

    commandQueue.enqueueNDRangeKernel(kernel, NULL, cl::NDRange(block_size_x), cl::NDRange(block_size_x), NULL, &events[i]);
}

commandQueue.enqueueReadBuffer(buf_rs, CL_FALSE, 0, data_size, &rs[0], &events, NULL);

commandQueue.finish();

【问题讨论】:

    标签: opencl


    【解决方案1】:

    我想对此做出正式的委员会回应。我们意识到规范是模棱两可的,并进行了修改以纠正这一点。

    这在 OpenCL 1.x 或实际上是 2.0 规则下得到保证。 cl_mem 对象仅保证在同步点保持一致,即使仅在单个设备上处理,甚至在使用 memory_scope_device 的 OpenCL 2.0 内核使用时也是如此。

    OpenCL 2.0 父内核的多个子内核可以在设备范围内共享父内核的 cl_mem 对象。

    只要写入的内存位置不重叠,粗粒度的 SVM 对象就可以在多个内核之间在设备范围内共享。

    【讨论】:

      【解决方案2】:

      如果全局内存地址如您所描述的那样不重叠,则写入应该可以正常工作。只需确保两个内核都已完成,然后再将结果读回主机即可。

      【讨论】:

      • 不幸的是,根据规范,这并不正确,尽管在实际实现中可能是正确的。
      【解决方案3】:

      我认为它没有定义。虽然您说您在软件级别写入非重叠区域,但不能保证在硬件级别访问不会映射到相同的缓存行 - 在这种情况下,您将有多个修改版本飞来飞去。

      【讨论】:

      • 多个缓存行应该不是问题,硬件通常可以很好地使用脏掩码并处理这个问题。然而,虚拟内存映射可能会成为一个问题。粗粒度 SVM 需要正确运行。即使在 OpenCL 2.0 中,也不要求 cl_mem 对象允许同一设备上的多个写入器访问同一缓冲区。
      • 脏掩码没有你想象的那么普遍,这是由于硬件开销的原因(例如,字节粒度脏掩码至少会增加 12% 的缓存裸片区域)。此外,问题在于 OCL 规范是否保证它是好的,它没有。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2021-09-29
      • 2017-08-08
      • 1970-01-01
      • 2016-09-16
      • 2016-09-30
      相关资源
      最近更新 更多