标记(marker)和栅栏(barrier)命令是在OpenCL 1.2版本中新增的特性。标记是对一组事件或是指定命令队列中当前所有命令的标签,用于记录指定事件或命令的状态。而栅栏(Barrier)的功能与标记差不多,不过将它排入到一个指定的命令队列后,后续排入此队列的命令必须等待这个栅栏命令完成之后才能被执行。这就意味着,在此栅栏所等待的特定事件或命令队列中在此栅栏之前的所有命令完成之前,栅栏之后的命令将不会执行。
将标记和栅栏命令放入命令队列的函数API如下描述:
cl_int clEnqueueMarkerWithWaitList(cl_command_queue
command_queue,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
cl_int clEnqueueBarrierWithWaitList(cl_command_queue
command_queue,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
这里,num_events_in_wait_list参数指明在event_wait_list中包含了多少事件对象。如果event_wait_list为空,并且num_events_in_wait_list为0,那么标记和栅栏将会作用于command_queue所指定的命令队列中在此命令之前的所有命令;否则,标记和栅栏将作用于event_wait_list中所包含的所有事件对象。
标记仅仅作为一个事件组或命令组执行完成的标记而已,如果不显式地使用事件对象来跟踪此命令事件的执行状态,那么它不起任何作用。如果命令队列后有某个命令需要等待它完成才能被执行,此时才能彰显其效果。而栅栏则不同,栅栏是在将它放入命令队列之后就立即起效。后续排入此命令队列的命令必须等待它完成才能被执行。