【问题标题】:OpenCL kernel queueing delaysOpenCL 内核排队延迟
【发布时间】:2014-03-15 22:24:32
【问题描述】:

我有一大堆数据,100GB。我只有 1GB 的显存。我需要使用 MaxWorkgroupSize 块多次排队我的内核。这将是大约 10000 个内核队列和 100 个内存传输。这会对我的表演时间造成多大的影响?另外,有没有更快的方法来处理这么多数据?我最好在我的 CPU 上运行 8 个线程,因为这样就没有数据传输和内核延迟。我在编写代码之前先询问,因为我想确保我有正确的方法。

【问题讨论】:

  • 继续使用 OpenCL,特别是如果您打算以相同的方式处理数据(应用一种不会改变其内部行为的算法,只改变数据输入)
  • 您需要对数据执行什么样的操作/算法?
  • 原来的 100GB 存储在哪里?

标签: opencl gpu gpgpu


【解决方案1】:

这取决于工作的性质。 GPU 是 SIMD 机器。如果您通常对每个项目执行相同的操作(例如,每个工作项目的分支通常都在同一个地方),那么这对于 GPU 来说是个好兆头。即便如此,8 线程 CPU 也有 OpenCL 实现。此外,在英特尔的嵌入式 GPU(AMD 也是?)等环境中,您应该考虑内存缓冲区上的 CL_MEM_USE_HOST_PTR 标志。您可以使用它来获得零复制开销。

【讨论】:

  • 我有 1 个 GPU (AMD),每一点工作基本上相当于(随机)附近的单元格查找,然后是一些数学运算。没有分支机构。也因为单元格查找基本上是随机的,我知道 GPU 内存合并的螺丝钉。是否可以让 GPU 使用系统 RAM 进行操作......这将解决所有传输问题。
  • 使用独立 GPU 不会获得零拷贝,但我不会担心。如果您的内核不平凡,则传输时间可能由计算决定。我会先尝试一下,看看你在哪里着陆(除非这是一个巨大的时间投资),然后优化。 GPU应该有自己的缓存;这样应该可以防止随机访问。如果不是,那么考虑更难的东西,比如矢量数据类型(例如 int2、int4、...)或共享本地内存。不过,这些东西往往真的取决于系统。
  • 一旦一切正常,您可以通过重叠内存传输和计算来改进它。基本上,您将在为当前操作进行计算时为下一个操作上传数据并从上一个操作下载数据。但同样,在添加之前先让它工作。
【解决方案2】:

与单内核运行相比,同一内核的多个入队不会对每个入队造成任何性能损失。多说一句,由于缓存,它变得有点快。

此外,您可以同时在 CPU 和 GPU 上运行代码,因为两者都是兼容 OpenCL 的设备。

您的设备可以使用从主机的 RAM 分配的内存对象(clCreateBuffer() 函数中的 CL_MEM_ALLOC_HOST_PTR 和 CL_MEM_USE_HOST_PTR 标志)。无论如何,内存传输可能不是瓶颈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2021-09-27
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多