我正在使用OpenCL,我需要memset()
全局设备内存中的某个数组。 CUDA具有类似memset()
的API函数,但OpenCL没有。我读了this,在那里我发现了两种可能的选择:
memset()
使用一些暂存缓冲区,然后clEnqueueWriteBuffer()
将其复制到设备上的缓冲区。将以下内核排入(sp?):
__ kernel void memset_uint4(__ global uint4 * mem,__ private uint4 val){ MEM [get_global_id(0)] = VAL; }
哪个更好?或者更确切地说,在哪种情况下/哪个平台比另一个更好?
注意:如果零记忆的特殊情况值得特别对待,那也很高兴。
答案 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的任何调用要快得多。显然这是一个特例,但是当我上次测试它时要快得多。