【问题标题】:What is the fastest way to memset() a GPU buffer with OpenCL?使用 OpenCL 对 GPU 缓冲区进行 memset() 的最快方法是什么?
【发布时间】:2013-08-08 16:27:23
【问题描述】:

我正在使用 OpenCL,我需要 memset() 全局设备内存中的某个数组。 CUDA 有一个类似memset() 的 API 函数,但 OpenCL 没有。我阅读了this,在那里我找到了两种可能的选择:

  1. 在主机上使用 memset() 和一些暂存缓冲区,然后 clEnqueueWriteBuffer() 将其复制到设备上的缓冲区。
  2. 将以下内核入队:

    __kernel void memset_uint4(
        __global  uint4* mem,
        __private uint4  val) 
    {
        mem[get_global_id(0)] = val; 
    }
    

哪个更好?或者更确切地说,在哪种情况下/哪个平台比另一个更好?

注意:如果归零内存的特殊情况值得特殊处理,那也很高兴知道。

【问题讨论】:

    标签: performance opencl memset


    【解决方案1】:

    您可以使用 OpenCL v1.2 中的clEnqueueFillBuffer()。这正是你所需要的。并且在如何用模式填充缓冲区方面非常灵活。

    如果您使用的是 1.1 或更低版本....那么您必须求助于其他方法。

    【讨论】:

    • 由于 OP 提到了 CUDA,很可能他们正在使用 NVidia 的卡,目前仅支持 OpenCL 1.1。此外,您的回答并未解决两种给定方法中哪一种“更好”的问题。
    • 具有 Kepler 或更高架构的 NVIDIA 卡从 2015 年的某个时候开始支持 OpenCL 1.2。Driver release notes
    【解决方案2】:

    快速完成此操作的一个好方法(如果您有额外的可用内存)是拥有一个预先确定大小的初始化数组(例如一个全零填充的数组),然后在需要归零时随时在设备上复制出缓冲区。以我的经验,这比填写 OpenCL 或 CUDA 的任何调用都要快得多。显然这是一种特殊情况,但在我上次测试时要快得多。

    【讨论】:

    • 比 clEnqueueFillBuffer 快吗?
    • @einpoklum 我做了一个测试,enqueueCopyBuffer 比 enqueueFillBuffer 快,只是在 10k 次尝试中:fillBuffer 得到:00.000059,copyBuffer 得到:00.000048
    • @Jonno_FTW:以秒为单位吗?另外,内存大小是多少?如果您的测试正在运行(我现在不处理 OpenCL 的东西),也许一次运行它,比如说 1 GB;这应该会给您每次运行更长的执行时间以进行比较。此外,零的情况可能与其他值的情况不同。
    • 好的,我再次尝试在我的 AMD R9 380 上使用 6400 万个无符号整数,代码在这里:gist.github.com/JonnoFTW/2aa358e7b7e57eecf140ce7beae3fa85 获胜者排队填充缓冲区的速度大约是原来的两倍。
    猜你喜欢
    • 2012-01-06
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多