如何有效地交换OpenCL内存缓冲区?

vox*_*ree 6 buffer swap opencl

正如标题所示,我正在寻找如何有效地交换两个OpenCL缓冲区.我的内核使用两个gloabl缓冲区,一个作为输入,一个作为输出.不过,我调用我的内核的具有相同NDRange,每段时间设定内核参数,入队内核,并且交换缓冲区,因为以前的输出缓冲区将是下一次迭代的输入缓冲区种子循环.

交换这两个缓冲区的适当方法是什么?我想将缓冲区复制回主机到已经malloc的数组之一并使用它将其复制到下一个输入缓冲区clEnqueueWriteBuffer(),这clEnqueueReadBuffer()是一种低效的方法.否则我只是使用临时cl_mem变量来进行交换.

Sim*_*mon 11

你不需要,只需clSetKernelArg在第二次排队内核(使用clEnqueueNDRangeKernel)之前设置正确的内核args .缓冲区将保留在设备上,不会将任何内容复制回主机.

CL_MEM_READ_WRITE当然,在这种情况下必须创建缓冲区.

  • 是的你将会.在每次迭代时交换并设置它们.这是乒乓球(http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html#feedback2) (2认同)