3

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

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

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

干杯。

4

1 回答 1

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

于 2013-05-05T10:55:59.907 回答