OpenCL Copy-Once分享很多

时间:2013-05-04 22:54:04

标签: opencl

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

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

另外,如果第二种方式实际上更快,你可以指出我如何实现这个方向,因为我还没有找到任何具体的东西(虽然我还在搜索:)。)

干杯。

1 个答案:

答案 0 :(得分:2)

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

使用C ++绑定看起来像这样

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,即使对于1920x1080图像,CPU和GPU之间来回传输(多次)对帧速率的影响也可以忽略不计。