与CL_MEM_USE_HOST_PTR缓冲区一起使用的clEnqueueMapBuffer是否返回相同的主机指针?

时间:2013-12-03 15:58:06

标签: c opencl

我的理解是,如果我使用标记cl_mem使用clCreateBuffer设置CL_MEM_USE_HOST_PTR对象,则该内存块现在可以控制设备。

如果我希望以某种方式改变主机上的内存,我应该首先使用clEnqueueMapBuffer来映射内存,它会返回一个指针。

在这种情况下保证返回的指针是否与用于创建缓冲区的指针相同(即我最初传递给clCreateBuffer),尽管类型为void *

通过扩展,如果我现在希望将内存控制权返回给设备,我是否可以调用clEnqueueUnmapMemObject并使用用于为 mapped_pointer创建缓冲区的原始指针参数?

编辑:进一步调查表明,如果在调用clEnqueueMapBuffer时使用非零偏移量,指针显然不会相同。因此,上述问题是在我设置零偏移的情况下。

1 个答案:

答案 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的情况也是如此。