【问题标题】:What's the purpose of `host_ptr` parameter in `clCreateBuffer``clCreateBuffer`中`host_ptr`参数的作用是什么
【发布时间】:2020-05-04 05:46:24
【问题描述】:

`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 :指向可能已经被分配的缓冲区数据的指针 应用程序。 host_ptr 指向的缓冲区大小必须 大于或等于大小字节。

对我来说,这听起来像是要复制到设备缓冲区中的主机缓冲区。但是在许多示例中,我看到此操作实际上是由clEnqueueWriteBuffer 执行的,实际上没有任何内容作为host_ptr 参数传递给clCreateBuffer

你能澄清一下吗?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    host_ptr 参数有几种不同的用途,具体取决于传递给 flags 参数的值。使用它的两个标志是CL_MEM_USE_HOST_PTRCL_MEM_COPY_HOST_PTR。如果 flags 不包含其中任何一个且 host_ptr 不为 NULL,则该函数将给出 CL_INVALID_HOST_PTR 错误(请参阅 clCreateBuffer 页面底部的错误)。


    CL_MEM_COPY_HOST_PTR

    这基本上就像你描述的那样,它将 host_ptr 复制到设备内存中。这通过有效地组合clCreateBufferclEnqueueWriteBuffer 提供了便利。请注意,您不需要clEnqueueWriteBuffer 要求的命令队列,数据将在您使用之前复制到上下文中的所有设备,多么方便!

    顾名思义,这是一个副本。如果您在设备上写入此内存,host_ptr 中的内存将永远不会看到这些写入(除非您执行clEnqueueReadBuffer)。同样,如果您在创建缓冲区后写入 host_ptr,设备上的内存将不会看到这些写入(除非您执行clEnqueueWriteBuffer)。

    CL_MEM_USE_HOST_PTR

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

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


    使用哪个?

    这取决于您在做什么以及您正在使用什么硬件。 如果您不太担心内存复制性能,并且想要一种简单安全的方法,请使用CL_MEM_COPY_HOST_PTR

    如果设备通过 PCIe(或其他接口)

    对于大型数组,我通常使用CL_MEM_COPY_HOST_PTR 并根据需要将读/写排入队列。如果我只是写入一个 int 或小型结构,我会使用 CL_MEM_USE_HOST_PTR,只是要注意内存一致性。

    如果您真的对内存性能感兴趣,您可能需要研究固定内存 (Reference for AMD GPUs) 等技术。

    如果设备共享主机内存(集成 GPU 或仅 CPU 设备)

    如果您确信主机和设备在另一个正在写入时不会读取,那么您可以使用CL_MEM_USE_HOST_PTR 处理任何大小的内存对象。为了获得最佳性能,您可能必须确保 host_ptr 对齐并且是特定大小的倍数(对于 Intel 设备,对齐在 4 KB 边界和 64 字节的倍数上)。 Here 是有关英特尔硬件零拷贝的更多信息。

    【讨论】:

    • 使用createBufferclEnqueueWriteBuffer 是否比createBufferCL_MEM_CPY_HOST_PTR 有好处,反之亦然? “在使用之前,数据将被复制到上下文中的所有设备”是什么意思?我不会对createBufferclEnqueueWriteBuffer 做同样的事情吗?
    • 执行 createBuffer 然后 clEnqueueWriteBuffer 的唯一优点我可以看到您是否使用非阻塞写入,这允许主机代码在复制发生时继续。不过,这不会提高复制带宽。使用 CL_MEM_CPY_HOST_PTR,OpenCL 必须在 createBuffer 处执行阻塞复制。是的,“在使用它们之前,数据将被复制到上下文中的所有设备”与 createBuffer 和 clEnqueueWriteBuffer 相同。
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 2020-02-18
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多