OpenCL 同步及事件机制

本专题将描述OpenCL中的各种同步机制,并且从主机端到设备端,从粗粒度到细粒度,由外到内的层次结构来进行讲解。

对于主机端的OpenCL API而言,所涉及的同步就是命令同步。在一个命令队列中所执行的多个命令根据当前的业务需求可能需要保持一定的前后顺序。例如,我们先使用clEnqueueWriteBuffer接口将指定的一块数据传输到设备端的存储空间中,然后再调用clEnqueueNDRangeKernel接口来执行设备端的内核程序,最后将设备端的结果通过clEnqueueReadBuffer接口传回主机端的存储空间。这三个命令在执行时必须按照上述的前后顺序,否则最后获得的结果就可能会有问题。

而对于设备端的OpenCL内核程序而言,需要的同步情景就更丰富了。例如,多个工作组之间的数据同步;一个工作组中特定几个工作项的数据同步;存储器访问次序的可见性与一致性;多个工作项对同一存储地址的读写同步。

请大家注意,本专题所有示例代码在主机端所用的编译器都是支持GNU C11标准规范的编译器。因此,如果各位读者用的是Linux环境,那么请使用-std=gnu11,如果不支持C11的编译器,使用GNU99也没有问题,即-std=gnu99。而如果各位读者在Windows环境中,使用Visual Studio的话,请至少使用2013版本,因为只有从VS 2013版本起,Visual C编译器才支持C99标准,各位读者可以在项目偏好中进行设置。另外,源文件名的后缀名请使用.c,不要使用.cpp,因为某些编译器在C++中是不支持C99语法特性的。如果各位读者使用的是OS X 10.10(Yosemite),那么当前的Xcode 6的Apple LLVM 6.1编译器默认就是GNU99,无须做额外的设置。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程