OpenCL执行

首先OpenCL同一个Command Queue中的Kernel 是按照顺序执行的。Kernel1、Kernel2、Kernel3依次如commandQueue.执行顺序如图所示。

我们知道在Kernel的时候其实CPU端和GPU端可以进行交互的。然而,内核不是唯一可以在命令队列上排队的对象。内核需要数据才可执行其操作,而数据需要传送给设备以使用,这些数据可以是OpenCL缓冲区/子缓冲区或图像对象。封装数据的内存对象需要传输到设备中,你必须向命令队列发出内存命令才可实现该操作;在许多用例中,通常需要在开始计算之前将设备与数据结合在一起。以创建多个命令队列并使用命令对它们进行排队,存在多个命令队列的原因是你希望解决的问题涉及主机中的一些(如果不是所有的话)异构设备。并且,这些命令队列可能表示彼此不共享数据的独立计算流,也可能表示相关的计算流,其中每个随后的任务取决于前一个任务(通常共享数据)。注意,这些命令队列将在设备上不同步执行,前提是没有共享任何数据。如果共享数据,则程序员需要通过OpenCL规范提供的同步命令确保数据同步。


在OpenCL中 clEnqueueWriteBuffer可以通过控制CL_TRUE挥着CL_FALSE来控制是否阻塞。当然也可以通过event来控制,使得某个kernel在某些事件的list完成之后才执行。



猜你喜欢

转载自blog.csdn.net/B1009/article/details/79096226