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