当前位置: 首页 > 专利查询>浙江大学专利>正文

基于数据流分析的单线程程序并行化的实现方法技术

技术编号:3860355 阅读:340 留言:0更新日期:2012-04-11 18:40
一种基于数据流分析的单线程程序并行化的实现方法,其特征在于: 1)分解算法的实现: 分解算法是把单线程程序分解成多个线程的算法实现,这个算法根据联合依赖关系图当中的指令依赖性,把单个线程分解成两个或多个线程,分解算法是一个递归的过程,它首先作出非嵌套循环或者无循环部分的联合依赖关系图,根据原程序中指令执行的时间以及数据依赖关系,向图中的节点和边的添加属性,之后是图的分解过程,分解算法考虑的是分解后线程的通信代价和线程之间的平衡性,把图中的节点分配到不同的组中,组成不同的线程,然后向线程中插入生产者消费者指令,分解后,被分解的部分被当作一个节点插入原来代码当中,分解算法继续分解新组成的代码中的非嵌套循环部分,如此递归进行,直到分解完整个需要分解的代码; 2)根据指令依赖关系作出联合依赖关系图:单线程程序指令之间存在两种依赖关系,分别是指令之间的数据依赖和控制依赖。当单线程程序别分解成多个线程而并行执行的时候,还存在反向的数据依赖关系。联合依赖关系图是混合这三种依赖关系的图,它的作法是这样的:首先以程序中的指令作为图的节点,然后根据指令之间的依赖关系添加上述的三种依赖关系。在添加完依赖关系以后,以图中不存在依赖的节点为起始节点,消除与这些节点连接的所有边,查找图中新的不存在依赖的节点,取出这些节点加入到起始节点的集合中,在起始节点的集合中添加新节点与旧节点在程序执行中的先后关系,消除新节点在原来依赖图中所有与之相连的边。这样循环进行直到所有节点被添加到起始节点集合为止; 3)函数、过程内联和程序中三种基本元素的分解: 函数和过程会使指令流跳出到被分解部分的代码,这使得分解过程难以继续进行,因此需要把被分解代码部分内的函数和过程被内联进来。基本块、条件分支和循环是程序的三种基本元素,循环被分解算法作为基本分解单元,分支和循环需要控制条件值的传递,基本块可以被直接分解,但会存在数据依赖和反向数据依赖; 4)生产者消费者通信模式及硬件实现: 分解后线程之间的通信通过生产者消费者方式解决,生产者消费者需要在仓库中存储和消费所通信的值,如果以内存为仓库,由于内存的速度慢,对内存的读写影响分解后线程的性能,为了能够更快的完成生产者消费者,减少通信代价,一种硬件的实现可以有效的改进效率; 5)分解后线程间通信的一个特殊例子考虑: 对于生产者消费者的实现,有一个特殊的例子需要被考虑,当消费者消费的值有可能来自分支或循环内部,也有可能来之分支或循环前面时生产者需要在一个特定的点生产或者向仓库中的同一个单元进行生产,不然消费者得到的值可能是错误的或者过时的。

【技术实现步骤摘要】

