OpenCL-3-同步机制

转载 2018年04月15日 09:53:13

原文地址:http://coderdock.com

由于OpenCL在异构系统上进行计算,需要管理并调度多个设备,就需要在设备之间内部或外部进行数据交互以及同步。

1.同步类型

  根据同步的类型,同步分为两部分:宿主机端同步和设备端同步。

2.设备端同步

  设备端同步主要指同一个内核内不同线程之前的同步,主要用于保证数据的一致性。根据工作组的划分,可以细分为组内同步和全局同步。

2.1组内同步

  OpenCL采用宽松的同步模型和内存一致性模型。通常来说,采用硬件实现能够最好的实现同步,但是作为一个跨平台的API,并不能完全实现这些特性。所以OpenCL的解决方案是让程序员明确的知道当前系统的状态,添加同步点,从而可以依据这些信息获取预期行为。

  在x86(CPU)平台上,我们使用同步机制如果条件还未满足,我们可以使系统进入休眠等待条件满足。但是GPU上的线程与系统层级的线程不是一个概念,GPU的线程所占用的资源是固定的,不能释放的,这也就导致了如果不同的不同work group不能为同一个资源做同步,因为没有释放的概念,所以必然存在死锁的状态。所以只能组内同步。

  组内同步的机制是barrier,即屏障,在组内所有的item没有到达这个barrier之前,所有的item是不想下执行的。

1
2
3
4
5
6
7
8
9
item1
| item2
| | item3
| | |
| 5s |4s | 3s
| | |
------------------------------ 所有达到 barrier之后,同时出发
| | |
| | |

2.2全局同步

  目前OpenCL不支持与组内同步类似的全局同步方式(原因上方已经介绍)。可以通过global fence以及原子操作来达到目的。

3.宿主机端同步

  OpenCL是基于任务并行,主机控制的模型,其中每一项任务都是数据并行的,具体通过使用和设备关联的线程安全的命令队列来实现。当然,内核、数据以及其他操作并不是简单调用来进行的,而是通过异步加入指定的队列中。

  从宿主机角度来看,保证宿主机同步的要点有一下三条:

  • 调用clFinish函数,该函数将阻塞直至命令队列中的所有命令都执行完毕。
  • 等待一个特定事件的完成
  • 执行一个阻塞操作

当然,根据所需要同步的计算设备的个数,可以分为单设备同步多设备同步

3.1单设备同步

3.1.1设置barrier

clFinish可以阻塞程序的执行直到命令队列中的所有命令都执行完成。但是这只是相当于在末尾加上了一个barrier。在中间加入barrier需要调用如下函数:

1
2
3
cl_int clEnqueueBarrier(
cl_command_queue command_queue
)

3.1.2等待事件

  等待事件,即将一个等待事件加入命令队列,只有这个等待事件满足以后,才能执行之后加入的命令,使用的命令如下:

1
2
3
4
5
cl_int clEnqueueWaitForEvents(
cl_command_queue command_queue,
cl_uint num_events,
const cl_event* event_list
)

从变量定义上很好理解,不再赘述。

3.1.3阻塞访问

  我们在进行网络访问或者进行IO读取的时候是如何进行阻塞与非阻塞的区分的呢,没错,往往是传入一个标志。对于OpenCL也是一样的,如:

1
clEnqueReadBuffer(que, CL_TRUEm....)

上面这个示例的第二个参数就是指定这个函数是否是同步操作,如果为TRUE,那么就会阻塞直至拷贝完成,如果为FALSE,在设置完后不等拷贝完成,就会返回。

3.2多设备同步

  在之前我们已经了解到,使用事件只能在同一个上下文中实现同步。那么在不同的设备不同的上下文中如何实现同步呢,只剩下了一种方法,cFinish,等待另一个命令队列执行完成,之后的命令才能继续执行。如一个CPU一个GPU,两者需要互相访问彼此的数据,那么如何实现同步呢,如果CPU要访问CPU的数据,必须等待CPU当前的命令队列执行完成,不再占用内存,GPU才能进行访问。
同步

CPU同步机制漫谈

张银奎 yinkui.zhang@gmail.com更快是计算机世界的一个永恒主题。要做到更快有两个方向:一是提高串行执行的速度,二是并行计算(Parallel Computing)。并行计算又可分为...
  • better0332
  • better0332
  • 2008-12-29 11:48:00
  • 2829

OpenCL-3-同步机制

原文地址:http://coderdock.com由于OpenCL在异构系统上进行计算,需要管理并调度多个设备,就需要在设备之间内部或外部进行数据交互以及同步。1.同步类型  根据同步的类型,同步分为...
  • CharleeChan
  • CharleeChan
  • 2018-04-15 09:53:13
  • 71

浅析Linux内核同步机制

很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下《linux内核标准教程》和《深入linux设备驱动程序内核机制》这两本书的相关章节。趁刚看完,...
  • fzubbsc
  • fzubbsc
  • 2014-07-13 19:43:41
  • 2449

CPU中的缓存技术原理

CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时...
  • menuconfig
  • menuconfig
  • 2007-09-18 16:57:00
  • 1769

处理器体系结构(了解CPU的基本运行原理)——《深入理解计算机系统》

处理器体系结构 ISA 一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构ISA。 虽然每个厂商制造的处理器性能和复杂性不断提高,但是不同型号在ISA级别上都保持着兼容。因此,ISA在编...
  • yang_yulei
  • yang_yulei
  • 2014-03-30 00:02:26
  • 40633

几种同步机制的比较

StampedLockAs you should know by now, I have a keen interest in concurrency. Even before I wrote the...
  • sofuzi
  • sofuzi
  • 2017-11-20 17:40:56
  • 136

Java并发编程:线程同步机制

Java中线程同步可以通过wait、notify、notifyAll等方法实现。这几个方法在最顶级的父类Object中实现,并且被声明为final,所以子类无法重写这几个方法。在实现线程同步时,一般需...
  • sk199048
  • sk199048
  • 2016-01-19 18:31:17
  • 493

Windows同步机制原理及使用方法

同步对于计算机系统来说是一个必须要面对的问题, windows系统对内核或外部应用程序提供了多种同步机制,通过这篇文章来介绍 同步机制的工作机制同步机制的使用方法 同步机制可以按照不同的方式分...
  • directionofear
  • directionofear
  • 2012-10-04 14:33:37
  • 3703

RocketMQ原理

介绍RocketMQ原理的内容,主要内容如下 RocketMQ的特点以及消息发送、消费模型 RocketMQ原理:mmap+write,文件系统,数据存储结构,队列,刷盘策略,消息查询,消息过滤,事务...
  • wuzhengfei1112
  • wuzhengfei1112
  • 2017-09-24 14:26:19
  • 1747

列举几种进程的同步机制及优缺点

iOS数据加密常用方法及使用场景
  • Setoge
  • Setoge
  • 2016-08-12 20:26:38
  • 1669
收藏助手
不良信息举报
您举报文章:OpenCL-3-同步机制
举报原因:
原因补充:

(最多只允许输入30个字)