OpenCL:通过CL_MEM_USE_Host_PTR传递给内核的变量的设备/主机内存一致性



如果变量通过CL_MEM_USE_HOST_PTR传递到内核,是否意味着设备中变量的任何更改也会显示在主机内存中?

我所处的场景是使用CPU而不是GPU作为设备,所以传递到内核的所有内容都将标记为CL_MEM_USE_HOST_PTR。

如果这是真的,那么我就不再需要把所有的东西都读回主机,这非常方便。

您的理解是正确的,除了一个可能的陷阱:文档指出

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

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

为了获得有效和最新的数据,必须强制同步。官方文档对此有点模糊,但缓冲区映射/取消映射确实有效:

如果创建缓冲区对象时在中设置了CL_MEM_USE_HOST_PTRmem_flags,保证clCreateBuffer中指定的host_ptrclEnqueueMapBuffer命令已完成;和指针值clEnqueueMapBuffer返回的将从host_ptr0导出在创建缓冲区对象时指定。

以下是一个改编自Khronos集团论坛帖子的例子:

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);

最新更新