Performance 使用OpenCL创建GPU缓冲区的最快方法是什么?

Performance 使用OpenCL创建GPU缓冲区的最快方法是什么?,performance,opencl,memset,Performance,Opencl,Memset,我正在使用OpenCL,我需要memset()全局设备内存中的一些数组。CUDA有一个类似于memset()的API函数,但OpenCL没有。我读过,在那里我发现了两种可能的选择: 在主机上使用带有一些暂存缓冲区的memset(),然后clEnqueueWriteBuffer()将其复制到设备上的缓冲区 使以下内核排队: __kernel void memset_uint4( __global uint4* mem, __private uint4 val) { m

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

  • 在主机上使用带有一些暂存缓冲区的
    memset()
    ,然后
    clEnqueueWriteBuffer()
    将其复制到设备上的缓冲区
  • 使以下内核排队:

    __kernel void memset_uint4(
        __global  uint4* mem,
        __private uint4  val) 
    {
        mem[get_global_id(0)] = val; 
    }
    
  • 哪个更好?或者更确切地说,在什么情况下/对于哪个平台,一个比另一个好

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

    您可以从OpenCL v1.2使用。这正是你需要的。它在如何用模式填充缓冲区方面非常灵活


    如果你在1.1或以下。。。。然后,您必须求助于其他方法。

    快速实现这一点的一个好方法(如果您有额外的可用内存)是拥有一个预大小的初始化数组(例如一个填充了全零的数组),然后在需要清空缓冲区的任何时候执行设备上的拷贝。根据我的经验,这比任何填写OpenCL或CUDA的调用都要快得多。显然,这是一个特例,但在我上次测试时速度要快得多。

    它比ClenqueueefillBuffer快吗?@einpoklum我做了一个测试,enqueueCopyBuffer比enqueueFillBuffer快,只是在10k尝试中:fillBuffer得到:00.000059,copyBuffer得到:00。000048@Jonno_FTW:以秒为单位吗?还有,内存大小是多少?如果您已经启动并运行了测试(我现在不在处理OpenCL的东西),那么可以一次运行1 GB;这将使您每次运行的执行时间更长,以便进行比较。此外,零的情况可能不同于其他值的情况。好吧,我再次尝试在我的AMD R9 380上使用6400万个无符号整数,代码如下:获胜者排队填充缓冲区的速度大约是其他值的两倍。因为OP提到了CUDA,很可能他们使用的是NVidia的卡,该卡目前只支持OpenCL 1.1。另外,您的答案也没有解决两种给定方法中哪一种“更好”的问题。具有开普勒或更高版本体系结构的NVIDIA卡从2015年开始支持OpenCL 1.2。