OpenCL拷贝曾经分享了很多

OpenCL拷贝曾经分享了很多,opencl,Opencl,我正在使用OpenCL实现一个解决方案,我想做以下事情,例如,你有一个大的数据数组,你想在GPU中复制一次,有许多内核处理它的批处理,并将结果存储在它们特定的输出缓冲区中 实际的问题是,哪种方式更快?将每个内核与其需要的数组部分排队,或者在发送整个数组之前,让每个内核(在相同的上下文中)处理所需的批处理,因为它们将具有相同的地址空间,并且可以同时映射数组。当然,所述数组是只读的,但不是常数,因为每次执行内核时它都会发生变化。。。(因此我可以使用全局内存缓冲区缓存它) 另外,如果第二种方法实际上更

我正在使用OpenCL实现一个解决方案,我想做以下事情,例如,你有一个大的数据数组,你想在GPU中复制一次,有许多内核处理它的批处理,并将结果存储在它们特定的输出缓冲区中

实际的问题是,哪种方式更快?将每个内核与其需要的数组部分排队,或者在发送整个数组之前,让每个内核(在相同的上下文中)处理所需的批处理,因为它们将具有相同的地址空间,并且可以同时映射数组。当然,所述数组是只读的,但不是常数,因为每次执行内核时它都会发生变化。。。(因此我可以使用全局内存缓冲区缓存它)

另外,如果第二种方法实际上更快,您能否为我指出如何实现这一点的方向,因为我还没有找到任何具体的方法(尽管我仍在搜索:)


干杯。

我正常使用第二记忆。共享内存很容易。只需将相同的缓冲区传递给每个内核。我在我的实时光线跟踪器中这样做。我用一个内核进行渲染,用另一个内核进行后期处理(图像处理)

使用C++绑定看起来像这样的< /P>

cl_input_mem = cl::Buffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar4)*npixels, NULL, &err);

kernel_render.setArg(0, cl_input_mem);
kernel_postprocess.setArg(0, cl_input_mem);
如果希望一个内核在数组/内存的不同段上运行,可以将偏移量值传递给内核参数,并将其添加到每个内核的全局内存指针中


如果数组(实际上是每个缓冲区的总和,包括输出)不适合内存,我将使用第一种方法。使用第一种方法的另一个原因是,如果您在多个设备上运行。在我的光线跟踪器中,我在多个设备上渲染时使用第一种方法。例如,我有一个GTX 580渲染屏幕的上半部分,另一个GTX 580渲染屏幕的下半部分(实际上我是动态地这样做的,这样一个设备可以渲染30%,而另一个设备可以渲染70%,但这不重要)。我让每个设备只渲染输出的一部分,然后在CPU上组装输出。在PCI 3.0中,CPU和GPU之间的来回传输(多次)对帧速率的影响可以忽略不计,即使对于1920x1080图像也是如此。

请注意:传输的一个问题是缓冲区被锁定。使用双缓冲可以获得稍好的性能。你是什么意思?你的意思是说有两个渲染缓冲区,当你从其中一个读取时,你不用等待,而是启动下一个内核并写入另一个吗?是的,类似这样的事情,我只是想在你的光线跟踪器中。我会尝试类似的方法,除非在每一帧创建一个新的输出缓冲区。但只是一个想法,我不知道你的架构:)这可能是个好主意。但目前通过PCI总线的往返传输并不重要。它们总共消耗的能量不足10毫秒,仅损失1/100 FPS。