它被定义为从不同的内核写入相同的缓冲区吗?

时间:2015-02-13 17:48:00

标签: opencl

我有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();

3 个答案:

答案 0 :(得分:1)

我想对此提出正式的委员会回应。我们意识到规范含糊不清,并进行了修改以纠正这个问题。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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