CN115004150A - 用于预测和调度软件流水化循环中的复制指令的方法和装置 - Google Patents

用于预测和调度软件流水化循环中的复制指令的方法和装置 Download PDF

Info

Publication number
CN115004150A
CN115004150A CN202080093947.5A CN202080093947A CN115004150A CN 115004150 A CN115004150 A CN 115004150A CN 202080093947 A CN202080093947 A CN 202080093947A CN 115004150 A CN115004150 A CN 115004150A
Authority
CN
China
Prior art keywords
instruction
loop
instructions
iteration
value
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202080093947.5A
Other languages
English (en)
Inventor
埃桑·阿米里
谢宁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Publication of CN115004150A publication Critical patent/CN115004150A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4452Software pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

一种用于调度指令以在计算机系统上执行的方法,包括:扫描多个循环指令,其中,所述多个循环指令经模调度以标识第一指令和第二指令,在执行所述多个循环指令时,所述第一指令和所述第二指令都利用所述计算机系统的寄存器。所述循环具有第一起始区间。所述第一指令在所述循环的第一迭代中定义所述寄存器的第一值,在所述循环的第一迭代中的所述第一值的use指令之前,所述第二指令在所述循环的后续迭代中将所述寄存器的值重新定义为第二值。在执行所述第二指令之前,在所述循环指令中插入复制指令以复制所述第一值。在插入所述一个或多个复制指令之后,确定调度,所述调度包括第二起始区间。

Description

