1、第8章数据流机和归约机,8.1 数据流计算机8.2 归约机,8.1数据流计算机,8.1.1数据驱动的概念VonNeumann型计算机的基本特点是在程序计数器集中控制下,顺次地执行指令,因此,它是以控制流(ControlFlow)方式工作的。虽然可以在系统结构、程序语言、编译技术等方面进行改进,发展流水线机、阵列机或多处理机,但本质仍是指令在程序计数器控制下顺序执行,这就很难最大限度地发掘出计算的并行性。,以计算一元二次方程ax2+bx+c=0的根作为例子。假定b2-4ac0,可以写出如下的FORTRAN程序:,READ*,A,B,C X1=2*A D=SQRT(B*B-4*A*C) D=D/X
2、1 X2=-B/X1 X1=X2+D X2=X2-D PRINT*,X1,X2 END,这个程序显然只能在单处理机上顺序串行。可以通过使用一些派生(如FORK)、汇合(如JOIN)类的语句,在执行某个程序段(进程)时,派生出能与之并行执行的其他多个程序段,分配给多台不同的处理机以并行执行。等到并发执行的各个程序段都执行完,再汇合到一起往下执行。此时根据情况又可以进行新的派生。通过这种办法可以提高程序执行的并行度。然而,多处理机中的各台处理机仍然是按控制流方式工作的,因而并不能从根本上解决操作的高度并行,只能实现程序段之间的部分并行。而且,并行性语句的引入会增加操作控制的复杂性和程序执行的辅助开
3、销,这在一定程度上又会抵消程序并行所带来的好处。,指令和数据之间存在着各种相关以及操作控制的复杂化,都大大限制了控制流方式工作中计算并行性的开发。因此,开发并行性的另一种途径是完全摆脱VonNeumann型的程序计数器控制驱动(ControlDriven)的控制流方式,改用数据驱动(DataDriven)的数据流(DataFlow)方式来工作。,数据驱动的数据流方式指的是,只要一条或一组指令所要求的操作数全部准备就绪,就可立即激发相应的指令或指令组执行。执行结果的输出将送往等待这一数据的下一条或下一组指令。如果其中一些指令因此而使所需用到的数据全部准备就绪,就可被激发执行。因此,在这种机器上不
4、需要程序计数器。指令的执行基本上是无序的,完全受数据流的驱动,与指令在程序中出现的先后顺序无关。也就是说,部分有序的操作也不是由程序员指定,而是受数据相关所制约。程序设计者完全摆脱了检查和定义程序中所有可能存在的并行性这一繁重工作。只要数据不相关和资源可以利用,就可以并行,因而最有利于计算并行性的开发。,下面仍以一元二次方程求根的例子来说明。图8-1表示了程序中数据间的相关关系,其中,与、与、与均可并行操作,但相互之间因为存在数据相关而不能执行。如果用加、减、乘、除、平方根等基本操作表示出相应的数据流程序,则其数据流程序图如图8-2所示。,图8-1求一元二次方程根的程序中的数据相关关系,图8-
5、2 求一元二次方程根的数据流程序图,可以看出,控制驱动的控制流方式的特点是:通过访问共享存储单元让数据在指令之间传递;指令执行的顺序性隐含于控制流中,但却可以显示使用专门的控制操作符来实现并行处理;指令执行的顺序受程序计数器控制,换句话说,是受控制令牌所支配。数据驱动的数据流方式则不同,它没有通常的共享变量的概念,即没有共享存储数据的概念;指令执行顺序只受指令中数据相关性的制约;数据是以数据令牌方式直接在指令之间传递的。,所谓数据令牌,实质上是一种表示某一操作数或参数已准备就绪的标志。一旦执行某一操作的所有操作数令牌都到齐,则标志着这一操作是什么操作,以及操作结果所得出的数据令牌应发送到哪些等
6、待此数据令牌的操作的第几个操作数部件等有关信息,都将作为一个消息包(MessagePacket),传送到处理单元或操作部件并予以执行。,上述的数据驱动计算,只是数据流计算模型中的一种。还有另一种叫需求驱动计算模型。数据驱动计算,其操作是按输入数据可用性决定的次序进行。需求驱动计算,其操作则按数据需求所决定的次序进行。前者只要所要求的输入数据全部就绪,即可驱动操作执行,是一种提前求值的策略;而后者则是按需求值,只有当某一函数需要用到某一自变量时,才驱动对该自变量的求值操作,是一种滞后求值的策略。显然后者较之前者可以减少许多不必要的求值,辅助开销少,有助于提高系统的效率。作为本节讨论的数据流机来说
7、,一般是指数据驱动计算,需求驱动更适合面向函数程序设计的计算机。然而,由于它们都属于数据流方式,因此数据流机也同样比较适合于执行用函数式语言书写的程序。,从语义上讲,数据流是基于异步性(Asynchrony)和函数性(Functionality)的一种计算模型。所谓异步性,是指一旦操作数到齐就开始操作,这是数据流计算机开拓并行性的基础。所谓函数性,是指每一数据流操作都是消耗一组输入值,产生一组输出值而不发生副作用(SideEffect),具有变量出现在赋值语句左边仅一次的单赋值特性,从而保证任何两个并发操作可以按任意次序执行,而不会相互干扰。,8.1.2数据流程序图和语言可用图8-3所示的有向
8、图来表示指令级的数据流程序,它可看成是数据流机器的机器语言。它有多个结点 (Node),并用一些弧(Arc) 把它们连接而成。每一个结点用圆圈或三角形或其他特殊符号表示,认为是一种处理部件。结点内的符号或字母表示一种操作,所以也称操作符(Actor)。弧代表数据令牌在结点间的流向。在数据流机中,根据这样的数据流程序图,通过一个分配器或分配程序(Allocator),不断分配适当的处理部件来实现操作符的操作。图8-3表示了计算z=(a+b)*(a-b)的数据流程序图。,图8-3计算z=(a+b)*(a-b)的数据流程序图,为表示数据在程序图中的流动状况,利用图中实心圆点代表令牌沿弧移动。假定a=
9、3,b=5,则用图8-4通过令牌沿弧移动的先后过程反映出此数据流程序图的执行过程。实际上,实心圆点代表该输入数据已准备就绪,旁边的数字代表此数据的值。在图84中,(a)表示初始数据就绪,激发(也称点火或驱动)复制结点,以复制多个操作数;(b)表示复制结点驱动结束,激发数据已准备就绪的+、-结点;(c)表示+、-结点驱动结束,激发数据已准备就绪的*结点;(d)表示*结点驱动结束,输出计算结果。,图8-4数据流程序图的执行过程,数据流程序图中程序的执行过程是一种数据不断进行激发(驱动)的过程。一个操作符的执行从每个输入端只吸收一个令牌,进行计算后,只在有效的输出端上产生一个输出令牌。这种单赋值规则
10、使结点在生成和消灭时,可以有序地分配和回收值,而不会产生竞争。为了满足数据流机程序设计的需要,还需进一步引入许多常用的其他结点。这些结点可分别表示如下:(1)常数产生结点 (Identity):没有输入端,只产生常数,如图8-5(a)所示。激发后输出带常数的令牌。,图8-5常用非控制类操作结点及其激发规则 (a)常数产生结点;(b)复制操作结点; (c)连接操作结点;(d)判定操作结点,(2)算逻运算操作结点(Operator):主要包括常用的+、-、*、/、乘方、开方等算术运算及非、与、或、异或、或非等布尔逻辑运算。激发后输出带相应操作结果的令牌。(3)复制操作结点(Copy):如图8-5(
11、b)所示,可以是数据的多个复制,也可以是控制量的多个复制。数据端以实箭头表示,控制端以空心箭头表示。有时也称连接操作结点。用图8-5(c)分别表示数据连接结点和控制连接结点及激发的结果。 (4)判定操作结点(Decider):如图8-5(d)所示,对输入数据按某种关系进行判断和比较,激发后在输出控制端给出带逻辑值真(T)或假(F)的控制令牌。,(5)控制类操作结点:控制类操作结点的激发条件需要加入布尔控制端,如图8-6所示。可以把控制类操作结点细分为常用的4种。图8-6(a)为T门控结点(Tgate),布尔控制端为真,且输入端有数据令牌时才激发,然后在输出端产生带输入数据的令牌。图86(b)为
12、F门控结点(Fgate)。布尔控制端为假,且输入端有数据令牌时才激发,然后在输出端产生带输入数据的令牌。图8-6(c)为开关门控结点(Switch)。有一个数据输入端和两个数据输出端,并受控制端控制。激发后,根据控制端值的真或假,在相应输出端上产生带输入数据的令牌。图8-6(d)为归并门控结点(Merge)。有两个数据输入端和一个数据输出端,并受控制端控制。激发后,根据控制端值的真或假,在输出端上产生带相应输入数据的令牌。,图8-6常用控制类操作结点及其激发规则 (a)T门控结点;(b)F门控结点;(c)开关门控结点;(d)归并门控结点,此外,根据数据流程序设计的需要,还可以设计一些其他的基本
13、结点和功能更强的复合型结点,这里就不一一列举了。利用上述这些结点,可以画出一些常见程序结构的数据流程序图。例如,图8-7是具有条件分支结构的数据流程序图的例子,以实现当x0时,让x加y,否则,就让x减y的功能。图8-8为具有循环结构的数据流程序图的例子,以实现对x循环累加,直到x的值超过1000为止,所得结果为z的功能。,图8-7具有条件分支结构的数据流程序图例,图8-8具有循环结构的数据流程序图例,数据流程序图的另一种表示方法更接近于机器语言,也更容易理解机器的工作原理,这就是活动模片(ActivityTemplete)表示法。数据流实际上可以被看成是一组活动模片组成的集合体。每一个活动模片
14、相应于数据流程序图中一个或多个操作结点,且由4个域组成。它们是一个操作码域,两个操作数域和一个目的域。图8-9是图8-3计算z=(a+b)*(a-b)数据流程序图采用活动模片表示法表示的例子。图8-10是图8-7数据流程序图等效的活动模片表示方式。,图8-9计算z=(a+b)*(a-b)的活动模片表示法,图8-10图8-7数据流程序图等效的活动模片表示,实际上,活动模片就是结点在数据流机器内部具体实现时的存储器映像。所以,活动模片表示的数据流程序图也可认为就是数据流机的可执行的机器代码程序,可由数据流机硬件直接解释执行。数据流机操作系统中的分派程序 (Allocator),就是根据活动模片数据
15、流程序图来调度各个活动模片,分配给多个处理器并行执行。数据流程序图实际上是数据流机的机器语言,优点是直观易懂,但编程效率很低,难以为一般用户所接受。为此,需要研究适合于数据流机器使用的高级语言。,一般来说,不论采用哪种高级语言编写的程序都可以通过相应的编译程序处理后,变换成数据流图。因此,目前在数据流计算机上就有用命令式语言作高级语言的,问题是要提供将命令式高级语言程序转换成数据流程序图语言的编译程序。美国IOWA州立大学做过这种研究。美国Texas仪器公司成功地将ASCFORTRAN编译程序修改后用到其数据流机上。,但是,传统机器上用的面向过程的命令语言缺乏并行性描述,很难表达出数据流控制机
16、制的并行性。虽然有些语言也扩充了并行描述成分,如FORTRAN的FORK和JOIN,并行PASCAL、Ada语言等,但其转换成数据流图的过程比较复杂、低效,所以主要还应发展新的、适合于数据流控制机制的高级语言。目前主要有单赋值语言(SingleAssignmentLanguage)和函数程序设计语言(FunctionalProgrammingLanguage)。另外,像逻辑程序设计语言PROLOG这样一类的描述式(Descriptive)语言,也可作为数据流机的高级语言。,单赋值语言是指在程序中,每个量均只赋值一次,即同一个量名在不同赋值语句的左部最多只出现一次。因此,实际上并没有传统计算机中
17、的变量的概念,只是一种值名。例如,一个程序允许出现如下语句序列: C=A+B C=C*D F=(C-D)/E,则所使用的语言就不是单赋值语言。若这时只允许程序写成: C=A+B C1=C*D F=(C1-D)/E 其所用的语言就体现出单赋值的规则和要求了。单赋值语言的语义清楚,程序中的并行性易于被编译程序所开发。,著名的单赋值语言有美国的ID(IrvineDataFlow)语言、VAL(ValueOrientedAlgorithmLanguage)语言、法国的LAU语言、英国曼彻斯特大学的SISAL语言等等。ID语言是块结构式、面向表达式、无副作用的单赋值语言,用这种语言写出的程序不能直接执行,需先编译成数据流程序图,然后再在机器上执行。VAL语言是美国麻省理工学院(MIT)的J.B.Dennis等人于1979年提出的,下面以这个语言列举其单赋值语言具备的基本特点。,