【问题标题】:Memory copy is taking more time on GPU compared to CPU与 CPU 相比,内存复制在 GPU 上花费的时间更多
【发布时间】:2020-03-06 17:27:04
【问题描述】:

我有一个要复制的图像的源指针和目标指针。当我在 CPU 上运行复制代码时,需要 2 毫秒。 现在,我在 open cl 上运行代码:

clCreateBuffer(context,CL_MEM_USE_HOST_PTR|CL_MEM_READ_WRITE,size,src_ptr,errcode_ret)
clCreateBuffer(context,CL_MEM_USE_HOST_PTR|CL_MEM_READ_WRITE,size,dst_ptr,errcode_ret)

并使用全局工作组大小(w,H)编写内核。所以,每个内核都在复制一个像素。大约是 20 毫秒。

有人可以帮我,当我们有指向全局内存的图像指针时,如何在打开的 cl 上有效地进行内存复制。此过程使用的适当工作组大小是多少?

【问题讨论】:

    标签: performance opencl


    【解决方案1】:

    您能帮助澄清您要完成的工作吗?您是否尝试将memcpy 主机缓冲区所需的时间与使用 GPU 内核复制设备缓冲区所需的时间进行比较?

    如果是这样,请尝试分配不带CL_MEM_USE_HOST_PTR 标志的缓冲区。从第一个响应here 看来,某些实现将该缓冲区映射到系统内存而不是设备内存,这可能会减慢复制内核的速度。

    【讨论】:

    • 我在使用 CL_MEM_USE_HOST_PTR 时读到了这一点。 GPU 可以直接从全局内存访问图像,而不是从全局内存复制到 GPU 缓存并再次复制到全局内存中的目标指针。这就是我使用它的原因。我也试过不带标志..没有太大变化
    • @mogu 有一个很好的答案,说明为什么 CL_MEM_USE_HOST_PTR 可能会慢一点......不过看起来不是在这里。
    • 你能发布你是如何计时的吗?这在 OpenCL 中可能很重要。还有它的价值(不确定您是否使用 Nvidia GPU),但从 Robert Crovella [devtalk.nvidia.com/default/topic/994177/… 的这篇论坛帖子中,最佳工作组尚不清楚。您是否尝试过每个复制 2、4 或 8 个像素的内核?
    • (我的最后一条评论)[khronos.org/registry/OpenCL/sdk/1.1/docs/man/xhtml/… 如果我在你的情况下需要复制设备缓冲区,我会尝试clEnqueueCopyBuffer
    【解决方案2】:

    当我们有图像时,如何在打开的 cl 上有效地进行内存复制 指向全局内存的指针

    有效的方法是在主机指针上使用memcpy()。 IOW 使用 CPU。

    当我们使用 CL_MEM_USE_HOST_PTR 时,GPU 可以直接从全局内存中访问图像,而不是从全局内存中复制

    这并不完全正确。对于集成 GPU 来说确实如此(如果 host_ptr 内存指针正确对齐)。离散 GPU 仍会通过 PCI Express 总线将主机内存复制到自己的内存中。如果您阅读 clCreateBuffer 的文档,它会说:

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

    离散 GPU 不能直接在主机内存上“工作”。即使他们可以,它也会太慢以至于毫无意义。

    事实上,将 CL_MEM_USE_HOST_PTR 与独立 GPU 一起使用可能会导致性能下降,因为 GPU 必须保持主机副本与自己的副本同步,这将导致大量 PCIe 传输。 CL_MEM_USE_HOST_PTR 仅适用于集成 GPU,以节省不必要的传输和内存副本。

    通常,使用 GPU 的方式是尽量减少内存传输,因此您创建一次缓冲区(使用 clCreateBuffer),然后在其上启动您需要的内核,然后将结果传输回主机(通过 enqueueReadImage)或显示它与 OpenGL 互操作。如果您需要更多有用的建议,您必须澄清您在做什么。

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2022-09-30
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多