【问题标题】:Benchmark of CL_MEM_USE_HOST_PTR and CL_MEM_COPY_HOST_PTR in OpenCLOpenCL 中 CL_MEM_USE_HOST_PTR 和 CL_MEM_COPY_HOST_PTR 的基准测试
【发布时间】:2012-03-05 10:41:54
【问题描述】:

我在主机上有一个向量,我想将它减半并发送给设备。做一个基准测试表明CL_MEM_ALLOC_HOST_PTRCL_MEM_USE_HOST_PTR 快,并且比CL_MEM_COPY_HOST_PTR 快​​得多。此外,设备上的内存分析不会显示设备上创建的缓冲区大小有任何差异。这与Khronos- clCreateBuffer 上提到的标志的文档不同。有谁知道怎么回事?

【问题讨论】:

  • 您好,您是使用 gpu、cpu 还是 apu 设备运行内核?还有,哪个供应商?您的系统是否有多个处理器(NUMA 架构?)
  • COPY_HOST_PTR 执行隐式复制,但 ALLOC_HOST_PTR 需要显式复制。当您为 ALLOC_HOST_PTR 运行基准测试时,您确定要包括将缓冲区从主机复制到设备的额外步骤吗?如果不是,这或许可以解释为什么它的速度如此之快。
  • 我使用 NVIDIA gpu 作为设备。

标签: opencl


【解决方案1】:

Pompei 2 的答案不正确。该规范不保证内存的分配位置,而只保证它是如何分配的。 CL_MEM_ALLOC_HOST_PTR 使 clCreateBuffer 为您分配主机端内存。然后,您可以使用 clEnqueueMapBuffer 将其映射到主机指针。 CL_MEM_USE_HOST_PTR 将导致运行时将您提供给它的数据舀到 OpenCL 缓冲区中。

固定内存是通过使用 CL_MEM_ALLOC_HOST_PTR 实现的:运行时能够尽可能分配内存。

所有这些性能都取决于实现。更仔细地阅读第 3.1.1 节将表明,在其中一个调用中(没有 CL_MEM 标志)NVIDIA 能够预分配设备端缓冲区,而其他调用仅将固定数据映射到主机指针中,准备写入设备.

【讨论】:

    【解决方案2】:

    首先,如果我理解正确的话,clCreateSubBuffer 可能不是你想要的,因为它从现有的 OpenCL 缓冲区对象 创建了一个子缓冲区。您链接的文档还告诉我们:

    CL_MEM_USE_HOST_PTR、CL_MEM_ALLOC_HOST_PTR 和 CL_MEM_COPY_HOST_PTR 值不能在标志中指定,而是从与缓冲区关联的相应内存访问限定符继承。

    您说您在主机上有一个向量,并希望将其中的一半发送到设备。为此,我会在设备上使用一半矢量大小(以字节为单位)的常规缓冲区。

    然后,使用常规缓冲区,您看到的性能是预期的。

    1. CL_MEM_ALLOC_HOST_PTR 只在主机上分配内存,根本不会产生任何传输:就像是在做一个 malloc 并没有填满内存。
    2. CL_MEM_COPY_HOST_PTR 将在设备上分配一个缓冲区,很可能是 GPU 上的 RAM,然后将整个主机缓冲区复制到设备内存中。
    3. 在 GPU 上,CL_MEM_USE_HOST_PTR 最有可能分配所谓的 page-lockedpinned 内存。这种内存对于主机->GPU 内存传输是最快的,这是进行复制的推荐方式。

    要了解如何在 NVidia 设备上正确使用固定内存,请参阅 NVidia's OpenCL best practices guide 的第 3.1.1 章。请注意,如果您使用过多的固定内存,性能可能会低于主机复制的内存。

    固定内存比复制设备内存快的原因this SO question 以及this forum thread 中得到了很好的解释。

    【讨论】:

    • 我不同意你的(1)。 CL_MEM_ALLOC_HOST_PTR -- This flag specifies that the application wants the OpenCL implementation to allocate memory from host accessible memory.
    • 您使用 CL_MEM_ALLOC 不使用固定内存
    【解决方案3】:

    Pompei2,您说 CL_MEM_ALLOC_HOST_PTR 和 CL_MEM_USE_HOST_PTR 在设备上分配内存,而 OpenCL 1.1 规范说使用 CL_MEM_ALLOC_HOST_PTR 或 CL_MEM_USE_HOST_PTR 指定的内存将被分配(在第一种情况下)或将在(在第二种情况下)主机内存上使用?我是 OpenCL 的新手,但想知道哪里是真的?)

    【讨论】:

    • 抱歉,我无法解析您的问题。无论如何,如果规范与我相矛盾,我错了,规范是正确的。
    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多