本专利技术涉及单线程程序并行化的领域,尤其涉及一种基于数据流分析的单 线程程序并行化的实现方法。
技术介绍
随着电子技术的发展,电子芯片的制造工艺由原来的卯nm减小到65nm、 45nm,现在甚至还出现了 32nm的芯片,制造工艺的改进使得固定面积的芯片 可以集成更多的晶体管,进而也使得单个芯片上可以被设计成更复杂的结构和 更多的计算资源;同时较高的芯片集成度使得原来通过提高芯片工作频率的做 法不再有效, 一方面芯片的电路延时使得芯片的频率不能被无限提升,另一方 面,过高的频率带来了更高的能耗,使得髙集成度的芯片散热成为一个巨大的 问题。为了解决上述问题,更好和更合理的利用单个芯片上的资源,芯片多处 理器(Chip Multi Processor, CMP)结构就应运而生了。 CMP集成多个处理器 核在单个芯片上,不仅能够解决能耗和散热的问题,同时能够是芯片具有更好 的并行性。CMP同时带来的一个问题是当面对传统的基于单核结构而设计的单 线程程序,CMP并不能够取得良好的加速比,甚至在有些时候,单线程程序在 CMP上的运行性能还不如结构复杂的单核处理器。现在在CMP卜.提高单线程程序性能的主要方法是探索单线程程序的并行部 分,这样不同的计算资源就能够同时运行实现并行性。比较常用的实现并行的 手段有指令级的并行(Instruction Level Parallelism, ILP),线程级的并行(Thread Level Parallelism, TLP)和投机(Speculation)。指令级的并行是一种粒度较小 的并行手段,它主要实现指令的并行执行,指令级并行在单核处理器中同样被 使用,现在使用的多级指令流水技术,超长指令字等方法都是指令级的并行方 法。线程级的并行或称为软件级的并行主要是把一个单线程程序抽取成多线程 程序,这些多线程程序并行执行从而实现程序的并行执行。线程级并行的实现 方式很多,它是一种粒度较大的并行方式。例如在某些科学计算和多媒体应用 的环境中,由于程序所处理的数据前后依赖性不强,所以可以同时处理原始数 据中的不同部分,这种方式叫做数据级的并行,是一种线程级并行;再譬如在 程序的某个循环中,可以把循环分解成前后的不同部分,前面部分的输出可以作为后面部分的输入,进而形成前后部分的流水让前后两部分并行执行,这种 方式叫做软件级的流水,也是一种线程级并行。投机也是实现程序并行的一种方法,它通过预测来提前执行程序的某一个 部分,如果这个部分在将来被执行,那么它的结果可以直接被使用,如果将来 未被执行,那么只要抛弃先前执行的结果便可。投机是现在研究中的一个重要 方向,有许多不同的方法来实现投机,但是当投机错误的时候,它并不能改变程序的性能,甚至有可能损失一部分程序性能。投机的粒度变化较大,小可以 小的一条汇编指令,大可以大到一个循环部分或者一个函数。无论人们如何尝试着程序并行化的方法,程序中指令前后的依赖性是限制 程序并行的最主要约束,建立新的编程模型可能能够使得程序之间的依赖关系 有所改善,但是由于任务的过程性,程序之间的依赖关系不可能被消除,所以 现在所做的一切关于并行的研究都是建立在依赖性的基础上的。程序内部的依 赖关系有控制依赖和数据依赖两种,但是如果需要并行的执行某一段代码,反 向的依赖关系也是必须考虑的一个问题,反向的相关存在于指令级的并行和线 程级的并行当中,例如处理器的乱序执行,投机和软件流水。通常在程序执行的某一个时刻存在多个数据流,这些数据流相互交织在一 起组成了程序的执行流程。事实上,在具有控制依赖关系的指令之间,如果把 控制条件的值作为后面指令的输入的话,那么控制依赖也可以被当成是一种数 据上的依赖。加之程序中本身存在的反向的依赖关系,那么可以简单的确定程 序中的某些指令必定执行在另外一些指令之后。在编译器的优化技术中,指令 之间的依赖关系和程序的数据流都是程序优化的基础。生产者消费者方式是解决多线程程序在线程之间通信的一个方法,这个方 法一般通过指定内存的某一块区域为存放通信内容的仓库,生产者线程向仓库 中存放需要通信的内容,而消费者线程从仓库中得到所需要通信的内容。根据 生产者消费者的软件模型可以构建出一个生产者消费者的硬件架构。
技术实现思路
一种能够自动把单线程程 序抽取成多线程程序,使之适合在多核结构上并行运行从而提升程序性能,它 是一种编译技术。本专利技术解决技术问题所采用的技术方案是1)分解算法的实现-分解算法是把单线程程序分解成多个线程的算法实现,这个算法根据联合依赖关系图当中的指令依赖性,把单个线程分解成两个或多个线程。分解算法 是一个递归的过程,它首先作出非嵌套循环或者无循环部分的联合依赖关系图, 根据原程序中指令执行的时间以及数据依赖关系,向图中的节点和边的添加属 性,之后是图的分解过程,分解算法考虑的是分解后线程的通信代价和线程之 间的平衡性,把图中的节点分配到不同的组中,组成不同的线程,然后向线程 中插入生产者消费者指令,分解后,被分解的部分被当作一个节点插入原来代 码当中,分解算法继续分解新组成的代码中的非嵌套循环部分,如此递归进行, 直到分解完整个需要分解的代码;2) 根据指令依赖关系作出联合依赖关系图单线程程序指令之间存在两种依赖关系,分别是指令之间的数据依赖和控 制依赖。当单线程程序别分解成多个线程而并行执行的时候,还存在反向的数 据依赖关系。联合依赖关系图是混合这三种依赖关系的图,它的作法是这样的 首先以程序中的指令作为图的节点,然后根据指令之间的依赖关系添加上述的 三种依赖关系。在添加完依赖关系以后,以图中不存在依赖的节点为起始节点, 消除与这些节点连接的所有边,查找图中新的不存在依赖的节点,取出这些节 点加入到起始节点的集合中,在起始节点的集合中添加新节点与旧节点在程序 执行中的先后关系,消除新节点在原来依赖图中所有与之相连的边。这样循环 进行直到所有节点被添加到起始节点集合为止;3) 函数、过程内联和程序中三种基本元素的分解函数和过程会使指令流跳出到被分解部分的代码,这使得分解过程难以继 续进行,因此需要把被分解代码部分内的函数和过程被内联进来。基本块、条 件分支和循环是程序的三种基本元素,循环被分解算法作为基本分解单元,分 支和循环需要控制条件值的传递,基本块可以被直接分解,但会存在数据依赖 和反向数据依赖;4) 生产者消费者通信模式及硬件实现分解后线程之间的通信通过生产者消费者方式解决,生产者消费者需要在 仓库中存储和消费所通信的值,如果以内存为仓库,由于内存的速度慢,对内 存的读写影响分解后线程的性能,为了能够更快的完成生产者消费者,减少通 信代价, 一种硬件的实现可以有效的改进效率;5) 分解后线程间通信的一个特殊例子考虑对于生产者消费者的实现,有一个特殊的例子需要被考虑,当消费者消费 的值有可能来自分支或循环内部,也有可能来之分支或循环前面时生产者需要在一个特定的点生产或者向仓库中的同一个单元进行生产,不然消费者得到的 值可能是错误的或者过时的。 本专利技术具有的有益效果是随着CMP构架的广泛使用,单线程程序在需要探索指令间的并行性外,还 需要能够实现线程级的并行,使得程序能够适应CMP构架,在多个核上并行执 本文档来自技高网
...

