clEnqueueMapBuffer是否总是为同一个CL缓冲区返回相同的地址?

时间:2017-07-19 08:18:49

标签: opencl

如果我使用clEnqueueMapBuffer多次映射相同的CL缓冲区,它能保证返回相同的地址吗?例如,如果我有:

ptr1 = (float *) clEnqueueMapBuffer(commandQueue, buffer, CL_TRUE, CL_MAP_WRITE, 0, bufferSize, 0, NULL, NULL, &errorNumber);
// do something here
ptr2 = (float *) clEnqueueMapBuffer(commandQueue, buffer, CL_TRUE, CL_MAP_WRITE, 0, bufferSize, 0, NULL, NULL, &errorNumber);

ptr1和ptr2总是一样吗?

如果没有,有没有办法测试两个指针(即ptr1和ptr2)是否从同一个CL缓冲区映射?

1 个答案:

答案 0 :(得分:1)

不,它们不一定是相同的,虽然取决于实现,并且你反复映射相同的区域,如果你没有在临时中映射任何其他缓冲区,它们很可能会是。请注意,you can have multiple simultaneous overlapping mappings for reading已经暗示他们不能拥有相同的地址:

  

多个命令队列可以映射内存对象的区域或重叠区域以进行读取(即map_flags = CL_MAP_READ)。

要比较指针,只需测试它们是否相等,但请注意,您只能有多个同步缓冲区映射用于读取 - 用于写入的主机映射或写入访问来自内核的是独占操作,并且未定义来自主机或其他内核的任何并发读取或写入访问。因此,当您使用clEnqueueUnmapMemObject时,代码中的“在此处执行某些操作”必须包含对{1}} ptr1的调用。