自动改进程序编译中的并行处理的方法及其系统的制作方法_2

文档序号:8344591阅读:来源:国知局
过程。将这些间接过程扩展或展 平可以涉及将间接引用的函数内置(例如,在引用发生的位置中)或类似地构造 AST以删 除间接引用。更新全局过程表以将每个AST与过程名字或类似标识连接。
[0023] 程序过程一旦因此被创建,每个过程都具有一个无递归或间接引用的完整AST,则 从计算机程序中的主过程、函数、方法中第一行或类似起始位置开始运行程序的同时,会产 生全部完整程序依赖图。遍历程序AST以构建函数数据流图,如下进一步所述,每个非控制 流语句和每个控制结构被转换为相关节点(块207)。使用之前构建的用于引用的全局过 程表,来将显式过程调用在代码中进行内联扩展。在全局过程表中查找每个显式调用过程 以识别并取出用于插入到函数数据流图中的相关AST。将赋值语句或函数调用表示为函数 数据流图中的节点。控制流判决由节点集表示。类似地,将数组或集合运算表示为节点集。 连接节点的弧线表示数据项或集合。因此,在函数数据流图中节点表示计算而弧线表示数 据。
[0024] 在这一点上,函数数据流图表示所有细粒度任务并行处理(fine-grained task parallelism)(涉及独立输入变量的计算),但没有数据并行处理(为不同数据项执行相同 计算的情况)。为了提取数据并行处理,遍历函数数据流图以识别图中的可以并行处理的每 个循环(块209)。通过将连接节点的弧线从单个项目的表示转换为函数数据流图中相似数 据项的索引集合的表示并删除循环逻辑而将每个这种循环转换为集合运算。
[0025] 然后可以在产生的对象代码中寻求其他优化和并行处理。这种优化可以针对平台 和这些平台上的资源(块213)。可以将这些函数合并(组合为单个图节点)或分解(分 解为多个节点);将循环逻辑复制以及将独立计算分离以形成独立循环体来分解循环。可 以执行循环分析和执行集合形式的转换以提取尽可能多的(数据)并行处理。使用这些集 合可以提取比目标能够支持的并行处理更多的并行处理,这种情况下,面向集合的运算被 转换回循环形式并保留某一固定程度的并行处理。这是一种优化步骤一一对于硬件转换来 说,问题是复制电路;对于软件来说,问题是存储器和网络拓扑。
[0026] 图3是实现编译过程的计算机系统的一个实施例的示图。计算机系统301可以包 括实现执行本文描述的编译过程的编译器305的处理器或处理器集303。另一实施例中, 编译器305和相关处理可以以分布式方式在互相通信的多个计算机系统中执行。为了清楚 起见,本文下面部分描述了单个计算机系统中执行的实施例。然而,本领域技术人员应该明 白,本文描述的原理和结构与其他具有诸如分布式执行的其他配置的实施例相容。
[0027] 在一个实施例中,编译器305包括前端编译器307、中端编译器(链接器)309和后 端编译器(代码生成器)311,它们在生成目标对象代码时进行了分工。前端编译器307对 程序的源代码315执行一系列检查以确定程序是否符合正确的编程语言语法和语义。报告 不正确的语法和语义,并在该阶段结束编译过程。前端编译器307还可以执行打字检查,该 打字检查用于确认输入在程序的源代码315中的所有数据是否被正确地处理。如果语法、 语义和打字正确,前端编译器307则根据源代码生成中间代码317用于中端编译器309执 行处理。中间代码317是用于推动转换对象代码321的编译器的内部使用的程序表示。
[0028] 中端编译器309从中间代码317中重构过程AST,然后执行递归删除、到函数依赖 图的转换和面向集合的转换以生成函数数据流形式。向函数依赖图的转换自动获得大量不 依赖传统架构的优化,包括对冗余、未使用的和不可达(unreachable)代码的删除、常量值 的传播、循环不变量的提取等优化。虽然典型的情况是将后端编译器作为可执行的链接器 的第二阶段,但是中端编译器309可以生成后端编译器311执行进一步处理的另一种中间 代码317。
[0029] 中端编译器309与前端编译器分离,并执行并行处理,尤其适用于大程序。这是如 上述关于图2所述的发生向函数数据流图的转换阶段。中端编译器309读入所有对象模块, 收集全局变量表、全局类型表和模块局部变量表(每个模块至少一个),然后构建全局过程 表。进行递归函数向迭代形式的转换。将间接函数调用转换为转换表(switch table)并 产生用于转换的索引。以程序的主过程或函数(例如,类似C语言中的"main")开始,执行 运行AST。该过程中,每个过程调用被有效地内联扩展,并且因此构建完整程序依赖图。在 一些实施例中,执行循环分析并执行集转换以尽可能提取更多的并行过程。这种集的使用 允许比目标能够支持的并行过程更多的并行过程,因此将面向集合的运算转换回循环形式 的同时保留一定量的并行过程是正常的。这是一种优化步骤一一对于硬件转换来说,问题 是复制的电路;对于软件来说,问题是存储器和网络拓扑。
[0030] 在一个实施例中,后端编译器311将中间代码317转换为对象代码321、对象文件 集或类似代码。将创建的中间代码317转换为由目标平台的处理器执行或部分执行的另一 种程序语言。该过程可以涉及指令之间的替换和重组织。该过程还可以包括诸如寄存器指 派等类似处理的资源分配。通过试图指派用于处理器或执行单元集中的每一个上执行的代 码,后端编译器还试图识别并执行针对目标平台硬件的并行处理过程级别。为了向硬件翻 译,后端编译器可以将指定的函数数据流图翻译为Petri网形式,然后采取异步硬件设计 (GALS一一全局异步、局部异步)过程以完成转换。
[0031] 在进一步的实施例中,为了产生可执行代码,有必要将图节点会聚(否则,任务调 度负荷成为难题),来确定存储器调度(何时用何种存储器;对于传统过程来说,这不是问 题),并优化图-代码-级别代码并将图结构映射为运行时间模式。因此,后端编译器还可 以将中间代码315转换为可执行代码329。后端编译器311将编译器产生的对象代码321 链接在一起以创建可以在目标平台上运行的可执行代码329。后端编译器311将库代码和 其他对象代码等代码与单个对象代码321组合以实现平台指定操作和源代码315的执行。
[0032] 中端编译过程还可以使用全局过程表327、第一变量引用组319和波阵面表323。 为了在后面编译过程中使用,全局过程表327对前面处理的过程进行跟踪。全局过程表327 可以具有将过程的名字或标识与相关代码、中间代码、源代码以及每个过程的AST匹配的 条目。第一变量引用组319跟踪计算机程序中每个变量的初始值。编译过程中,波阵面表 323跟踪变量的最新值。
[0033] 处理器303可以通过总线313、芯片级或系统域网络等类似通信系统与存储源代 码315、中间代码317、对象代码321和可执行代码329的工作存储器325通信。工作存储 器325可以是任意类型的存储装置,例如固态随机存取存储器。工作存储器325可以存储 任意以上提及的数据结构(例如,全局过程表、第一变量引用数组319、波阵面表323等类似 数据结构)。除了存储编译的代码,工作存储器325和永久性存储装置(未示出)负责存储 编译器和链接器327的可执行代码。
[0034] 工作存储器325可以通过总线313与处理器303通信。然而,本领域技术人员应 该明白,总线313并不严格地表示独立于处理器303的总线,而是总线313可以包括在处理 器303和编译器305之间执行通信的中间硬件、固件以及软件部分。本领域技术人员应该 明白,以示例方式提出计算机系统,并不作为限制,并且为了清楚起见,省略了本领域技术 人员所熟知的计算机系统309的结构和组件。
[0035]
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1