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

ein*_*ica 3 performance memset opencl

我正在使用OpenCL,我需要memset()一些全局设备内存中的数组.CUDA具有类似memset()API的功能,但OpenCL没有.我读了这篇文章,在那里我发现了两种可能的选择

  1. 使用memset()与一些临时缓冲区在主机上,然后clEnqueueWriteBuffer()该复制到设备上的缓冲区.
  2. 排队(sp?)以下内核:

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

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

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

Dar*_*ros 6

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

这里是doc页面:

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

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

  • 自 2015 年的某个时候起,具有 Kepler 或更高架构的 NVIDIA 卡支持 OpenCL 1.2。[驱动程序发行说明](https://a248.e.akamai.net/f/248/10/10/us.download.nvidia.com/ Windows/350.12/350.12-win8-win7-winvista-desktop-release-notes.pdf) (2认同)

Jim*_*m V 5

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

  • 好的,我再次尝试在我的 AMD R9 380 上使用 6400 万个无符号整数,代码在这里:https://gist.github.com/JonnoFTW/2aa358e7b7e57eecf140ce7beae3fa85 获胜者排队填充缓冲区的速度大约是其两倍。 (2认同)