Performance 使用OpenCL创建GPU缓冲区的最快方法是什么?
我正在使用OpenCL,我需要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
memset()
全局设备内存中的一些数组。CUDA有一个类似于memset()
的API函数,但OpenCL没有。我读过,在那里我发现了两种可能的选择:
memset()
,然后clEnqueueWriteBuffer()
将其复制到设备上的缓冲区__kernel void memset_uint4(
__global uint4* mem,
__private uint4 val)
{
mem[get_global_id(0)] = val;
}
如果你在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。