Opencl 什么';'clCreateBuffer'中'host_ptr'参数的用途是什么`

Opencl 什么';'clCreateBuffer'中'host_ptr'参数的用途是什么`,opencl,Opencl,`clCreateBuffer'中的参数host_ptr的含义是什么 cl_mem clCreateBuffer ( cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret) 从文件上看不太清楚: host_ptr:指向缓冲区数据的指针,缓冲区数据可能已由 应用程序。主机\u ptr指向的缓冲区的大小必须为 大于或等于大小字节 对我来说,它可

`clCreateBuffer'中的参数
host_ptr
的含义是什么

cl_mem clCreateBuffer ( cl_context context,
    cl_mem_flags flags,
    size_t size,
    void *host_ptr,
    cl_int *errcode_ret)
从文件上看不太清楚:

host_ptr:指向缓冲区数据的指针,缓冲区数据可能已由 应用程序。主机\u ptr指向的缓冲区的大小必须为 大于或等于大小字节

对我来说,它可能听起来像一个主机缓冲区,将被复制到设备缓冲区中。然而,在许多示例中,我看到此操作实际上是由
clEnqueueWriteBuffer
执行的,实际上没有任何内容作为
host\u ptr
参数传递给
clCreateBuffer


您能澄清一下吗?

根据传递到flags参数的值,host_ptr参数有两种不同的用途。使用它的两个标志是
CL\u MEM\u use\u HOST\u PTR
CL\u MEM\u COPY\u HOST\u PTR
。如果标志不包含这两个选项中的任何一个,并且主机ptr不为NULL,则函数将给出
CL\u无效的主机ptr
错误(请参阅页面底部的错误)


CL_MEM_COPY_HOST_PTR 这基本上与您描述的一样,它将主机\u ptr复制到设备内存中。这通过有效地结合
clCreateBuffer
clEnqueueWriteBuffer
提供了便利。请注意,您不需要
clEnqueueWriteBuffer
所要求的命令队列,数据将在使用之前复制到上下文中的所有设备,多么方便

顾名思义,这是一个副本。如果您在设备上写入此内存,则主机_ptr中的内存将永远不会看到这些写入(除非您执行了一次操作)。类似地,如果在创建缓冲区后写入主机_ptr,设备上的内存将看不到这些写入操作(除非您执行一次操作)

CL_MEM_USE_HOST_PTR OpenCL将直接使用主机ptr指向的内存,而不是在设备内存中创建缓冲区。如果您的设备是PCIe连接上的专用GPU,这意味着每次在设备代码中读取或写入此内存时,都必须通过PCIe发送数据(慢速)。OpenCL允许设备在内核执行期间创建数据缓存,这在某种程度上有所帮助。如果您的设备像集成GPU一样与主机共享物理内存,那么就不应该有任何这样的开销

请注意,尽管您必须小心确保内存一致性。如果主机在内核处理与其相关联的内存时修改了host_ptr(反之亦然),则会得到未定义的行为


用哪一个? 这取决于你在做什么以及你在用什么硬件。 如果您不太担心内存复制性能,并且想要一种简单安全的方法,请使用
CL\u MEM\u COPY\u HOST\u PTR

如果设备通过PCIe(或其他接口) 对于大型阵列,通常我使用
CL\u MEM\u COPY\u HOST\u PTR
并根据需要将读/写排队。如果我只是写一个int或小结构,我会使用
CL\u MEM\u use\u HOST\u PTR
,只是要注意内存的一致性

如果您真的对内存性能感兴趣,您可能需要研究一些技术,例如固定内存()

如果设备共享主机内存(集成GPU或仅CPU设备)
如果您确信主机和设备在另一个设备写入时不会读取,则可以对任何大小的内存对象使用
CL\u MEM\u USE\u host\u PTR
。为了获得最佳性能,您可能必须确保主机_ptr已对齐,并且是特定大小的倍数(对于英特尔设备,对齐范围为4KB,倍数为64字节)。有关英特尔硬件上零拷贝的更多信息。

使用
CL\u MEM\u CPY\u HOST\u PTR
或相反,使用
CL\u MEM\u CPY\u HOST\u PTR
createBuffer
?“数据在使用之前将被复制到上下文中的所有设备”是什么意思?对于
createBuffer
clEnqueueWriteBuffer
,我不也是这么做的吗?执行createBuffer的唯一优势是,clEnqueueWriteBuffer我可以看到是否使用非阻塞写入,这允许主机代码在复制发生时继续。但这不会提高复制带宽。使用CL_MEM_CPY_HOST_PTR,OpenCL必须在createBuffer执行阻塞复制。是的,“数据在使用之前将复制到上下文中的所有设备”与createBuffer和clEnqueueWriteBuffer相同。