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

1.同步类型

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

2.设备端同步

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

2.1组内同步

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

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

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

  item1|       item2|         |       item3|         |         || 5s      |4s       | 3s|         |         |
------------------------------ 所有达到 barrier之后,同时出发|         |         ||         |         |

2.2全局同步

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

3.宿主机端同步

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

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

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

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

3.1单设备同步

3.1.1设置barrier

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

cl_int clEnqueueBarrier(cl_command_queue command_queue)

3.1.2等待事件

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

cl_int clEnqueueWaitForEvents(cl_command_queue command_queue,cl_uint num_events,const cl_event* event_list)

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

3.1.3阻塞访问

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

clEnqueReadBuffer(que, CL_TRUEm....)

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

3.2多设备同步

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

版权声明:本文为博主原创文章,转载需声明为转载内容并添加原文地址。

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

OpenCL-3-同步机制相关推荐

  1. THRUST:一个开源的、面向异构系统的并行编程语言:编程模型主要包括:数据并行性、任务并行性、内存管理、内存访问控制、原子操作、同步机制、错误处理机制、混合编程模型、运行时系统等

    作者:禅与计算机程序设计艺术 1.简介 https://github.com/NVIDIA/thrust 2021年8月,当代科技巨头Facebook宣布其开发了名为THRUST的高性能计算语言,可用 ...

  2. 10、同步机制遵循的原则_我要遵循的10条原则

    10.同步机制遵循的原则 by Haseeb Qureshi 由Haseeb Qureshi 我要遵循的10条原则 (10 Principles I Want to Live By) I just c ...

  3. Java多线程的同步机制(synchronized)

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

  4. Nature Neuroscience|群际冲突的脑间同步机制

    本文来源:"认知神经科学与学习国家重点实验室"官网 编辑:Yezi 审阅:mingzlee7 马燚娜课题组在<Nature Neuroscience> 发表论文揭示群际 ...

  5. Linux 多线程同步机制:互斥量、信号量、条件变量

    互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t 主要涉及函数:pthread ...

  6. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  7. 8天玩转并行开发——第四天 同步机制(上)

    在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factory .ContinueWhenAll()来实现任务 ...

  8. 转载--线程同步机制及比较

    转自:http://blog.csdn.net/eulb/article/details/2177500 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能 ...

  9. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  10. Java线程同步机制synchronized关键字的理解

    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: ...

最新文章

  1. Linus 谈 Git 的设计思想,顺带骂了一堆人(视频)
  2. 计算机组成原理cache命中率
  3. 怎么获取html页面追加,添加df.to_html格式()到现有的HTML页面
  4. 计算机视觉编程——图像搜索
  5. MapReduce_自学过程(一)
  6. vue 点击倒计时 ajax 封装
  7. ubuntu导入第三方库_在Ubuntu中,如何添加Apt存储库
  8. Axure原型制作规范
  9. 事务概念和事务四大特性和隔离级别
  10. gradle-学习笔记(2)-多项目构建
  11. python求解括号匹配的相关问题
  12. 【优化算法】人工鱼群优化算法(AFSA)【含Matlab源码 1078期】
  13. Ubuntu系统下面软件安装更新命令
  14. Mybatis批量保存Clob类型时ORA-01461: can bind a LONG value only for insert into a LONG column报错解决方法
  15. android HttpClient获取json数据
  16. 群晖Nas通过jellyfin搭建本地影音库详细全过程(一):通过群晖系统docker容器安装jellyfin影音库服务器
  17. 求方程式ax2bxc0的根c语言,2019-03-09 C语言学习12-求ax^2+bx+c=0方程的根
  18. 腾讯安全发布远程桌面服务高危漏洞(CVE-2019-1181 / 1182)修复工具
  19. openwrt 软路由负载均衡
  20. Hadoop十年解读与发展预测

热门文章

  1. gulp,grunt,bower,feoman,fis 简单说明
  2. vscode终端无法输入
  3. 本地项目如何连接码云上的项目
  4. 生物信息之ME, HMM, MEMM, CRF
  5. QT qml---- loader使用方法
  6. GVRP的应用—华为拓扑
  7. telnet/ftp/netstat/ping命令詳細介紹
  8. 浅谈C#中的数组(一)
  9. 关于眼保健操中的轮刮眼眶
  10. no module named social_django