部分向量化编译系统的制作方法

文档序号:8323918阅读:540来源:国知局
部分向量化编译系统的制作方法
【技术领域】
[0001] 本公开内容涉及编译技术,并且更具体地说,涉及具有部分向量化代码生成的编 译系统。
【背景技术】
[0002] 向量处理器通常通过提供包括多个标量单元/处理器的向量处理单元而允许增 大的程序执行速度,以便并行处理多个数据元素或数据阵列。可用的标量单元/处理器的 数量经常称为向量长度。向量处理单元执行的指令是向量指令,向量指令可指定操作和要 并行操作的数据的阵列。每个标量单元/处理器在数据的阵列的对应元素上执行操作。存 在向量化编译器,向量化编译器一般情况下将代码从例如便于程序员读和写的形式的自然 形式转换成适合由向量处理器执行的形式。它们一般情况下识别操作的独立指令,重新布 置对应数据操作数到数据阵列中,并且将它们转换成对应向量指令。此过程称为向量化。
[0003] 然而,由于依赖问题,这些现有编译器经常未能向量化代码的区域。例如,如果第 二指令的执行以某种方式取决于第一指令的执行的结果,则两个不同指令不能并行执行。 在检测到此类依赖问题时,编译器可将大小增大的代码的区域指定为不适合向量化。因此, 向量处理的可能性可能不完全实现。
【附图说明】
[0004] 所要求保护的主题的实施例的特征和优点随着以下具体实施例继续,并参照附图 (其中类似的标号示出类似部分)将变得明白,并且其中: 图1示出与本公开内容一致的一个示范实施例的顶级系统图; 图2示出与本公开内容的示范实施例一致的部分向量化的图; 图3示出与本公开内容一致的一个示范实施例的框图; 图4示出与本公开内容的示范实施例一致的循环平整(flattening); 图5示出与本公开内容的示范实施例一致的循环依赖图生成; 图6示出与本公开内容的示范实施例一致的循环依赖图分割; 图7示出与本公开内容的示范实施例一致的条件向量化的示例; 图8示出与本公开内容的示范实施例一致的条件向量化的另一示例; 图9示出与本公开内容的示范实施例一致的条件向量化的另一示例; 图10示出与本公开内容一致的示范实施例的操作的流程图;以及 图11示出与本公开内容一致的一个示范实施例的系统顶级框图。
[0005] 虽然以下【具体实施方式】将参照说明性实施例继续,但其许多备选、修改和变化将 对于本领域技术人员显而易见。
【具体实施方式】
[0006] 通常,本公开内容提供用于生成和执行部分向量化代码的系统和方法。部分向量 化可允许包括后向依赖的代码循环的向量化。这可通过确定不包括后向依赖的那些循环的 迭代的范围使得可为向量化和执行选择和启用那些范围可实现。
[0007] 通过生成和分析用于代码的循环体部分的循环依赖图(LDG),可静态或动态确定 范围。LDG的节点可对应于代码的向量化单元,例如,语句、表达式和操作,而LDG的边缘可 对应于在节点之间的控制和/或数据依赖关系。
[0008] 在一些实施例中,在部分向量化前,可识别代码的嵌套循环,并且可平整内部循 环。在一些实施例中,向量处理器可提供部分向量化代码的依赖估计的动态运行时检查,并 且提供用于在错误估计的情况下的恢复。
[0009] 图1示出与本公开内容一致的一个示范实施例的顶级系统图100。如下面将更详 细解释的,软件或代码102可提供到部分向量化系统104并且由其处理以便生成部分向量 化代码106。然后可在向量处理器108上执行部分向量化代码106,向量处理器108可包括 多个(即,向量长度)标量单元/处理器110以增大程序执行速度。
[0010] 图2示出与本公开内容的示范实施例一致的部分向量化200的图。在此示例中, 代码的某个段包括含有将被多次迭代的3个语句A、B和C的循环体。这例如可写为 for (i.....β;Β:Γ;! 水平轴表示迭代,并且垂直轴表示执行时间。向量处理器具有8的向量长度(即,可并 行执行的8个标量单元/处理器)。如果在代码中没有依赖,则可能通过在8个标量单元/ 处理器的每个标量单元/处理器上并行执行迭代1到8来实现完全处理器利用。这之后将 是以相同的并行方式执行迭代9到16,并且以此类推,直至完成期望数量的循环迭代。 [0011] 然而,代码内依赖的存在一般将阻止完全向量化。例如,迭代3可能只在迭代2已 完成后才执行,并且在迭代3完成前,迭代4不能开始。然而,如下面将描述的,可实现部分 向量化,从而产生此示例图示,其中,在第一时间间隔上并行向量化和执行(范围VI)迭代1 和2,之后是在第二时间间隔上不能向量化(范围V2)的迭代3的执行,最后是在第三时间间 隔上并行执行(范围V3)迭代4到8的执行。在此示例中,通过在3个时间间隔而不是如果 不执行向量化则将要求的8个时间间隔内的8次迭代,部分向量化提供了性能改进。
[0012] 图3示出与本公开内容一致的一个示范实施例的框图300。部分向量化系统104 示为包括LDG构造模块306、LDG分割模块308、初始向量代码生成模块310及强连通代码 (SCC)区域分析、分类和代码生成模块312。还示出的是可选循环预处理模块302、路径剖析 (profiling)模块304及代码优化模块314。
[0013] 如下面将更详细解释的,LDS构造模块306可配置成分析包含循环的代码段,并且 生成包括节点和边缘(即,连接节点的线)的图。节点可表示向量化单元,如语句、表达式或 操作,换而言之,在标量单元/处理器之一上能够执行的代码的项。边缘可表示在节点之间 的依赖关系,并且可以是数据依赖或控制依赖。
[0014] 如下面将更详细解释的,LDG分割模块308可配置成将图分割成可向量化的区域 (VR区域)和包括强连通分量的区域(SCC区域)。VR区域通常在其内没有依赖循环,而SCC 区域通常确实包含依赖循环,并且因此难以向量化。如下面将更详细解释的,初始向量代码 生成模块310可配置成生成第一版本的向量化代码。如下面将更详细解释的,SCC区域分 析、分类和代码生成模块312可配置成处理和向量化SCC代码区域。
[0015] 在一些实施例中,可选循环预处理模块302可配置成执行循环不变式识别和提 升、函数内联和包括高度降低、特殊表达式重写和循环折叠的循环变换。循环预处理模块 302也可配置成执行显露用于向量化的另外机会的嵌套的循环变换(循环平整)。
[0016] 在一些实施例中,可选路径剖析模块304可配置成识别循环体内的"热"(更经常 执行)和"冷"(更少执行)路径。包含更难以向量化代码段的冷路径则可保持未向量化,而 不会不利地影响向量化循环的总体性能。
[0017] 在一些实施例中,可选代码优化模块314可配置成在产生的部分向量化代码上执 行强度降低。
[0018] 图4示出与本公开内容的示范实施例一致的循环平整操作400。可由循环预处理 模块302执行的循环平整通过将内部循环平整,将嵌套的循环变换成有利于部分向量化过 程的格式。代码402的段包括外部循环404和内部循环406。代码408的变换的版本具有 平整的内部循环410,平整的内部循环410具有预处理语句412,预处理语句412配置成将 循环live-in和live-out变量(? c)收集到临时向量中。迭代预处 理语句412,直至将临时向量填充到向量长度,在该点执行向量化内部循环体414。变换的 代码也具有剩余部分416以处理在最后迭代发生前未达到完全向量长度的任何剩余元素。
[0019] 对于存在外部循环的4次迭代(8卩,A4),并且每个框表示内
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1