一种程序自动并行化的方法

文档序号:6335208阅读:243来源:国知局
专利名称:一种程序自动并行化的方法
技术领域
本发明涉及并行程序设计领域、编译器设计领域,特别涉及一种程序自动并行化 的方法。
背景技术
目前,计算机的核数不断增加,要体现多核的优势,需要充分利用好多核的硬件资 源,所以必须实现多核并行计算。并行编程是一种很好的实现方法,但是并行编程很难,这 使得习惯于串行编程的程序员很难适应并行编程模式。并行编程的难点在于程序员很难确 定在程序的什么地方实现并行,而且多线程并行程序的高度非常麻烦,各线程之间数据依 赖关系的处理,及并行级别的选择,这些都是影响并行编程实现的难点,那么就需要一种方 法能够使得并行编程容易实现。Intel、AMD等公司都提出了基于自身处理器架构的多核并行编程方案,它们的方 案局限于固定的硬件结构,采用不同程序库来实现,但这些并没有减轻程序员的负担。在应 用程序中,还是需要程序员对程序的并行结构进行设计,而且这些程序可移植性差,当移植 到别的机器上时,可能要修改代码才能重新实现并行,这些都是一些低效的方法。

发明内容
为了解决多核硬件环境中并行编程复杂和可移植性差等问题,提高多核硬件资源 的利用效率,减轻多核并行程序员的编程负担,本发明的目的在于提供一种平台独立的串 行程序自动并行化的方法。本发明解决技术问题所采用的技术方案是一种程序自动并行化的方法,该方法包括如下步骤(1)获取源程序,通过分析源程序获取包括循环和分支部的并行部分;(2)将源程序中并行部分分成多个并行模块,每个并行模块通过线程分配给不同 的处理器进行处理;(3)将经过并行扩展的源程序编译成可执行的代码。所述线程分配采用流水线并行方式,将并行部分分解成多个执行阶段,每个执行 阶段分配给一个处理器执行。所述并行部分按照依赖关系分成多个执行阶段。所述线程分配采用猜测性并行方式,当并行部分是循环时,预先设定循环次数,将 每次循环作为一个线程分配给一个处理器进行处理。本发明具有的有益效果是首先,提供简单的程序并行化环境,充分设计简单化、 安全性、可移植性方面的独特优势,具有很高的运行安全性以及开发过程中的高可重用性, 大大降低了多平台开发成本;其次,依据平台而实现并行化编译的技术,使得多核处理器的 性能优势得到发挥,无论是在高性能服务器,还是普通计算机或是在嵌入式平台,都能充分 利用好硬件资源,提高程序性能,加速计算过程;再次,该并行化技术简化了并行程序设计,使得串行程序的作者们不需要过多关注于并行编程,他们只需按照原有的思维进行代码编 写就行。这种方式突出了多核环境中程序并行化,编程简单化,程序可移植性好。最后本发 明引入线程级的并行化和软件流水线式并行化。


