什么是OpenCL最快的memset()替代品?

时间:2013-08-07 10:26:22

标签: performance opencl memset

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

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

    __ kernel void memset_uint4(__ global uint4 * mem,__ private uint4 val){     MEM [get_global_id(0)] = VAL; }

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

    注意:如果零记忆的特殊情况值得特别对待,那也很高兴。

2 个答案:

答案 0 :(得分:6)

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

这里是doc页面:

  

http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html

如果您在1.1或以下....那么您应该重复其他方法。

答案 1 :(得分:5)

快速执行此操作(如果您有额外的可用内存)的一个好方法是使用预先调整大小的初始化数组(例如一个填充全零的数组),然后在需要零时执行设备上的复制出缓冲区。根据我的经验,这比填写OpenCL或CUDA的任何调用要快得多。显然这是一个特例,但是当我上次测试它时要快得多。