一种通过函数编程模型支持大规模分布式并行计算的方法

文档序号:6471473阅读:224来源:国知局
专利名称:一种通过函数编程模型支持大规模分布式并行计算的方法
技术领域
本发明涉及函数编程模型的实现技术,特别提供了一种自动归纳并发现问题分割的 模型,并分布调度执行的算法。
背景技术
由于功耗、主频等限制,现在处理器速度提升逐步到达瓶颈。为了进一步提升处理 速度,处理器发展不得不从单纯提高计算速度转移到提供更多的并发计算核的多核模式 下。随着多核数量的逐步增多,并发数量的增大,以往只有在大型科研院所中存在的大 规模的并行系统,将会逐步出现在消费平台下。
由于以往的计算机发展基本都基于单处理器模式下,缺乏针对多核、乃至大规模并 行系统的自动化支持。开发人员必须依靠自己的经验,对问题进行分割并实现分布计算 的基础支撑,对开发人员的能力要求比较高。
函数式编程模型具有天然的并发性,十分适合于大规模分布式系统中。然而由于函 数式编程的设计思想与基于过程的语言差别很大,难以在开发人员中普及。
由此可见,针对大规模并行系统的两种开发技术,都对开发人员有较高的要求,随 着多核硬件系统的平民化,对大规模分布式计算的开发软件支撑也提出了越来越急迫的 要求。

发明内容
本发明所要解决的技术问题是提供一种通过函数编程模型支持大规模分布式并行计 算的方法。
本发明所述的一种通过函数编程模型支持大规模分布式并行计算的方法,包括以下 步骤
1) 首先,将过程式的程序代码转换为函数式代码,过程是消除变量的存在,对 于每一个变量的引用,用该变量赋值式右边的函数部分取代;
2) 然后,消除函数的边际效应,过程是利用python代码的code对象的global
字段,得到全局变量的访问信息,将对全局变量的读取转换为传入的参数,对全局变量 的写入转换成返回值;
3) 通过fork和forkout函数,对消除了边际效用的函数进行两次执行过程,步骤是复制frame对象,包括其本地变量和堆栈,随后把被复制的frame交给python虚 拟机模拟执行。并每当遇到函数调用的时候,将代码替换成伪调用代码;
4) 构造VOID类,使得任何对这个类的实例的任何操作都会返会这个类本身,通过 此染色机制获知函数调用的依赖关系;
5) 利用伪调用函数,去执行原本需要执行的函数,传入的参数是一个任何对该类 实例的操作都会返回这个实例本身的VOID类;
6) 执行到forkout函数时,将执行结果通过forkout函数返回,并将被复制的frame 对象抛弃,将全局环境复原到执行之前的状态,并正常执行;
7) forkout返回的是在模拟执行过程中产生的一系列可以并行执行的函数执行序 列,根据这个执行序列以及参数进行一次分布式计算,将结果缓冲起来,并对代码进行 第二次执行,在第二次执行的过程中,遇到函数调用,直接返回已经缓冲的数据。
本发明通过建立基于通用语言的并自动化归纳问题分割的模型,实现函数的分布调 度执行算法,适合应用于大规模分布式系统。通过本发明,自动化的发现串行代码中的 可以并行执行的部分。并由于最小调度单位为函数,因而充分挖掘了并行度,从而可有 效运用在大规模并行系统中。


