我通常使用第二个内存。共享内存很容易。只需将相同的缓冲区传递给每个内核。我在我的实时光线追踪器中执行此操作。我用一个内核渲染,用另一个内核进行后期处理(图像处理)。
使用 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,CPU 和 GPU 之间的来回传输(多次)对帧速率的影响可以忽略不计,即使对于 1920x1080 图像也是如此。