我的编程空间,编程开发者的网络收藏夹
学习永远不晚

OpenCL-3-同步机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

OpenCL-3-同步机制

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

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

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

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以及原子操作来达到目的。

  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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

OpenCL-3-同步机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

OpenCL-3-同步机制

由于OpenCL在异构系统上进行计算,需要管理并调度多个设备,就需要在设备之间内部或外部进行数据交互以及同步。  根据同步的类型,同步分为两部分:宿主机端同步和设备端同步。  设备端同步主要指同一个内核内不同线程之前的同步,主要用于保证数据
2023-01-31

MySQL同步机制

复制步骤:Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,
MySQL同步机制
2015-09-09

SVN-3:主从同步

svnsync同步主:192.168.56.20主svn需要通过apache发布才能同步文件到备svn在备份svn新建sadoc项目,配置与主svn相同权限修改项目文件夹下hooks下面的pre_revprop-change内容只有exit
2023-01-31

AndroidNTP时间同步机制详解

这篇文章主要为大家介绍了AndroidNTP时间同步机制实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

kafka副本同步机制是什么

Kafka副本同步机制是指Kafka集群中的副本之间的数据同步方式。在Kafka中,每个分区都有多个副本,其中一个被选为leader副本,其余副本为follower副本。副本同步机制保证了数据在分区的所有副本之间的一致性。Kafka使用的是
2023-10-12

golang函数与goroutine的同步机制

go 中的同步机制包括:通道:用于在 goroutine 之间安全地传递数据,采用阻塞式发送和接收操作。互斥锁:确保同一时间只有一个 goroutine 可以访问共享资源。等待组:跟踪正在等待完成的 goroutine 数量,主 gorou
golang函数与goroutine的同步机制
2024-04-26

go语言有哪些同步机制

go语言同步机制有:1、互斥锁,是go中最基本的同步原语之一;2、读写互斥锁,可以提高并发性能;3、条件变量,用于在多个goroutine之间进行通信的同步原语;4、通道,用于goroutine之间进行通信的主要机制;5、原子操作,用于实现
2023-07-31

Linux系统中协程的同步机制

在Linux系统中,协程的同步机制通常通过使用信号量、互斥锁、条件变量等工具来实现。这些工具可以帮助协程在并发环境中正确地同步和共享资源,避免竞态条件和数据访问冲突。其中,信号量是一种用于线程之间同步的机制,可以用来控制对共享资源的访问。
Linux系统中协程的同步机制
2024-08-06

Python多线程与同步机制浅析

线程(Thread)是操作系统能够进行运算调度的最小单位;线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源
2022-12-22

如何进行Java 同步机制浅谈

如何进行Java 同步机制浅谈,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录