OpenCL:clSetKernelArg与clSetKernelArg + clEnqueueWriteBuffer

时间:2018-04-26 11:14:30

标签: opencl gpgpu

关于OpenCL中缓冲区传输的问题: 我想将缓冲区(cl_mem)从主机传递到内核(即传递给设备)。 有两个主机功能:

  • clEnqueueWriteBuffer
  • clSetKernelArg

我使用clSetKernelArg将我的缓冲区传递给其中一个内核参数。但这是否意味着缓冲区会自动转移到设备上? 此外,还有函数clEnqueueWriteBuffer,它将缓冲区写入设备。

我的问题:对于我的用例(将缓冲区传递给内核),只使用(a。)clSetKernelArg或(b。)clSetKernelArg和clEnqueueWriteBuffer是否有区别?

1 个答案:

答案 0 :(得分:2)

您必须在将内核排入队列以执行之前调用这两个函数。

  

<强> clSetKernelArg

     

用于设置内核的特定参数的参数值。

这个只设置参数,例如一些指针,用于被调用的内核。 没有隐式数据传输

请考虑以下示例:

  • 相同的内存对象用作不同内核的参数
    • =&GT;只需要一次写入设备;但是要为不同的内核设置多个参数
  • 可以使用相同的内核多次使用更改的输入内存对象
    • =&GT;每次通话一次写;但内核参数只设置一次
  • 可以在同一内核的两次调用之间使用clSetKernelArg()切换读取和写入缓冲区(双缓冲)
    • =&GT;也许没有转移,或者只有每n次迭代;但每次调用前都设置了两个参数

一般来说:主机和计算设备之间的数据传输非常昂贵,因此应该避免,最好通过明确触发它们来实现。