用于预测和调度软件流水化循环中的复制指令的方法和装置
相关申请交叉引用
本申请要求于2020年1月23日提交的、申请号为16/750,734、发明名称为“用于预测和调度软件流水化循环中的复制指令的方法和装置(METHOD AND APPARATUS FORPREDICTING AND SCHEDULING COPY INSTRUCTION FOR SOFTWARE PIPELINED LOOPS)”的美国专利申请的优先权,其全部内容通过引用结合在允许这种合并的司法管辖范围。
技术领域
本发明涉及软件编译器领域,尤其涉及一种用于最大化在循环迭代之间存在依赖关系的软件循环的指令级并行性的方法和装置。
背景技术
软件流水化是一种已知的优化技术,用于最大化计算机应用中的指令级并行性。软件循环即多次执行的一系列循环指令,当循环的多次迭代(重复)可以在多处理器、多核、多线程硬件或其它并行处理硬件上并行执行时,它是利用软件流水化技术的典型事例。软件流水化优化可以实现循环迭代的重叠执行,并增大了并行运行指令的机会,从而提高性能。当对软件循环进行流水化时,一旦资源或数据可用,就可以从循环的下一次迭代中发出指令。
软件流水化的有效性可能会受到循环中的指令的限制。例如,如果循环的一次迭代定义(写入或更新)一个变量,然后使用(读取)该变量,则循环的下一次迭代的执行可能必须延迟,以便在下一次迭代中不更新变量的值,直到当前循环的迭代已使用该值。
循环的软件流水化试图优化循环的起始区间(initiation interval,II)。II是循环的一次迭代的周期数,循环的一次迭代在循环的下一次迭代可以开始执行之前必须执行。II可以在机器周期中测量,调度器的目的是尽可能减小II,以增加流水化。
一旦循环中的指令完成调度,新指令的引入可能会产生影响,因为它们可能会导致II的增大。可能降低性能的常见问题之一是,在软件流水化完成调度之后生成寄存器移动指令(例如,复制指令)。当对静态单赋值(static single assignment,SSA)形式码进行软件化时,可能会发生上述情况。如果II太小,则由于寄存器值在上一个循环中使用之前被重新定义(设置为不同的值),循环无法正确执行的可能性较高。(通常,计算机系统中的寄存器是保存值(例如,数据值)以进行处理的硬件组件。如果II高于必要情况,代码就会变得低效。
因此,需要一种用于预测和调度软件流水化循环中的复制指令的方法和装置,其不存在现有技术中的一个或多个限制。
背景技术的目的是揭示申请人认为可能与本发明相关的信息。没有必要承认也不应解释任何前述信息构成与本发明相对的现有技术。
发明内容
本发明实施例的目的是提供一种用于调度指令以在计算机系统上执行的方法和装置。根据本发明的实施例,提供了一种方法,包括扫描多个循环指令,其中,所述多个循环指令经模调度以标识所述多个循环指令中的第一指令和第二指令,在执行所述多个循环指令时,所述第一指令和所述第二指令都利用所述计算机系统的寄存器。所述循环具有第一起始区间。所述第一指令在所述循环的第一迭代中定义所述寄存器的第一值。在所述循环的第一迭代中的所述第一值的use指令之前,所述第二指令在所述循环的后续迭代中将所述寄存器的值重新定义为第二值。所述方法还包括在执行所述第二指令之前,在所述多个循环指令中插入一个或多个复制指令以复制所述第一值,以及在插入所述一个或多个复制指令之后,确定所述多个循环指令的调度。所述调度包括第二起始区间。
其它实施例包括将所述调度与所述多个循环指令的第二调度进行比较,并选择所述调度或所述第二调度。
在其它实施例中,所述第一指令和所述第二指令形成由所述多个循环指令定义的虚拟寄存器的不相交集合。
在其它实施例中,所述不相交集合还包括根节点。所述根节点用作哈希表的键。所述哈希表包括指向所述第一指令的地址和所述第二指令的地址的指针。
在其它实施例中,所述第一指令的地址和所述第二指令的地址都包括迭代、阶段和周期。
在其它实施例中,所述第一指令和所述第二指令是绑定操作数。
在其它实施例中,所述多个循环指令具有静态单赋值形式,所述第一指令是phi节点。
在其它实施例中,所述计算机系统的所述寄存器对应于目标处理器的物理寄存器或所述多个循环指令。
在其它实施例中,所述一个或多个复制指令包括两个复制指令,所述两个复制指令中的第一个复制指令插入在所述第二指令之后并且在所述循环的第一迭代中的所述第一值的所述use指令之前。
在其它实施例中,所述一个或多个复制指令包括插入在所述第二指令之后并与在所述循环的第一迭代中的所述第一值的use指令同时插入的一个复制指令。
在其它实施例中,所述一个或多个复制指令包括与所述第二指令同时并在所述循环的第一迭代中的所述第一值的所述use指令之前插入的一个复制指令。
根据本发明的实施例,提供了一种用于调度指令以在计算机系统上执行的装置。所述装置包括:CPU;非瞬时性计算机可读存储介质,用于存储编译器指令,其中,所述编译器指令用于控制所述CPU执行以下步骤:扫描多个循环指令,所述多个循环指令经模调度以标识所述多个循环指令中的第一指令和第二指令,在执行所述多个指令时,所述第一指令和所述第二指令都利用所述计算机系统的寄存器。所述循环具有第一起始区间。所述第一指令在所述循环的第一迭代中定义所述寄存器的第一值。在所述循环的第一迭代中的所述第一值的use指令之前,所述第二指令在所述循环的后续迭代中将所述寄存器的值重新定义为第二值。其它步骤包括在执行所述第二指令之前,在所述多个循环指令中插入一个或多个复制指令以复制所述第一值,以及在插入所述一个或多个复制指令之后,确定所述多个循环指令的调度。所述调度包括第二起始区间。
在一些实施例中,所述步骤还包括将所述调度与所述多个循环指令的第二调度进行比较,并选择所述调度或所述第二调度。
在其它实施例中,所述第一指令和所述第二指令形成由所述多个循环指令定义的虚拟寄存器的不相交集合。
在其它实施例中,所述不相交集合还包括根节点,所述根节点用作哈希表的键,所述哈希表包括指向所述第一指令的地址和所述第二指令的地址的指针。
在其它实施例中,所述第一指令的地址和所述第二指令的地址都包括迭代、阶段和周期。
在其它实施例中,所述第一指令和所述第二指令是绑定操作数。
在其它实施例中,所述多个循环指令具有静态单赋值形式,所述第一指令是phi节点。
在其它实施例中,所述计算机系统的所述寄存器对应于目标处理器的物理寄存器或所述多个循环指令。
根据本发明的实施例,提供了一种非瞬时性计算机可读介质,所述非瞬时性计算机可读介质存储可在一个或多个处理器中执行的指令。当所述指令在所述一个或多个处理器中执行所述指令时,使得操作包括:扫描多个循环指令,其中,所述多个循环指令经模调度以标识所述多个循环指令中的第一指令和第二指令,在执行所述多个循环指令时,所述第一指令和所述第二指令都利用所述计算机系统的寄存器。所述循环具有第一起始区间。所述第一指令在所述循环的第一迭代中定义所述寄存器的第一值。在所述循环的第一迭代中的所述第一值的use指令之前,所述第二指令在所述循环的后续迭代中将所述寄存器的值重新定义为第二值。所述操作还包括在执行所述第二指令之前,在所述多个循环指令中插入一个或多个复制指令以复制所述第一值,以及在插入所述一个或多个复制指令之后,确定所述多个循环指令的调度。所述调度包括第二起始区间。
附图说明
进一步地,通过阅读以下结合附图所作的详细描述将容易了解本发明的特征和优势,其中:
图1示出了在没有软件流水化的情况下执行软件循环100的示例;
图2根据广泛的方面示出了软件流水化;
图3A示出了示例性模调度算法;
图3B示出了一个实施例提供的包括环路分析和选择步骤的调度算法;
图4示出了在一个实施例中用于表示虚拟寄存器组的不相交集合的数据结构;
图5示出了在一个实施例中使用的“地址”数据结构;
图6示出了在一个实施例中用于跟踪不相交集的vreg的哈希表;
图7示出了指令的第一阶段扫描;
图8提供了在阶段1期间扫描指令的详细视图;
图9示出了指令的第二阶段扫描;
图10示出了扩展超级复制指令的区间;
图11示出了实施例使用的示例性计算机系统。
需要说明的是,在所有附图中,相同的特征由相同的元件符号标识。
具体实施方式
本发明实施例提供了在计算机系统上调度指令的方法和装置,以实现软件循环的指令级并行性。循环包括重复执行或可以通过多次迭代执行的指令。循环中的指令可以称为循环指令。实施例包括预测由于引入复制指令而对起始区间(initiation interval,II)的影响的方法和装置,所述复制指令在从静态单赋值(static single assignment,SSA)形式转换时可以作为指令调度的结果生成。
指令调度是由计算机上的编译器执行的过程,除其它任务外,该过程重新排列指令,以便优化对用于执行计算机程序的目标计算机系统的指令的执行。指令调度可用于将计算机程序的执行时间减到最小,满足目标计算机系统的功耗约束或时序约束。指令调度执行许多优化,包括分析指令之间的数据依赖关系和指令使用的寄存器的分配情况。
模调度(Modulo Scheduling)是一种软件流水化方法,目的是为循环迭代选择调度,以便在重复调度时,不会违反约束。根据一般背景,模调度是一种用于减少循环处理时间和更高效地使用处理器资源的调度技术,使得循环中的多个迭代并行执行,而不是依次执行。在一些实施例中,约束是,如果定义了虚拟寄存器(vreg)的值(称为“def”),则寄存器的值在被读取或操作(称为“use”)之前不得修改。在一些情况下,这导致循环的II增加,从而限制了软件流水化的好处。编译器可以在循环中插入复制指令,以便在虚拟寄存器的值被后续循环修改之前,将虚拟寄存器的值保存到供用户存取的第二vreg中,从而缩小II并通过软件化提高性能。(基本上,虚拟寄存器不需要包括硬件寄存器的所有物理硬件;但虚拟寄存器通常在所有或某些方面都类似于寄存器。)
本发明的实施例预测插入的复制指令的影响,以便最大限度地提高模调度的性能增益。对于特定的调度,实施例预测将生成多少复制指令,如何在循环中调度这些指令,以及这些指令对II的影响。在一些实施例中,这包括生成第一调度,然后将第一调度与第二生成的调度进行比较,以便根据选择标准选择更好的调度。由于当存在复制指令时,可以确定新的复制指令对调度和II的影响,因此预测复制指令可以优化或调整SSA形式码。实施例试图将由于引入新的复制指令而使得II的任何增加降至最小。可以为多个调度确定复制指令的影响及其对II的影响,以便选择最佳的调度。
图1示出了在没有进行软件流水化的情况下执行软件循环100的示例。第一循环迭代102的后面是第二循环迭代104。在本示例中,每个循环包括四个指令。第一迭代102包括按顺序执行的指令110、112、114和116。第二迭代104包括按顺序执行的指令120、122、124和126。在一些实施例中,所描绘的每个单独指令可以是一组指令,例如超长指令集(verylong instruction word,VLIW)指令。指令或指令组在计算机系统的一个机器周期中执行,指令或指令组正在该计算机系统上执行。在一些实施例中,一个机器周期是一个时钟周期。
图2为一个实施例提供的软件流水化。尽管在其它实施例中,迭代次数不受限制,但为了说明该实施例,仅示出了循环的四次迭代(102、104、202和206)。循环迭代使用软件流水化来调度,使得在图2中水平对齐的指令(例如,指令114和指令120,以及指令116和指令122)同时执行。同时执行可以在多个处理器、多个内核或其它适当的并行处理硬件上完成。
在执行开始时,第一循环迭代102中的指令110和112按顺序执行。这形成了循环的函数序言(prologue)210。函数序言被执行之后,指令组(例如,第一内核循环212中的指令)就使用模调度软件流水化执行。图2中示出的其它内核循环是第二内核循环214和第三内核循环216。内核循环的数量仅受循环执行的迭代次数的限制。在第一内核循环212中,同时执行第一循环迭代102中的指令114与第二循环迭代104中的指令120。然后,同时执行第一循环迭代102中的指令116与第二循环迭代104中的指令122。类似地,在第二内核循环214中,执行第二循环迭代104和第三循环迭代202中的指令。在第三内核循环216中,执行第三内核循环202和第四循环迭代206中的指令。在第三内核循环216的执行结束时,第四循环迭代206中的剩余指令作为函数尾声(epilogue)218依次执行。
函数序言、每个内核循环和函数尾声都包括II个指令,并需要II个周期来执行,假设每个指令可以在一个机器周期中执行,同时需要考虑其它处理优化,例如,硬件流水化。
每个指令可以被定义为具有迭代(例如,102、104、202和206)、阶段(例如,210、212、214、216和218)和周期。在图2的示例中,内核循环212、214和216都具有两个阶段。可以有很多阶段,但在许多实施例中通常限于3个或4个阶段。使用这种标注,指令112可以表示为迭代1、阶段s1、周期c2。指令120可以表示为迭代2、阶段s1、周期c1。指令126可以表示为迭代2、阶段s2、周期c2。
如图3A所示,模调度算法300通常通过构建数据依赖图(data dependency graph,DDG)302开始。下面是节点排序步骤304。接下来,填充调度表306,然后生成代码308。调度表可以定义循环中的每个指令待执行的时间。如图3B所示,实施例在填充调度表306和生成代码308的步骤之间插入循环分析和选择步骤312。这样可以重复修改循环调度,并确定由此产生的对II的影响。特别地,这样可以优化受复制指令严重影响的循环。可以根据任何数量的标准或标准组合来选择调度,然而在一些实施例中,可以根据最小化II来选择调度。其它实施例试图最大程度地减少阶段的数量。
根据实施例的循环分析和选择算法312检查函数序言210和第一内核循环212的执行情况,如图2所示。针对环路具有两个阶段的示例,描述了环路分析和选择312的算法。对于更多的阶段,可以实现其它实施例。
循环分析和选择步骤312的实施例利用三种新的数据结构。图4示出了用于表示各组虚拟寄存器的不相交集合数据结构400。不相交集合包括至少两个没有共同元素的集合,或交集为空集的两个集合。示出了三个不相交集合S1 402、S2 404和S3 406。例如,集合S2404包括vreg4 408和vreg5 410。当循环分析和选择步骤312被初始化时,不相交集合400可以是空集。它由表示虚拟寄存器的集合填充,这些虚拟寄存器在执行生成的代码时可以映射到同一硬件寄存器。在一些实施例中,这些集合可以由虚拟寄存器定义,虚拟寄存器可以映射到硬件规定的其它有限资源。集合信息用于通过由于软件流水化而发生的另一个循环迭代中的def指令,确定硬件寄存器何时可以在一个循环迭代期间在def指令和对应的use指令之间更新。参考图2,如果在第一迭代102中,指令110是vreg的def指令,而指令116使用vreg,则后续迭代104中的指令120可以在110定义了vreg之后,但在指令116可以使用vreg之前重新定义vreg,从而导致错误执行第一循环迭代102。
第二种新的数据结构是图5所示的“地址”数据结构500。地址500用于动态指示指令何时被执行,并包括迭代502、阶段504和周期506,周期506唯一地标识所有循环迭代中的每个指令。
第三种新的数据结构是图6所示的哈希表600。哈希表600将虚拟寄存器映射到一组地址。不相交集合400的每个集合402、404、406具有根节点,该根节点可用作指向该集合中的其它成员的指针的键,并可用于标识一组不相交集合400中的所有成员。树结构中最上面的节点称为根节点。
根据实施例的方法包括两个扫描阶段。在第一阶段中,创建虚拟地址的不相交集合400,并填充哈希表600。在第二阶段中,分析插入复制指令的影响,并确定结果II,以便确定调度表和执行代码生成。
如图7所示,第一阶段从扫描同时执行的指令的阶段开始,以便标识每个指令可以定义或使用的虚拟寄存器(vreg)。一般来说,扫描是指检查或查看。如本文所述,可以同时或几乎同时扫描一个以上指令(即多个指令)。扫描700从扫描对应于函数序言110的循环的迭代1、阶段1 702中的指令开始。迭代1、阶段1中的指令可以以任何顺序扫描。接下来,算法扫描并标识在迭代1、阶段2和迭代2、阶段1 704中使用的vreg。假设总共有K个阶段,算法继续进行,直到扫描迭代1、阶段K,迭代2、阶段K–1……迭代K,阶段1 706。在图7的扫描过程完成时,已经分析了循环迭代1中的所有指令。所使用的vreg存储在各组不相交集合400中,其地址可以通过访问哈希表600来确定。
对于在扫描700期间遇到的每个指令定义的任何虚拟寄存器802,可以采取三个动作中的一个,如图8所示。这些动作适用于phi指令、具有绑定操作数的指令和其它指令的情况。
phi指令是一种可以根据控制流在指令之前所在的路径取不同的值的指令。如果该指令是phi指令804,则从循环的后边缘找到phi指令的传入值,并向vreg1 806赋值。vreg2用于表示由phi指令808定义的值。然后,vreg1和vreg2都被添加到不相交集合数据结构400中的同一集合中。如果vreg1或vreg2已经存在于集合中,则另一个vreg被添加到已经存在的集合中。如果vreg1和vreg2都已经存在于现有集合810中,则创建两个集合的并集,并且vreg3用于表示集合的根。对于已经合并到并集中的两个集合,查询不相交集合400以确定两个集合820的根R1和R2。这些根是哈希表600的键602,用于删除822已经合并的单独集合,并且合并集合的根vreg3会成为哈希表600中的新条目或更新条目。
如果vreg1和vreg2是新的虚拟寄存器,则vreg3被添加为新的不相交集合826的根,并且新集合的根vreg3会成为哈希表600中的新条目。或者,vreg1或vreg2也可以是新集合的根。
绑定操作数是指底层硬件指令以“将”两个寄存器“绑定”在一起的方式实现。一个示例是加法运算,即将两个寄存器的值相加,并将结果存储在两个寄存器中的一个中。如果在700中被标识为具有vreg的指令包括绑定操作数,则vreg1和vreg2都被添加到同一不相交集合400中。如果vreg1或vreg2已经存在于集合中,则另一个vreg被添加到已经存在的集合中。如果vreg1和vreg2都已经存在于现有集合810中,则创建两个集合的并集,并且vreg3用于表示集合的根。对于已经合并到并集中的两个集合,查询不相交集合400以确定两个集合820的根R1和R2。这些根是哈希表600的键602,用于删除822合并集合,并且合并集合的根vreg3会成为哈希表600中的新条目或更新条目。如果有两个以上的vreg是绑定操作数,则所有绑定的vreg都被添加到如上所述的相同不相交集合数据结构中。
对于定义了虚拟寄存器的任何其它指令816,vreg被添加到不相交集合400中,并创建哈希表600中的条目。如果指令定义了多个虚拟寄存器,则为每个vreg创建一个单独的不相交集合,并在哈希表中为每个集合创建一个单独的条目。
如果在上面的步骤818中,创建了两个预先存在的集合的并集,则通过查询哈希表600来确定这两个集合中的每个集合的根。如果这两个集合的根是R1和R2,则R1和R2是指向地址500的指针的键,指向不相交集合S1和S2。为S3生成一组新的地址,S3是S1和S2的并集。接下来,从哈希表中删除R1和R2,并在哈希表中插入新条目作为包括R1和R2的新集合S3的根。
如果哈希表600中的条目之前存在,则可以更新这些条目。如果没有现有条目,则首先创建具有空集的条目,然后将指向表示指令地址的地址三元组500的指针添加到哈希表600中。
在实施例的第二阶段中,逐阶段和逐周期遍历调度表306,从而检查循环中的每个指令。由于这是在代码进行模调度之前完成的,因此检查的指令都属于循环的通用迭代。实施例查看在第一阶段中标识并包括在不相交集合400中的每个指令使用的所有虚拟寄存器。对于vref的每个use指令,通过指令,可以静态地确定该use指令对应的到达def指令。use指令对应的到达def指令是use指令之前的最后一个def指令。到达def指令将值写入vref,该vref通过use指令读取。
然后,算法查找哈希表,以查找正在查看的use指令的vref。该算法首先查询不相交集合,然后查询哈希表,以查找该集合的对应根。在一个示例中,到达def指令在迭代1、阶段s1和周期c1中定义,而use指令是在迭代1、阶段s2、周期c2中。在此示例中,到达def指令和use指令都访问vref1。现在,算法检查在到达def指令和use指令“之间”出现的每个def,可以在到达def指令可以访问vref之后和在use指令可以访问vref之前修改vref。由于第二阶段仅使用循环的一次迭代,当确定def指令是否在到达def指令和use指令之间时,仅使用阶段和循环,迭代被忽略。在到达def指令(称为def1)和use指令(称为use1)之间,可能有其它定义def2……defN。由于def1是到达def指令,因此def2……defN属于其它迭代。为了正确执行,在def1和def2之间插入复制指令(称为“超级复制”),以将vref1的值复制到新的虚拟寄存器vref2,更新use1以访问vref2而不是vref1。
在一些实施例中,超级复制指令被扩展为多个复制操作。例如,在def指令和use指令彼此相距超过2×II个周期的情况下,软件流水化会再调度三次迭代以实现并行执行。在这种情况下,单个复制指令是不够的。该算法首先在def1和def2之间插入超级复制指令,并更新use指令以使用超级复制指令的输出。然后,算法决定如何调度和扩展超级复制指令。根据超级复制指令插入的位置,扩展可能会有所不同。
参考图10,def指令A 110的地址500具有迭代=1 102。对于A的第二def指令,可能会有迭代=3 104(情况A)或迭代=3 202(情况B)。然后考虑原始循环的迭代K中的一个def1实例,以及原始循环的迭代K+1(情况A)或迭代K+2(情况B)中的一个def2实例。在模调度循环1000中,use指令116在def1 120和def2 128之间执行。实施例检查调度表,并将在def1和def2之间的区域划分为两个区间。第一区间在def1 120和阶段212与阶段214之间的边界之间。第二区间在阶段212和阶段214之间的边界和A的下一个def指令之间。关于扩展超级复制指令的位置有多个选项。扩展过程是本领域已知的,因此没有详细描述。
一旦所有复制指令都被扩展,可能会产生循环的新II,即II+c。该算法可以考虑在[II,II+c]的包含区间内调度II的所有可能值的循环。根据复制指令扩展的位置,扩展中可能需要不同数量的复制指令。复制指令的扩展可以在上述两个区间中进行,以确定额外复制指令的影响以及由此产生的对II的影响。通过确定多个选项的影响,可以选择所需的选项。在一些实施例中,最佳调度是具有最小II的调度。根据执行生成代码的计算机系统,利用旋转寄存器文件和选择性循环展开等优化可以进一步消除新的复制指令。在实施例中,可以考虑这些因素,并在代码生成发生之前评估结果。
图11为可以用于实现本文公开的各种方法和装置的计算机(计算)系统的框图。特定设备可利用所有所示的组件或所述组件的仅一子集,且设备之间的集成程度可能不同。此外,设备可以包括多个组件实例,例如,多个处理单元、处理器、存储器、发射器、接收器。计算机系统包括处理单元1100。处理单元1100通常包括中央处理单元(centralprocessing unit,CPU)1110、总线和存储器1120,并且可选地还可以包括大容量存储设备1130、视频适配器1140和I/O接口1160(每个设备都以虚线示出,以表示它们是可选的)。计算机系统还可以包括一个或多个网络接口1150,用于将计算机系统连接到通信网络1155。
CPU可以包括任何类型的电子数据处理器,并且可以包括一个或多个核或处理元件。存储器可以包括任何类型的非瞬时性系统存储器,例如,静态随机存取存储器(staticrandom access memory,SRAM)、动态随机存取存储器(dynamic random access memory,DRAM)、同步DRAM(synchronous DRAM,SDRAM)、只读存储器(read-only memory,ROM)或其组合。在一个实施例中,存储器可以包括在开机时使用的ROM以及在执行程序时使用的存储程序和数据的DRAM。总线可以是任何类型的几种总线架构中的一种或多种,包括存储器总线或存储器控制器总线、外围设备总线或视频总线。
大容量存储器可以包括任何类型的非瞬时性存储设备,用于存储数据、程序和其它信息,并使得这些数据、程序和其它信息可通过总线访问。大容量存储器可以包括例如固态硬盘、硬盘驱动器、磁盘驱动器或光盘驱动器中的一种或多种。
视频适配器1140和I/O接口1160提供可选接口以使外部输入和输出设备与处理单元耦合。输入和输出设备的示例包括与视频适配器1140耦合的显示器1170和与I/O接口1160耦合的I/O设备1180,例如,触摸屏。其它设备可以与处理单元耦合,并且可以使用更多或更少接口。例如,可使用如通用串行总线(Universal Serial Bus,USB)(未示出)等串行接口将接口提供给外部设备。或者,计算机系统可以依靠一个或多个网络接口连接到可用的大容量存储器、视频适配器和网络上可用的I/O接口。
除非另有定义,否则本文所用的所有技术和/或科学术语都具有与本发明普通技术人员公知的含义相同的含义。
通过上述实施例的描述,本发明可以仅通过硬件实现,也可以通过软件和必要的通用硬件平台实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现。软件产品可以存储在非易失性或非瞬时性存储介质中,非易失性或非瞬时性存储介质可以是光盘只读存储器(compact disk read-only memory,CD-ROM)、USB闪存盘或移动硬盘。软件产品包括许多指令,这些指令使得计算机设备(个人计算机、服务器或网络设备)能够执行本发明实施例中提供的方法。例如,这样的执行可以对应于如本文所述的逻辑操作的模拟。根据示例性实施例,软件产品可以附加地或替代地包括多个指令,这些指令使得计算机设备能够执行配置或编程数字逻辑装置的操作。
尽管已经参考本发明的特定特征和实施例描述了本发明,但是明显在不脱离本发明的情况下可以制定本发明的各种修改和组合。说明书和附图仅被视为所附权利要求书所定义的本发明的说明并且考虑落于本说明书的范围内的任何和所有修改、变体、组合或均等物。

Claims (20)

1.一种用于调度指令以在计算机系统上执行的方法,其特征在于,所述方法包括:
扫描多个循环指令,其中,所述多个循环指令经模调度以标识所述多个循环指令中的第一指令和第二指令,在执行所述多个循环指令时,所述第一指令和所述第二指令都利用所述计算机系统的寄存器,所述循环具有第一起始区间,所述第一指令在所述循环的第一迭代中定义所述寄存器的第一值,在所述循环的第一迭代中的所述第一值的use指令之前,所述第二指令在所述循环的后续迭代中将所述寄存器的值重新定义为第二值;
在执行所述第二指令之前,在所述多个循环指令中插入一个或多个复制指令以复制所述第一值;
在插入所述一个或多个复制指令之后,确定所述多个循环指令的调度,其中,所述调度包括第二起始区间。
2.根据权利要求1所述的方法,其特征在于,还包括将所述调度与所述多个循环指令的第二调度进行比较,并选择所述调度或所述第二调度。
3.根据权利要求1或2所述的方法,其特征在于,所述第一指令和所述第二指令形成由所述多个循环指令定义的虚拟寄存器的不相交集合。
4.根据权利要求3所述的方法,其特征在于,所述不相交集合还包括根节点,所述根节点用作哈希表的键,所述哈希表包括指向所述第一指令的地址和所述第二指令的地址的指针。
5.根据权利要求4所述的方法,其特征在于,所述第一指令的地址和所述第二指令的地址都包括迭代、阶段和周期。
6.根据权利要求3所述的方法,其特征在于,所述第一指令和所述第二指令是绑定操作数。
7.根据权利要求1至6中任一项所述的方法,其特征在于,所述多个循环指令具有静态单赋值形式,所述第一指令是phi节点。
8.根据权利要求1至7中任一项所述的方法,其特征在于,所述计算机系统的所述寄存器对应于目标处理器的物理寄存器或所述多个循环指令。
9.根据权利要求1至8中任一项所述的方法,其特征在于,所述一个或多个复制指令包括两个复制指令,所述两个复制指令中的第一个复制指令插入在所述第二指令之后并且在所述循环的第一迭代中的所述第一值的所述use指令之前。
10.根据权利要求1至9中任一项所述的方法,其特征在于,所述一个或多个复制指令包括插入在所述第二指令之后并与在所述循环的第一迭代中的所述第一值的所述use指令同时插入的一个复制指令。
11.根据权利要求1至10中任一项所述的方法,其特征在于,所述一个或多个复制指令包括与所述第二指令同时并在所述循环的第一迭代中的所述第一值的所述use指令之前插入的一个复制指令。
12.一种用于调度指令以在计算机系统上执行的装置,其特征在于,所述装置包括:
CPU;
非瞬时性计算机可读存储介质,用于存储编译器指令,其中,所述编译器指令用于控制所述CPU执行以下步骤:
扫描多个循环指令,其中,所述多个循环指令经模调度以标识所述多个循环指令中的第一指令和第二指令,在执行所述多个循环指令时,所述第一指令和所述第二指令都利用所述计算机系统的寄存器,所述循环具有第一起始区间,所述第一指令在所述循环的第一迭代中定义所述寄存器的第一值,在所述循环的第一迭代中的所述第一值的use指令之前,所述第二指令在所述循环的后续迭代中将所述寄存器的值重新定义为第二值;
在执行所述第二指令之前,在所述多个循环指令中插入一个或多个复制指令以复制所述第一值;
在插入所述一个或多个复制指令之后,确定所述多个循环指令的调度,其中,所述调度包括第二起始区间。
13.根据权利要求12所述的装置,其特征在于,还包括将所述调度与所述多个循环指令的第二调度进行比较,并选择所述调度或所述第二调度。
14.根据权利要求12或13所述的装置,其特征在于,所述第一指令和所述第二指令形成由所述多个循环指令定义的虚拟寄存器的不相交集合。
15.根据权利要求14所述的装置,其特征在于,所述不相交集合还包括根节点,所述根节点用作哈希表的键,所述哈希表包括指向所述第一指令的地址和所述第二指令的地址的指针。
16.根据权利要求15所述的装置,其特征在于,所述第一指令的地址和所述第二指令的地址都包括迭代、阶段和周期。
17.根据权利要求14所述的装置,其特征在于,所述第一指令和所述第二指令是绑定操作数。
18.根据权利要求12至17中任一项所述的装置,其特征在于,所述多个循环指令具有静态单赋值形式,所述第一指令是phi节点。
19.根据权利要求12至17中任一项所述的装置,其特征在于,所述计算机系统的所述寄存器对应于目标处理器的物理寄存器或所述多个循环指令。
20.一种非瞬时性计算机可读介质,其特征在于,所述非瞬时性计算机可读介质存储可在一个或多个处理器中执行的指令,当所述指令在所述一个或多个处理器中执行时,使得操作包括:
扫描多个循环指令,其中,所述多个循环指令经模调度以标识所述多个循环指令中的第一指令和第二指令,在执行所述多个循环指令时,所述第一指令和所述第二指令都利用所述计算机系统的寄存器,所述循环具有第一起始区间,所述第一指令在所述循环的第一迭代中定义所述寄存器的第一值,在所述循环的第一迭代中的所述第一值的use指令之前,所述第二指令在所述循环的后续迭代中将所述寄存器的值重新定义为第二值;
在执行所述第二指令之前,在所述多个循环指令中插入一个或多个复制指令以复制所述第一值;
在插入所述一个或多个复制指令之后,确定所述多个循环指令的调度,其中,所述调度包括第二起始区间。
CN202080093947.5A 2020-01-23 2020-11-03 用于预测和调度软件流水化循环中的复制指令的方法和装置 Pending CN115004150A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/750,734 2020-01-23
US16/750,734 US11366646B2 (en) 2020-01-23 2020-01-23 Method and apparatus for predicting and scheduling copy instruction for software pipelined loops
PCT/CN2020/126099 WO2021147449A1 (en) 2020-01-23 2020-11-03 Method and apparatus for predicting and scheduling copy instruction for software pipelined loops

Publications (1)

Publication Number Publication Date
CN115004150A true CN115004150A (zh) 2022-09-02

Family

ID=76971045

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202080093947.5A Pending CN115004150A (zh) 2020-01-23 2020-11-03 用于预测和调度软件流水化循环中的复制指令的方法和装置

Country Status (3)

Country Link
US (1) US11366646B2 (zh)
CN (1) CN115004150A (zh)
WO (1) WO2021147449A1 (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11861366B2 (en) * 2021-08-11 2024-01-02 Micron Technology, Inc. Efficient processing of nested loops for computing device with multiple configurable processing elements using multiple spoke counts

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5276819A (en) * 1987-05-01 1994-01-04 Hewlett-Packard Company Horizontal computer having register multiconnect for operand address generation during execution of iterations of a loop of program code
US6820250B2 (en) * 1999-06-07 2004-11-16 Intel Corporation Mechanism for software pipelining loop nests
US6892380B2 (en) * 1999-12-30 2005-05-10 Texas Instruments Incorporated Method for software pipelining of irregular conditional control loops
GB0002848D0 (en) * 2000-02-08 2000-03-29 Siroyan Limited Communicating instruction results in processors and compiling methods for processors
US7747993B2 (en) * 2004-12-30 2010-06-29 Michigan Technological University Methods and systems for ordering instructions using future values
US8136107B2 (en) * 2007-10-24 2012-03-13 International Business Machines Corporation Software pipelining using one or more vector registers
TWI396132B (zh) * 2008-08-06 2013-05-11 Nat Univ Tsing Hua 非規則性暫存器集之指令管線化方法
CN101807145B (zh) 2010-04-16 2012-12-26 浙江大学 栈式分支预测器的硬件实现方法
US8966457B2 (en) * 2011-11-15 2015-02-24 Global Supercomputing Corporation Method and system for converting a single-threaded software program into an application-specific supercomputer
US9038042B2 (en) * 2012-06-29 2015-05-19 Analog Devices, Inc. Staged loop instructions
CN103425460A (zh) 2013-08-20 2013-12-04 复旦大学 一种低功耗的寄存器堆的写回丢弃方法
JP6492943B2 (ja) * 2015-05-07 2019-04-03 富士通株式会社 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム
US10838883B2 (en) 2015-08-31 2020-11-17 Via Alliance Semiconductor Co., Ltd. System and method of accelerating arbitration by approximating relative ages

Also Published As

Publication number Publication date
WO2021147449A1 (en) 2021-07-29
US11366646B2 (en) 2022-06-21
US20210232422A1 (en) 2021-07-29

Similar Documents

Publication Publication Date Title
JP5733860B2 (ja) 依存問題の効率的並列計算
US6826677B2 (en) Renaming registers to values produced by instructions according to assigned produce sequence number
US6944853B2 (en) Predicated execution of instructions in processors
US7589719B2 (en) Fast multi-pass partitioning via priority based scheduling
EP1785875A2 (en) Method for mapping applications on a multiprocessor platform/system
JP2011527788A5 (zh)
US20120054722A1 (en) Trace generating unit, system, and program of the same
US11579905B2 (en) Systems and methods for automatic data management for an asynchronous task-based runtime
US7512771B2 (en) Mapping circuitry and method comprising first and second candidate output value producing units, an in-range value determining unit, and an output value selection unit
CN113157318B (zh) 基于倒计时缓冲的gpdsp汇编移植优化方法及系统
KR20150040662A (ko) 모듈로 스케줄링 방법, 모듈로 스케줄링 장치, 모듈로 스케줄링에 따라서 동작하는 재구성 가능한 프로세서 및 재구성 가능한 프로세서의 동작 방법
CN113296788B (zh) 指令调度方法、装置、设备及存储介质
GB2394085A (en) Generating code for a configurable microprocessor
US9182960B2 (en) Loop distribution detection program and loop distribution detection method
CN115004150A (zh) 用于预测和调度软件流水化循环中的复制指令的方法和装置
US9081561B2 (en) Method for improving execution performance of multiply-add instruction during compiling
Janik et al. An overview of altera sdk for opencl: A user perspective
US9383981B2 (en) Method and apparatus of instruction scheduling using software pipelining
JP5979965B2 (ja) 回路設計支援装置及び回路設計支援方法及びプログラム
US11762641B2 (en) Allocating variables to computer memory
Khouri et al. Memory binding for performance optimization of control-flow intensive behaviors
Rohde et al. Improving HLS generated accelerators through relaxed memory access scheduling
JPH03135630A (ja) 命令スケジューリング方式
Rubanov et al. Specific optimization features in a C compiler for DSPs
Schulz et al. Rotated parallel mapping: A novel approach for mapping data parallel applications on cgras

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination