我的理解是,如果我使用clCreateBuffer
和标志CL_MEM_USE_HOST_PTR
设置一个cl_mem
对象,那么该内存块现在由设备控制。
如果我想以某种方式更改主机上的内存,我应该首先使用clEnqueueMapBuffer
映射内存,它会返回一个指针。
在这种情况下,返回的指针是否保证与用于创建缓冲区的指针相同(即,我最初传递给clCreateBuffer
的指针),尽管类型为void *
?
通过扩展,如果我现在希望将内存的控制权返回到设备,我可以调用clEnqueueUnmapMemObject
并使用用于为mapped_pointer
参数创建缓冲区的原始指针吗?
编辑:进一步的调查表明,如果在调用clEnqueueMapBuffer
时使用非零偏移,指针显然不一样。因此,上面的问题是在我do设置零偏移的情况下出现的。
我不能直接用"是"或"否"来回答你的问题,但我可以给出一些指针(并非双关语)。
我在标准中没有发现任何东西可以保证这两个指针实际上应该是相同的。然而,在标准第5.2.4节中,有一条有趣的注释:
如果缓冲区对象是在MEM_flags中设置CL_MEM_USE_HOST_TR的情况下创建的,则以下情况将为真:
- clCreateBuffer中指定的host_ptr保证在clEnqueueMapBuffer命令完成时包含要映射的区域中的最新位
- clEnqueueMapBuffer返回的指针值将从创建缓冲区对象时指定的host_ptr派生
我不知道你为什么问这个问题,但至少对于第一个要点,你知道在映射区域时可以使用"原始"指针。
我发现第二个要点很不清楚,但也许是因为我不是本地人。你可能比我更了解它。但在我看来,它可能会对你的问题表示肯定。。。
最后,我在";使用OpenCL的异构计算";脚注(第200页)说明:
请注意,CL_MEM_ALLOC_HOST_TR保证在调用映射时在缓冲区中,传递的指针变为地图在对映射的调用之间,数据仍然仅在主机指针处有效以及取消映射。
当然,这个注释是关于CL_MEM_ALLOC_HOST_TR的,而不是CL_MEM_USE_HOST_PTR,并且它没有指示相关的标准部分。尽管如此,我们还是很容易假设CL_MEM_USE_HOST_TR也是如此。