图1 Python代码自动化并行执行总体框架; 图2 Code对象结构; 图3 fork和forkout函数示例; 图4伪调用函数示意图; 图5 V0ID类的特点; 图6并行执行示例。
具体实施例方式
本发明首先将基于过程的实现代码转换成函数式,由于阻碍函数并行执行的关键问 题在于全局变量。由于全局变量的存在,使得函数具有了状态,无法满足输入和输出一
一对应的条件。因此首先需要消除函数的边际效应。如图l流程所示,首先载入py代 码,并编译成code对象。code对象的结构如图2所示,他们组织成一颗代码树。遍历 这个代码树,将所有访问全局变量的函数,将全局变量作为参数传入。将所有写入全局 变量的函数,将全局变量作为返回结果之一返回。如此经过一次遍历,将生成一颗新的代码树,这个代码树中的所有函数都没有边际效应。
基于无边际效应的代码,通过构造如图3所示的fork和forkout函数,来实现模 拟执行。其过程为复制frame对象,包括其本地变量和堆栈。随后让被复制的frame交 给python虚拟机正常执行,直到执行到forkout函数时,将执行结果通过forkout函 数返回。并将被复制的frame对象抛弃,重新恢复到执行之前的状态,并正常执行。
随后,为了利用无边际效应的等效代码达到并发执行的目的,需要对这个代码进行 一次模拟执行,分析出函数之间的相互依赖关系。再一次执行如图l所示的对代码树的 遍历过程,这次当遇到函数调用的时候,将代码替换成伪调用代码。
如图4所示。利用伪调用函数,去执行原本需要执行的函数,传入的参数是一个特 别构造的VOID类。如图5所示,VOID类的特点是任何对VOID类实例的操作都会返回这 个实例本身。
随后进行一次执行的过程,在这个过程中,当传入的参数不包含VOID实例时,说 明这个函数是没有依赖的,可以独立执行。当传入的函数包含了 VOID实例时,则说明 这个函数将依赖于返回这个VOID实例的上一个函数,在并行计算中必须串行计算这两 者。
模拟执行的过程中,由于函数执行所依赖的数据都变成了 VOID,所以不会存在真实 的计算,仅仅分析函数的依赖关系和执行参数序列,因而执行速度非常快。
当模拟执行到达程序的终点时,则产生了一系列的函数执行序列,如图6所示。由 于这个版本中的函数不存在边际效应,因此确定的输入一定会产生确定的输出。根据这 个执行序列以及参数进行一次分布式计算,将结果缓冲起来,并对代码进行第二次执行。 在第二次执行的过程中,遇到函数调用,直接返回已经缓冲的数据,从而达到并行计算, 提高执行速度的目的。
权利要求
1、一种通过函数编程模型支持大规模分布式并行计算的方法,其特征在于包括以下步骤1)首先,将过程式的程序代码转换为函数式代码,过程是消除变量的存在,对于每一个变量的引用,用该变量赋值式右边的函数部分取代;2)然后,消除函数的边际效应,过程是利用python代码的code对象的global字段,得到全局变量的访问信息,将对全局变量的读取转换为传入的参数,对全局变量的写入转换成返回值;3)通过fork和forkout函数,对消除了边际效用的函数进行两次执行过程,步骤是复制frame对象,包括其本地变量和堆栈,随后把被复制的frame交给python虚拟机模拟执行,并且每当遇到函数调用的时候,将代码替换成伪调用代码;4)构造VOID类,使得任何对这个类的实例的任何操作都会返会这个类本身,通过此染色机制获知函数调用的依赖关系;5)利用伪调用函数,去执行原本需要执行的函数,传入的参数是一个任何对该类实例的操作都会返回这个实例本身的VOID类;6)执行到forkout函数时,将执行结果通过forkout函数返回,并将被复制的frame对象抛弃,将全局环境复原到执行之前的状态,并正常执行;7)forkout函数返回的是在模拟执行过程中产生的一系列可以并行执行的函数执行序列,根据这个执行序列以及参数进行一次分布式计算,将结果缓冲起来,并对代码进行第二次执行,在第二次执行的过程中,遇到函数调用,直接返回已经缓冲的数据。
全文摘要
本发明公开了一种通过函数编程模型支持大规模分布式并行计算的方法,首先将基于过程的实现代码转换成函数式,然后消除函数的边际效应,再构造fork和forkout函数,进行模拟执行过程,当遇到函数调用时,将函数调用转换为将函数和其参数作为参数,传入伪调用函数。利用VOID的感染特性来对函数调用进行染色获取函数的调用关系。当到达程序的终点则产生一系列的函数执行序列,根据执行序列以及参数进行一次分布式计算,将结果缓冲起来,并对代码进行第二次执行,在此过程,遇到函数调用,直接返回已经缓冲的数据。本发明通过建立基于通用语言的并自动化归纳问题分割的模型,实现函数的分布调度执行算法,适合应用于大规模分布式系统。
文档编号G06F9/44GK101446898SQ20081023543
公开日2009年6月3日 申请日期2008年12月2日 优先权日2008年12月2日
发明者琦 吕, 李文中, 陆桑璐, 陈道蓄 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1