zoukankan      html  css  js  c++  java
  • 多速率(multirate)同步语言signal及其多线程实现

    一、同步编程语言

      同步编程语言将代码的同步执行作为设计过程中的核心概念,它们是反应式的,即当信号到来,状态开始执行。其中抽象符号instant定义了每个状态的执行边界,instant与电路中的硬件时钟或是处理器时钟都没有关系,它更像是表示状态集完成或决定下批状态集执行的标记器。同步语言的核心是同步假设,这意味着在同步语言设计系统过程中,可以假设计算和通信的时间,即在instant时间内,操作假设就会完成。

        所有的同步都有四种共同的属性:同步、反应式的响应、并发和执行的确定性。同步即所有操作都基于相同软件时钟,而模块之间的通信通过假设收发信息的时间为0来满足此属性。反应式的响应即事件驱动响应,输入信号事件的出现触发了同步状态的条件判断,如条件满足,会导致代码的执行。并发性是指模块或状态的执行应该是相互独立的,可以并行执行。确定性执行是指同步编程语言会确保在下一个instant来之前,计算和通信已经完成。

        目前已经有了多种满足上述属性的同步语言,它们有不同的应用领域、规约、编译方案和代码生成的方法。其中的一些已经有了商业化的工具,并被许多安全关键应用领域所认可,如航空、发电厂等。

        目前主要有三种同步语言:Esterel,Lustre,Signal。此外,还有许多其它的同步语言,如argos, chuck, SOL, LEA等,本文主要讲解signal,如读者对其它同步语言感兴趣,可参阅附录的参考文献。

    二、多速率同步语言signal

        signal是声明性的多速率同步语言,其中的变量称作信号,并且是多速率的,即程序执行过程中,两种信号可以有不同的速率。singal及其编译器polychrony都是由法国的IRISA开发的

      1. 基本概念

      signal由进程内的状态组成,这些状态可以组合在一起。信号x与它的时钟捆绑在一起,后者定义了信号x更新的速率。一个信号可以有不同的数据类型,如boolean,integer等。

        进程内部的状态可以是赋值等式或时钟等式。如果一个状态的输入信号与另一个状态的输出信号之间没有数据依赖,则它们在进程内是并行的。

        赋值状态要么是调用在其它进程内定义的函数,要么是使用signal的四个原子运算符:function, sampler, merge和delay。 

    • function: function运算符f应用在输入信号x1, x2, ..., xn上,表示在输出信号y上产生一个事件,用signal表示如下:

    y:= f(x1, x2, ..., xn)

      同时,输入信号的时钟需求也需要指定,为方便估计一个n个输入的操作,n个输入信号需要同时出现,这样使得y的速率等于每个输入信号的速率。

    • sampler: sampler运算符when用于当一个输入信号发生时,检测另一个输入信号的输出,用signal表示如下:

    y:= x when z

      z是boolean类型的信号,当z发生时,将x的值传递给y。z发生用符号表示为y的时钟是x和的交集。

     

    • merge: merge运算符default是在两个输入x和z之间选择一个传递给y,其中前一个输入会有较高的优先级,用signal表示如下:

    y:= x default z

      每当为真时,将x传递给y,否则,当为真时,将z传递给y。

    • delay: delay运算符表示将上次的输入作为输出,如果是第一次输出,则输出初始值k,用signal表示如下:

    y:=x$ init k

      x$表示上次的输入,输出的初始值k是一个常量。y和x的时钟相等。

      上面signal运算符的时钟等式,总结如下表

      2. signal的多线程编程模型

      多线程编程需要规约语言具有并行性。确定性的输出使得signal的并行规约到线程实现能够保持等价(这在代码生成中是非常重要的,如果转换不正确,则转换没有任何意义)。目前已经有多种将signal转换到多线程代码的策略,这些策略的不同点主要是转换成线程粒度的不同,下面将讲解三种主要的策略:

      2.1 基于进程的多线程模型(粗粒度模型)

      这是粗粒度的多线程代码生成的方法,主要思想是利用signal进程模块拆分出多个线程。signal程序是由许多状态组成的,此方法将最高级的进程实现成主线程,然后拆分、连接出多个辅助线程。基于进程的多线程模型如下图所示。

      左边是signal程序,右边是等价的C代码。主线程针对signal的两个子过程拆分出了两个不同的辅助线程FuncA()和FuncB(),主线程包含连接不同线程和保护读写共享变量的主逻辑。这种策略对于写操作是线程安全的,因为按照signal语义,没有信号会在一个进程内赋值两次。这种策略的额外优势是线程分配到多核的灵活性,核间通信通过进程的输入输出参数定义。

      不足:这种策略的不足在于模型中的并行性并没有完全的被发掘。随着signal代码的增长,线程的数量并没有按相应比例增长,因此并没有从并行化中获益。子过程的串行执行使得signal的并行性并没有被充分利用。

      2.2 微线程模型(细粒度模型)

      现在IRISA开发的signal的编译器polychrony已经实现了一种多线程代码生成方案,这种方案是使用信号量和事件通知(event-notify)来同步线程间的通信,每一个并发状态被转换成一个线程,这些线程以wait开始,以notify结束。signal代码的微线程模型如下图所示。

      controller线程发出时钟并触发相应的读操作线程。wait信号量和notify状态提供了一种线程间的通信机制。polychrony的多线程模型通过输入触发响应,来执行计算。

      不足:但这种策略使得小任务更多在进行通信,而只进行少量的计算。同时,在大规模signal程序中,线程数量也会随着并发状态数量的增长而呈现指数式的增长。

      2.3 基于SDFG的多线程模型(中粒度模型)

      从上面两种策略的不足,我们总结出应该为signal的多线程代码生成提供一种中等粒度的转换方案,下面我们就讲这种方案。

      同步数据流图(synchronous data flow graphs, SDFG)是为signal的多线程代码生成提供的中粒度的方案。此方案目标在于降低signal表达式的复杂度,以找出适量的计算线程。例如x:= a when b default c可以被拆分成x1:=a when b and x:=x1 default c。对于一般的signal程序,SDFG是一个基于数据流的依赖图,每个节点是一个正常的状态,边是节点间发送数据的时钟关系。下图是一个signal代码的SDFG的例子。

      如图,节点的分类归并可以形成并发执行的线程。

    三、总结

      本文主要对同步语言signal在多核上的应用进行了讲解,详细探讨了三种多核实现策略,为后续研究打下基础。同时由于参考资料是英文,对于其中的专业术语已经尽量附带了英文,如仍有疑问,请查阅参考资料或联系作者。

    四、参考资料

      [1]. Kornaros, G., Multi-core embedded systems. Vol. 1. 2010: CRC Press.

  • 相关阅读:
    ubuntu: no module named _sqlite
    mysql慢查询分析工具 pt-query-digest
    vue中的时间修饰符stop,self
    面试题 —— Ajax的基本原理总结
    es6笔记 day6-Symbol & generator
    类(class)和继承
    es6笔记 day4---模块化
    es6笔记 day3---Promise
    es6笔记 day3---对象简介语法以及对象新增
    es6笔记 day3---数组新增东西
  • 原文地址:https://www.cnblogs.com/jpcflyer/p/2361470.html
Copyright © 2011-2022 走看看