6

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

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

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

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

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

4

2 回答 2

8

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

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

于 2013-08-07T16:37:46.900 回答
6

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

于 2013-08-07T17:45:26.713 回答