在运行时的软件流水线的制作方法

文档序号:9291637阅读:355来源:国知局
在运行时的软件流水线的制作方法
【技术领域】
[0001] 本发明描述的实施例大体上涉及软件流水线,并且更特定地涉及在动态编译器中 执行软件流水线。
【背景技术】
[0002] 软件流水线可以是高效编译器技术,其利用来自循环的指令级并行性。常规软件 流水线可局限于静态编译器中的部署,其可不适合于动态编译活动,例如在硬件/软件协 同设计、动态语言、云计算和嵌入式系统中牵涉的那些。
【附图说明】
[0003] 本发明的实施例的各种优势将通过阅读下列说明和附上的权利要求书并且通过 参考下列图而对本领域内技术人员变得明显,其中: 图1是根据实施例的装置的示例的框图; 图2A和2B是根据实施例的方法的示例的流程图; 图3A-3E是根据实施例的场景的插图; 图4是根据实施例的系统的框图; 图5是根据实施例的处理器的示例的框图。
【具体实施方式】
[0004] 现在转向图1,图示用于对动态编译器执行软件流水线的装置21。图示的装置21 包括第一模块22、第二模块23、第三模块24、第四模块25和第五模块26。该第一模块22 可确定对于由动态编译器处理一个或多个循环的性能水平,其中该性能水平通过计算最小 启动间隔(Mil)来确定。第二模块23可执行代码优化以对一个或多个循环产生在规定时 期内实现所确定的性能水平的流水线调度,其中执行的代码优化包括分配硬件资源并且确 定对于每个分区级中包括的指令的局部依赖性来产生局部调度。
[0005] 另外,执行的代码优化可包括调整局部调度来解决循环承载依赖性以创建调整的 局部调度并且使指令从它们的当前级移到下一个级以如果所调整的局部调度未实现性能 水平且还未发生规定时期则产生下一个迭代调度。执行的代码优化可重复以使用下一个迭 代调度来产生新的调整的局部调度,只要规定时期直到调整的局部调度实现性能水平才发 生即可。
[0006] 第三模块24可对一个或多个循环建立依赖图并且基于性能水平将每个依赖图分 区成级。第四模块25可确定调整的局部调度是否实现性能水平并且如果所调整的局部调 度未实现性能水平,则第五模块26可确定是否已发生规定时期。图示的装置21因此在优 化对于动态编译活动(例如在硬件/软件协同设计、动态语言、云计算和嵌入式系统中牵涉 的那些)的代码方面可以是有用的。
[0007] 图2A图示在运行时对动态编译器执行软件流水线的方法。图示的方法可实现为 逻辑指令集和/或固件,其存储在例如随机存取存储器(RAM)、只读存储器(ROM)、可编程 ROM (PR0M)、闪速存储器等机器或计算机可读存储介质中,在例如可编程逻辑阵列(PLA)、 现场可编程门阵列(FPGA)、复杂可编程逻辑设备(CPLD)等可配置逻辑中,在使用汇编语言 编程和例如专用集成电路(ASIC)、互补金属氧化物半导体(CMOS)或晶体管-晶体管逻辑 (TTL)技术等电路技术的固定功能性硬件中,或其任何组合中。例如,用于实施在图示的方 法中示出的操作的计算机程序代码可采用一个或多个编程语言的任何组合来编写,其包括 面向对象编程语言(例如C++或类似物)和常规程序编程语言,例如"C"编程语言或相似编 程语言。此外,方法可使用前面提到的电路技术中的任一个来实现。
[0008] 方法可一般通过在不违背任何依赖或资源约束的情况下使循环迭代的执行重叠 来执行软件流水线。图示的方法在过程块11处通过计算最小启动间隔(Mil)而开始。该最 小启动间隔可以是循环迭代开始到下一个循环迭代开始之间的最短时期。在一个示例中, 启动间隔越短,完成循环过程所需要的周期数越小并且可使用软件流水线越快地执行循环 过程。另外,作为计算MII的副产物,可在后续调度期间识别关键操作并且给予其优先级。
[0009] 对于指定循环,例如在图3A中图示的循环,建立依赖图。例如在图3B中图示依赖 图。在图中,图示有两个循环承载依赖边缘,d - b和b - a,每个具有迭代距离值(1)。依 赖边缘c - d具有两个周期的延迟。其它依赖是局部的,并且因此它们具有迭代距离值(0)。 强连通分量(SSC)可使用例如Tarjan的强连通分量算法等算法从依赖图识别。
[0010] 最小启动间隔可使用算法中识别的SCC来计算,例如Howard迭代策略算法,其可 实现如下: MllCalculation(H),其中H是在Howard迭代策略算法中扫描SCC的最大次数。
[0011] 在依赖图中识别SCC MII - - OO for 每个 SCC do 利用Howard迭代策略算法计算SCC的广义最大电路平均值,但策略在持续H次地扫描 SCC后还未稳定时中止 MII=max(MII,广义最大电路平均值) isCritical(a) 一 FALSE .穿 operation a for 每个 SCC do if MII=SCC的广义最大电路平均值then isCritical (a) -TRUEoperation a e SCC 策略图中的关键周期。
[0012] 在过程块12处,图示的方法将依赖图分区成初始级集来形成接近最佳调度的初 始调度。过程块12还可提供初始化时期变量(例如,"i",在下文更详细论述的)。每个级可 具有预定高度MII。例如,如果在图3B中图示的依赖图被切开使得每个级具有MII个周期, 则所得的初始调度在图3C中图示,这时MII等于二(2)。
[0013] 依赖图可使用例如Bellman-Ford算法等算法来分区。算法可计算自伪开始节点 到依赖图中的每个节点的最长路径。在一个示例中,对于节点的路径长度除以MII是对于 节点的级指数。这样的方法可创建初始调度,其中每个节点被分配级。在该过程中,每个边 缘(a - b,δ,d)可具有δ -d*MII的长度,并且伪开始可连接到具有长度0的任何其它节 点。边缘a -b,S,d具有从a -b的依赖,其中δ是延迟并且d是迭代距离。计算的最 长路径可分成级。
[0014] 算法可例如使用阈值B来控制Bellman-Ford算法的迭代次数而实现如下。一旦 迭代次数达到B并且未完成算法,整个方法中止。
在过程块13处,图示的方法开始执行代码优化来产生流水线调度并且实现计算的 MII。特别地,在过程块13处,图示的方法可分配硬件资源、实行对分区级中的指令的局部 依赖以及创建局部调度。可对指令内的每个操作分配资源和偏移。过程块13可例如用算 法实现如下:
对于当前内核中反向顺序中的每个操作,do 对于每个外出边缘爆:£|0::,do
应用例如任何列表调度,其作用于局部依赖并且按照具有高度优先级函数的资源约束 工作。
[0016] 在过程块14处,图示的方法可通过调整局部调度来解决循环承载依赖而继续执 行代码优化。对于未用局部调度解决的每个循环承载依赖,可在源与目的指令之间插入一 个或多个空白级以尝试解决循环承载依赖(即,水平内核扩展)。这样的方法在两个操作之 间延伸时间距离以不小于依赖的延迟。图3D图示具有循环承载依赖的局部调度。通过在 c与d之间添加空白级(如在图3E中图示的),解决依赖。
[0017] 为了解决在过程块13期间还未解决的循环承载依赖,内核扩展可例如执行如下: 让(a - b,δ,d)成为在任何执行代码优化之前原始依赖图中未解决的循环承载依赖 图。作为第一选择,进行通过在循环承载依赖的源与汇节点之间插入空白级的水平内核扩 展来增加时间距离d的尝试。这样的方法可迫使它们的时间差异满足或超出依赖的延迟, 并且从而在不增加启动间隔的情况下解决依赖。
[0018] 作为其中存在通过插入空白级而无法解决的任何循环承载依赖的另一个方法中, 启动间隔(II)可增加。
[0019] 当新的耐,可不违背激茜足的之前的憾。如果特定憾盼汇节点级在依赖細节点 级之前,贝I族它们之间插入级可只御寸间差减小。简而言之,对于依赖可存在"禁止"级和"可扩展"级。紧 樹封襟止何扩膨级之Ι?獻空白级所吏憾隨与&间的时间差减小獅。形式h对于边缘e: a -b,墙ρφ?、、、、a) ^ LtXiuiiJ^Wcum ? ^ ^ }。 Stage(o)可以是运算〇的级指数。
[0020] 注意两个集可由源与汇节点的级之间的级组成,因为如果在源和汇节点的级两者 之前(或两者之后)插入级,对时间差将没有影响。
[0021] 现在对于未解决的依赖,为了在不改变启动间隔(II)的情况下解决它,紧挨它的 可扩展级中的一个之前插入的级的最小数量可从以下得到: 在5;〇/!*// + 〇/7'5拉|?-£?/'/泌?丨,其中(^861:(0)是在内核中它的级中的运算 〇的时间偏移。
[0022] 基本上,可计算禁止级的全局集,其中该全局集是所
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1