图1是本发明一种实施例的流程图;图2是本发明一种实施例的执行流程图。
具体实施例方式以下结合附图对本发明提供的程序自动并行化的方法作进一步详细描述图1是本发明一种实施例的整体流程图,该方法包括如下步骤第一步、获取源程序,通过分析源程序获取包括循环和分支部的并行部分;第二步、将源程序中并行部分分成多个并行模块,每个并行模块通过线程分配给 不同的处理器进行处理;第三步、将经过并行扩展的源程序编译成可执行的代码。其中,获取源程序中的包括循环和分支部的并行部分,可以采用常用的判断方法, 例如源程序中有while,for, if等程序中的关键字,则认定为有并行部分。本发明的程序自动并行化,可以采用流水线并行方式或者猜测性并行方式。其中 流水线并行方式是将并行部分分解成多个执行阶段,每个执行阶段分配给一个处理器执 行。将并行部分分成几个执行阶段,每个处理器完成一个执行阶段的工作。当执行阶段之 间存在依赖关系时,各个执行阶段每次执行的数据需要相互传递。本发明的猜测性并行方式是指,当并行部分是循环时,预先设定循环次数,将每次 循环作为一个线程分配给一个处理器进行处理。本发明的方法可以由并行化编译器模块、并行代码执行硬件模块、程序并行化扩 展模块三个模块实现。以下具体描述一下三个模块的功能以及并行化过程。1)三大模块功能。并行代码执行硬件模块是执行并行程序的平台,程序并行化扩 展模块是修改程序使它具有并行功能,并行编译器模块就是将程序编译成可在硬件上运行 的代码。①并行化编译器模块这是串行程序自动并行化的主要实现功能部分,并行化过程也是在编译过程中完 成,所以编译模块在整个技术框架中作用最大。它独立与任何平台,一般当编译器安装好在 机器上后,便会获取一些硬件信息,依据此信息给出并行化参数。通常一台机器的硬件结构 很少改变,所以并行化方案可以用在以后的并行化编译中,每次并行化都可使用这个方案。 除了并行化功能以外,它和其他编译器功能上差不多,为硬件生成可执行代码。并行编译器不同于一般的编译器的地方是,一般编译器将程序编译成顺序执行的 机器代码,而它能够将程序编译成可并行的机器代码,因为目前CPU的核越来越多,程序并 行运行可以充分利用多核资源,大大加速程序运行。并行化功能就是将程序员编写的顺序 执行程序并行化,寻找出程序中可并行的代码部分,使它们在各核上同时运行。②并行代码执行硬件模块可以采用多核硬件结构,包括高性能服务器,普通个人机,嵌入式系统等,这是执行并行化后的可执行程序的功能部件。要让程序并行执行,首先 硬件得要有并行执行的功能,这是程序并行化的基础。③程序并行化扩展模块这是一种串行程序自动并行化技术,不需要程序员过多关注并行设计,但是程序 并行还是要修改一部分代码,这个修改功能就是由并行化扩展模块完成。这个修改是指根 据编译器给的并行化方案,在预编译阶段做一些处理以达到并行化的效果。将代码中的循环部、各分支部分等分成多个并行模块,每个模块构成一个线程,这 些线程能在各核上并发执行,要处理各模块的协同关系。模块之间相互依赖相互合作,编译器是平台独立性,但是要根据机器硬件结构来 生成一个最优的并行化方案;编译器将经过并行化扩展模块扩展后的程序编译成可在硬件 上执行的二进制代码,所以编译器依赖于扩展模块;同样,并行批扩展模块是需要编译器所 给定的并行化方案进行扩展,它要依赖于编译器。在不同架构的机器上,需要重新编译,因 为机器之间的硬件不同,所需要的最优并行化方案也不一样。2)并行化过程并行化过程是指将程序并行编译,其实就是编译成可执行的机器代码,编译过程 中将程序的一些部分进行并行化处理。图2是本发明一种实施例的执行流程图。①当程序编译时的实现步骤编译指编译器将程序源码转换成能够在硬件是执行的二进制代码;I.获取硬件信息,在编译器安装时,就可提取硬件的相关信息,包括处理器指令结 构、核的数量等保存在配置文件中,参数一般是在编译器安装时就会检测到并配置好,这些 配置参数作为并行化编译过程中所需要的参数。II.在编译器给出并行化方案后,需要对源程序做些修改,就是在源程序中的循环 和分支部分进行修改,每个分支作为一个线程去执行,这样可以同时在多个核上执行多个 分支,比顺序程序中按顺序执行分支要快很多,也就是并行化扩展。串行程序并行化的方法 有两种,其一是线程猜测性并行,这种技术是当程序中有循环时,并行执行各次循环,在最 优情况下,可一次性执行完循环;另一方法是软件分解流水线并行,把一次循环分解成多个 执行阶段,并行执行循环中的各阶段,在同一时刻执行不同循环的不同阶段。线程猜测并行 技术要求各循环之间必须同步,各循环之间存在依赖关系,做好同步是关键,这会限制并行 的最大化;软件分解流水线方式经过扩展后支持预测,重复执行多个相互独立的循环阶段。III.经过并行化扩展后的程序直接编译成可执行的硬件代码,在硬件上可并行执 行,相对于单线程的非并行程序的性能大大提高,提高的倍数同硬件上可并行硬件资源相 关,这就实现了在不同硬件结构上实现自动并行。本发明的一种实施例现有一个程序源码,程序中含有一段循环代码,如下While(condition){A :line = read();B :result = work (line);C:print(result);}
循环主要有三部分,读取数据,然后处理数据返回结果,最后输出结点,三个过程 存在依赖关系,A- > B- > C。对于这段源程序循环代码,可以采用如下两种方式进行并行 化处理(1)采用流水线方式将并行部分分解成三个执行阶段A、B、C,每个执行阶段分配给一个处理器执行,A 可作为一个线程分配到一个核上运行,B作为另一线程在另一核上运行,C也作为一线程在 另一核上运行,这样3个核上同时运行这3个小任务,它们之间的数据依赖关系的处理方式 是数据在核之间是可以传递的。(2)采用线程猜测方式预先设定循环次数,将每次循环作为一个线程分配给一个处理器进行处理。循环 次数可以根据condition的猜测可能的循环次数,例如这里的condition是i < 10,i初始 值为0,那么可猜测它有10次循环,所以可以将这段循环分成10个线程,每个线程都是执 行A,B, C三个小任务,只是每个线程的i值不一样(0-9),每个线程分配的一个核上执行, 如果有处理器核数大于10个,那么10个线程可以同时执行,速度是顺序执行的10倍。在编译该程序时,编译器会提取硬件信息给扩展模块,并标识程序中可并行化的 部分代码,这个例子中便是程序中的循环部分,在得到并行化方案后,并行扩展模块开始扩 展程序,根据循环条件猜测循环的可能次数,每次循环可作为一个单独线程分配到一个核 上执行,将这段循环代码按condition分为多个可并行执行的线程,这样就能增加线程数, 减少单次循环次数。考虑到各次循环间有依赖关系,各线程就不能最大化并行。为了最大 提高并行性能,用软件分解流水线方式将循环分为A,B, C三个阶段,这三个阶段以流水线 方式执行A,B, C三个线程在三个核上运行,这类似于指令流水线,也类似于生产线上的流 水作业,将任务分解成多个小任务,每个核完成一个任务,这样就提升了程序性能。流水线 方式的并行化技术性能提升与循环复杂度有关,也就是与循环内部阶段数相关,阶段越多, 流水线级数也越大,性能提高也相对较大。最后编译好的二进制代码可在硬件是执行,并行 性能同硬件可用并行资源相关。
权利要求
一种程序自动并行化的方法,其特征在于该方法包括如下步骤(1)获取源程序,通过分析源程序获取包括循环和分支部的并行部分;(2)将源程序中并行部分分成多个并行模块,每个并行模块通过线程分配给不同的处理器进行处理;(3)将经过并行扩展的源程序编译成可执行的代码。
2.根据权利要求1所述的程序自动并行化的方法,其特征在于所述线程分配采用流 水线并行方式,将并行部分分解成多个执行阶段,每个执行阶段分配给一个处理器执行。
3.根据权利要求2所述的程序自动并行化的方法,其特征在于所述并行部分按照依 赖关系分成多个执行阶段。
4.根据权利要求1所述的程序自动并行化的方法,其特征在于所述线程分配采用猜测 性并行方式,当并行部分是循环时,预先设定循环次数,将每次循环作为一个线程分配给一 个处理器进行处理。
全文摘要
一种程序自动并行化的方法,该方法包括如下步骤(1)获取源程序,通过分析源程序获取包括循环和分支部的并行部分;(2)将源程序中并行部分分成多个并行模块,每个并行模块通过线程分配给不同的处理器进行处理;(3)将经过并行扩展的源程序编译成可执行的代码。本发明具有的有益效果是提供简单的程序并行化环境,充分设计简单化、安全性、可移植性方面的独特优势,具有很高的运行安全性以及开发过程中的高可重用性,大大降低了多平台开发成本,能充分利用好硬件资源,提高程序性能,加速计算过程。
文档编号G06F9/38GK101989192SQ20101053180
公开日2011年3月23日 申请日期2010年11月4日 优先权日2010年11月4日
发明者乐金明, 乔福明, 虞保忠, 陈天洲, 马建良 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1