【技术保护点】
一种基于数据流分析的单线程程序并行化的实现方法,其特征在于: 1)分解算法的实现: 分解算法是把单线程程序分解成多个线程的算法实现,这个算法根据联合依赖关系图当中的指令依赖性,把单个线程分解成两个或多个线程,分解算法是一个递归的过程,它首先作出非嵌套循环或者无循环部分的联合依赖关系图,根据原程序中指令执行的时间以及数据依赖关系,向图中的节点和边的添加属性,之后是图的分解过程,分解算法考虑的是分解后线程的通信代价和线程之间的平衡性,把图中的节点分配到不同的组中,组成不同的线程,然后向线程中插入生产者消费者指令,分解后,被分解的部分被当作一个节点插入原来代码当中,分解算法继续分解新组成的代码中的非嵌套循环部分,如此递归进行,直到分解完整个需要分解的代码; 2)根据指令依赖关系作出联合依赖关系图:单线程程序指令之间存在两种依赖关系,分别是指令之间的数据依赖和控制依赖。当单线程程序别分解成多个线程而并行执行的时候,还存在反向的数据依赖关系。联合依赖关系图是混合这三种依赖关系的图,它的作法是这样的:首先以程序中的指令作为图的节点,然后根据指令之间的依赖关系添加上述的三种依赖关系。在添加完依赖关系以后,以图中不存在依赖的节点为起始节点,消除与这些节点连接的所有边,查找图中新的不存在依赖的节点,取出这些节点加入到起始节点的集合中,在起始节点的集合中添加新节点与旧节点在程序执行中的先后关系,消除新节点在原来依赖图中所有与之相连的边。这样循环进行直到所有节点被添加到起始节点集合为止; 3)函数、过程内联和程序中三种基本元素的分解: 函数和过程会使指令流跳出到被分解部分的代码,这使得分解过程难以继续进行,因此需要把被分解代码部分内的函数和过程被内联进来。基本块、条件分支和循环是程序的三种基本元素,循环被分解算法作为基本分解单元,分支和循环需要控制条件值的传递,基本块可以被直接分解,但会存在数据依赖和反向数据依赖; 4)生产者消费者通信模式及硬件实现: 分解后线程之间的通信通过生产者消费者方式解决,生产者消费者需要在仓库中存储和消费所通信的值,如果以内存为仓库,由于内存的速度慢,对内存的读写影响分解后线程的性能,为了能够更快的完成生产者消费者,减少通信代价,一种硬件的实现可以有效的改进效率; 5)分解后线程间通信的一个特殊例子考虑: 对于生产者消费者的实现,有一个特殊的例子需要被考虑,当消费者消费的值有可能来自分支或循环内部,也有可能来之分支或循环前面时生产者需要在一个特定的点生产或者向仓库中的同一个单元进行生产,不然消费者得到的值可能是错误的或者过时的。...

【技术特征摘要】
1.一种基于数据流分析的单线程程序并行化的实现方法,其特征在于1)分解算法的实现分解算法是把单线程程序分解成多个线程的算法实现,这个算法根据联合依赖关系图当中的指令依赖性,把单个线程分解成两个或多个线程,分解算法是一个递归的过程,它首先作出非嵌套循环或者无循环部分的联合依赖关系图,根据原程序中指令执行的时间以及数据依赖关系,向图中的节点和边的添加属性,之后是图的分解过程,分解算法考虑的是分解后线程的通信代价和线程之间的平衡性,把图中的节点分配到不同的组中,组成不同的线程,然后向线程中插入生产者消费者指令,分解后,被分解的部分被当作一个节点插入原来代码当中,分解算法继续分解新组成的代码中的非嵌套循环部分,如此递归进行,直到分解完整个需要分解的代码;2)根据指令依赖关系作出联合依赖关系图单线程程序指令之间存在两种依赖关系,分别是指令之间的数据依赖和控制依赖。当单线程程序别分解成多个线程而并行执行的时候,还存在反向的数据依赖关系。联合依赖关系图是混合这三种依赖关系的图,它的作法是这样的首先以程序中的指令作为图的节点,然后根据指令之间的依赖关系添加上述的三种依赖关系。在添加完依赖关系以后,以图中不存在依赖的节点为起始节点,消除与这些节点连接的所有边,查找图中新的不...

【专利技术属性】
技术研发人员:陈天洲蒋冠军缪良华王超陈剑
申请(专利权)人:浙江大学
类型:发明
国别省市:86

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1