OpenCL:使用CL_MEM_USE_HOST_PTR传递给内核的变量的设备/主机内存一致性

时间:2012-09-05 14:17:09

标签: opencl

如果使用CL_MEM_USE_HOST_PTR将变量传递给内核,是否意味着设备中变量的任何更改都会显示在主机内存中?

我正处于使用CPU作为设备而不是GPU的情况,因此传递给内核的所有内容都将标记为CL_MEM_USE_HOST_PTR。

如果这是真的,那么我不再需要将所有内容都读回主机,这非常方便。

1 个答案:

答案 0 :(得分:10)

您的理解是正确的,除了一个可能的陷阱:documentation声明

  

允许OpenCL实现缓存缓冲区内容   在设备内存中由host_ptr指向。可以使用此缓存副本   当内核在设备上执行时。

这意味着内核执行的数据更改可能不会立即反映在host_ptr中。实际上,当host_ptr用于缓冲区时,无法保证CL_MEM_USE_HOST_PTR包含有效数据。

要获得有效和最新的数据,您必须强制同步。关于这个时刻,官方文件有点模糊,但buffer mapping/unmapping确定有效:

  

如果创建缓冲区对象时设置了mem_flags   host_ptr,保证clCreateBuffer中指定的clEnqueueMapBuffer   包含被映射的区域中的最新位   clEnqueueMapBuffer命令已完成;和指针值   host_ptr返回的内容将来自cl_mem device_output = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, original_output, NULL); // run the kernel void* pointer = clEnqueueMapBuffer(queue, device_output, CL_TRUE, CL_MAP_READ, size, 0, 0, NULL, NULL, NULL); // work with 'original_output' clEnqueueUnmapMemObject(queue, device_output, pointer, 0, NULL, NULL); clReleaseMemObject(device_output);   在创建缓冲区对象时指定。

以下是改编自Khronos group forum post的示例:

{{1}}