分级循环指令的制作方法

文档序号:6505065阅读:605来源:国知局
分级循环指令的制作方法
【专利摘要】本公开涉及分级循环指令。循环指令被分析,并基于它们之间的依赖性和可用的机器资源而被分配有级数。循环指令基于它们的级数被选择性地执行,从而消除了对明确的循环构造和析构指令的需要。在单指令多数据机器上,每个指令的最后实例可以根据原始循环的迭代数而在处理元件或矢量元件的子集上执行。
【专利说明】分级循环指令
【技术领域】
[0001]本发明的实施例总体上涉及硬件并行性(hardware parallelism)的有效使用,更特别地,涉及循环展开以及软件流水线技术。
【背景技术】
[0002]编译器获取高级通用语言(诸如C、C++或Java)编写的计算机源代码并且将其转换成低级机器特定的对象代码。针对简单的单核处理器编译代码可包括相对直接地将高级指令一对一地转换成低级指令。例如,访问C++类中的数据可被编译成地址算法和存储器访问机器级指令。
[0003]然而,针对具有多个功能单元或支持矢量处理的处理器编译代码可能更复杂得多。一般目标是通过使每个核(和/或每个处理器、执行单元以及流水线,这根据给定设备的具体硬件而言)尽可能地忙碌来尽可能快地运行所编译的程序。然而,该目标要求原始以串行/序列写成的指令被编译为并行地运行,并非所有指令能够同时执行。例如,如果用于第二指令的输入取决于第一指令的结果,那么第一指令和第二指令不能并行运行;第二指令必须等候第一指令完成。
[0004]“智能”编译器识别能够并行运行的指令并且创建被剪裁来并行运行的机器代码(明确地说,诸如针对超长指令字VLIW处理器产生的代码,或者含蓄地说,针对超标量(superscalar)处理器产生的代码)。可并行化情形的两个大类包括(i)表现出指令级并行性的指令和(ii)表现出数据级并行性的指令。指令级并行性指的是两个或更多指令对彼此的输出没有依赖性且因此可以被并行地计算。数据级并行性指的是对数据的集合(即,矢量)执行操作,其中对集合成员的单独操作不依赖于涉及其它成员的操作。例如,为了将两个矩阵加在一起,矩阵元素的数据级并行性可以用于并行地运行元素相加指令中的一些或全部,因为元素级别的相加操作是独立的。
[0005]编译器实现指令级和数据级并行性的一个途径是利用源代码中编写的循环(例如,for和while循环)。循环的两次或更多次迭代可以并行地执行(即“矢量化”,其利用数据级并行性)和/或循环的连续迭代可以部分地重叠(即“软件流水线技术”,其利用指令级并行性)。用于软件流水线技术的一种有用的算法是“模数调度”。关于矢量化,for循环(例如)可调用十次迭代;如果每次迭代中运行的指令独立于其它迭代的那些指令,并且如果编译器可访问例如五个处理元件,那么编译器可创建并行地在五个处理元件的每个处执行循环的两次迭代的汇编代码。关于软件流水线技术,例如,如果循环包括两个指令,但是第一指令不依赖于前一迭代的第二指令的结果,则循环的下一迭代的第一指令可被调度为与循环的当前迭代的仍在执行的第二指令并行地运行。
[0006]矢量化和软件流水线技术的一个缺点是它们增大了所执行的代码的大小。矢量化需要应付循环的余数大小的最终迭代的代码(例如,如果循环需要十一次迭代且五个处理元件可用,那么最后的迭代仅使用处理元件之一)。这种“部分填充的”最终迭代可能不仅仅是效率低的问题;许多大规模处理器阵列被调谐成期望稳定的有效数据流,个体处理元件可能不那么容易被关闭。软件流水线技术在可运行一组有效率的核心指令(循环内核(loopkernel))之前需要构造指令(set-up instruction)(循环序言(loop prolog))来准备硬件环境,在运行之后还需要开销指令(overhead instruction)(循环尾言(loop epilog))来析构循环并且整理硬件环境以用于进一步的指令。在许多情况下,该附加的开销代码可能大于循环内核代码本身,并且在具有有限的指令高速缓存或缓存容量的处理器上,可能降低性能。另一缺点是对具有可变迭代次数(称为循环的“行程计数”)的循环的处理较差;因为在编译时不能知晓行程计数,所以在运行时需要行程计数的各种测试,由此增大了程序的运行时间(尤其是在最终行程计数表现为小的时候)。
[0007]试图解决这些缺点的已有系统仅可产生进一步的缺点。例如,一些处理器(例如,矢量处理器)实施一种方法,该方法在循环的最后迭代中选择性地禁用个别处理元件。然而,在循环的最后迭代中禁用处理元件与软件流水线技术不合,流水线技术使来自循环内核中的各迭代的指令重叠。另一些系统通过将循环指令储存在固定大小的缓存中并且发布特殊循环指令来表达循环的构造、析构和稳定状态,但是这些系统不仅限制了循环内核的大小(基于固定缓存的大小),而且还不能处理更复杂的循环(诸如需要寄存器重命名的那些循环)。还有另一些系统使用一组复杂的旋转硬件寄存器来处理复杂的循环,但是这些寄存器从处理器的其它部分占据了宝贵的占用面积。因此,存在对更有效地执行任意大小和复杂度的循环内核的方法的需要。

【发明内容】

[0008]总体上,这里描述的系统和方法的各方面提供一种编译器和硬件机构以允许构造和析构软件流水线化的、矢量化的循环而不需要软件序言和尾言。本发明的实施例减小了代码大小并且,在未知行程计数的情况下,改善了所得代码的性能。循环代码被分析,每个指令被分配反映执行的总体顺序的级数;具体而言,每个指令可被分配多个时间上有序的“级”之一,每个级具有反映其在执行顺序中的位置的“级数”。当循环被执行时,其中的指令基于它们的级数被选择性地执行。
[0009]在一方面,通过计算机处理器来执行循环的方法包括将循环的循环内核指令加载到计算机处理器的存储器中(其中每个循环内核指令具有与其相关联的级数)。级阈值在循环的每次迭代期间确定,循环序言通过基于级阈值和级数执行循环内核指令的子集来执行。循环内核通过重复地执行循环内核指令来执行,循环尾言通过基于级阈值和级数执行循环内核指令的第二组子集来执行。
[0010]计算机处理器可以是标量处理器,其中循环内核指令包括具有指令级并行性或多周期潜伏(latency)的指令,和/或循环内核指令被软件流水线化。级数可以根据展开的循环内核的每个副本而被调整。循环指令的最后执行可以在比循环的较早迭代更少的处理元件或矢量元件上运行。更少的处理或矢量元件可以根据控制每个处理或矢量元件的掩码位来选择。包括与级阈值相关的信息的循环构造指令可以被接收,循环构造指令可包括总循环计数、执行循环指令时使用的处理元件数量、级计数或循环展开因子。执行循环尾言、循环内核和循环序言可包括在计算机处理器中将指令级数与级阈值相比较。
[0011]在另一方面,用于执行计算机可执行循环指令的系统包括序列器,其用于接收包括循环信息的循环构造指令。一个或更多寄存器存储与级阈值相关的数据(该数据从循环信息获得)。处理元件(i)通过基于级阈值和与循环内核指令相关联的级数执行所接收的循环内核指令的子集来执行循环序言,(ii)通过重复地执行循环内核指令来执行循环内核,并且(i i i )通过基于级阈值和级数执行循环内核指令的第二组子集来执行循环尾言。
[0012]寄存器可包括级掩码或级阈值寄存器。至少一个附加处理元件可执行循环内核指令,或者矢量指令可并行处理多数据元素。在指令的最后执行期间,可以仅处理元件或矢量元件的子集执行循环内核指令。掩码寄存器可存储与执行最后迭代中的循环内核指令相关的信息。循环信息可包括总循环计数、执行循环指令时使用的处理元件的数量、级计数或循环展开因子。循环计数寄存器可存储循环计数,其可以从总循环计数除以执行循环指令的处理元件数获得并根据级计数而被调整且根据循环展开因子而被舍入。
[0013]这些和其它目的以及这里公开的本发明的优点和特征将通过参照下面的描述、附图以及权利要求书而变得更加显然。此外将理解,这里描述的各实施例的特征并不相互排斥,而是能以各种组合和置换的方式存在。
【专利附图】

【附图说明】
[0014]在图中,贯穿不同视图,相似的附图标记一般指示相同的部件。在下面的描述中,参照下面的附图描述了本发明的各种实施例,附图中:
[0015]图1是流程图,示出根据本发明一实施例用级信息注释循环指令的方法;
[0016]图2是框图,示出根据本发明一实施例的分级循环的执行;
[0017]图3是框图,示出根据本发明一实施例的部分展开分级循环的执行;
[0018]图4是框图,示出根据本发明一实施例的要求延迟开始的部分展开分级循环的执行;
[0019]图5是框图,示出根据本发明一实施例的在多个处理元件上运行的分级循环的执行;
[0020]图6是根据本发明一实施例的用于用级数注释循环指令的系统的框图;
[0021]图7是根据本发明一实施例的用于执行分级循环指令的系统的框图;
[0022]图8是根据本发明一实施例的用于执行分级循环指令的方法的流程图。
【具体实施方式】
[0023]这里描述在具有多个处理元件或功能单元的计算机系统上通过用附加信息标注循环内核指令或循环指令的分组来运行循环的方法和系统的各种实施例,所述附加信息涉及哪些信息应被执行和按什么顺序执行从而以有效率的方式构造和析构循环内核。当处理器接收指令时,它分析标签信息并基于标签信息来在执行循环内核之前和之后执行某些循环内核指令,由此消除了对明确的循环构造/析构指令的需要。例如,编译器可以用[0]标签标注循环中的某些指令,用[I]标签标注另一些指令,用[2]标签标注再另一些指令;很一般地,如下面将更详细论述的那样,标注的分组内的指令表现出指令级并行性,更高编号的标注分组中的指令可以依赖于更低编号的分组中的指令的输出。在循环的第一迭代中,处理器可执行(并行地)用[0]标注的指令,在第二迭代中,执行用[0]或[I]标注的指令,在第三和后续迭代中,执行所有指令(即,用[O]、[I]或[2]标注的指令)。在循环的倒数第二迭代中,处理器可仅执行用[I]或[2]标注的指令,在循环的最后迭代中,仅执行用[2]标注的指令。如下面更详细说明的那样,这个简单示例可以扩展到更复杂的循环和/或处理器架构。
[0024]为了说明,将首先定义循环的若干一般属性或性质。用于传统循环的代码包括循环构造指令(即,循环序言)、循环内核和循环析构指令(即,循环尾言)。根据本发明一实施例执行的循环包括在其执行的开端处的其中并非所有循环指令被执行的一个或更多迭代、其中所有循环指令都执行的一个或更多迭代(即,循环的执行的“稳定状态”部分)、以及最后在循环的执行末尾处的其中并非所有循环指令都执行的一个或更多迭代。在一实施例中,在循环的执行的开端和末尾处的迭代为循环的稳定状态部分提供构造和析构功能,而不需要明确的额外指令来这样做。
[0025]流水线化循环内的每个连续循环迭代的起点之间的周期(cycle)总数称为开始间隔(initiation interval),其也是稳定状态循环内核中的指令行数。当以该稳定状态执行时,在每个(开始间隔)周期,新的迭代开始,同时更早开始的迭代结束其执行。开始间隔短于完成未流水线化循环的迭代所用的周期总数,因为原始循环的多个迭代已经被重叠,允许循环的稍后的迭代在稍早的迭代已经完成之前开始。例如,如果开始间隔为2,并且完成迭代所需的周期总数为6,那么迭代n、n+l和n+2将在同一时间都在运行。
[0026]循环中的指令被赋予“级数”,其依赖于从循环迭代开始起已经过去的开始间隔的倍数。在以上例子中,未流水线化循环中的头两个指令行属于第一级,指令行三和四属于第二级,而指令行五和六属于第三级。级的总数称为级计数;在该示例中,级计数为三。在循环内核的稳定状态,迭代n在执行最后级(在该例子中,第三级)中的指令,迭代n+1在执行倒数第二级(在该例子中,第二级),以此类推。在该例子中,迭代n+2通过执行第一级中的指令来开始执行。
[0027]在本发明一实施例中,级数用于标注循环内核中的指令。属于第一级的指令用[0]标注,属于第二级的指令用[I]标注,以此类推。
[0028]更小的开始间隔给出更有效率的循环内核。有助于降低开始间隔的因素包括处理器上可用的更大数量的功能单元以及指令之间更小数量的数据依赖性。小的开始间隔一般还增大产生用于循环的代码所需的级计数,如果必须产生明确的循环序言和尾言的话,这又导致更大的代码膨胀。在循环到达稳定状态之前运行所需的级数为级计数减一(即,级计数-1);在循环到达稳定状态之前运行所需的周期数因此为(级计数-1) X (开始间隔)。在本发明一实施例中,用于该开销的代码膨胀被去除。
[0029]展开循环指的是将一些或全部循环指令重写为更大数量的非循环指令。迭代六次的两指令for循环例如可通过重写为十二个普通(非循环)指令而被完全展开。作为另一例子,该for循环可通过重写为每个迭代具有更多指令但是具有更少的总迭代(例如,重写为迭代三次的四指令for循环)而被部分地展开。如果循环最初被写为具有奇数次迭代(例如,迭代五次的两指令for循环),则该部分展开技术可包括在循环外的初始(或最后)指令集(例如,两个指令加上迭代两次的四指令for循环)。
[0030]循环展开可在循环包含其结果长时间存续(S卩,需要保持可用)的指令时用于便于软件流水线化。因为在流水线化内核中的每个(开始间隔)周期都有新迭代开始,所以指令的结果在其定义之后的(开始间隔)周期不能再被使用,因为在该使用达成之前该结果将被后续迭代中的指令副本覆写或“破坏”。这个问题可以通过将循环内核展开来得到解决。展开循环当然将会引入长寿命指令的另一副本到循环内核中,为了避免该指令覆写长寿命值,它被给予了重命名的寄存器以将其值存储在该寄存器中(以避免破坏更早指令的结果)。利用以上定义的项之一,循环内核可被展开,如果循环的开始间隔(即,循环的“长度”)短于循环中的指令之一的寿命的话。所需的展开水平是开始间隔被超出多远的函数,且被称为循环展开因子。如果无需展开,那么循环展开因子为一;如果需要循环内核的两个副本,那么循环展开因子为二,以此类推。
[0031]循环的另一属性是其迭代计数是固定的还是可变的。如果是固定的,那么编译器可以通过(例如)测试迭代计数是奇数还是偶数(如上所述,这可能影响部分展开循环)来更容易地调度其执行并且相应地产生代码。然而,如果迭代计数可变(例如,迭代从I至X的for循环),那么编译器不能断定迭代计数是奇数还是偶数。
[0032]现在参照本发明的实施例,图1示出用于编译用于循环的代码的方法100。在第一步骤102中,确定循环指令中的指令依赖性(例如,对指令级并行性或数据级并行性的障碍)。在第二步骤104中,与开始间隔一起产生循环的未流水线化版本,其服从这些依赖性,从而在每个(开始间隔)周期,新迭代可以开始并与当前执行的迭代重叠,而不超越机器上可用的并行资源。在第三步骤106,确定循环的循环展开因子(例如,基于循环的开始间隔和循环指令的寿命)。在第四步骤108中,确定循环的迭代数量(例如,未知或已知,如果已知,则为奇数还是偶数)。在第五步骤110中,至少部分地基于依赖性以及硬件上可用的并行性,向循环中的指令分配级数。
[0033]在一实施例中,给定循环的指令之间具有依赖性,但是循环的展开因子为一(SP,不需要展开),而且循环的迭代数量已知。在该实施例中,编译器用流水线信息(即,级数)标注每个循环指令。该信息可以为三或四比特二进制数的形式,但是本发明不限于任何特定的信息表示。级数可以保持在指令内,将其自身编码,或者可以由另一机构指定,诸如并行数据结构。
[0034]执行期间,循环的运行最终到达稳定状态,在该状态中每个循环指令在每个迭代中被执行,但是在到达稳定状态之前,仅循环指令的子集在每个迭代中被执行,首先执行独立指令,接着可能是可能依赖于那些首先执行的指令的中间指令,接着是可能依赖于首先和中间指令的指令,以此类推,直到所有指令被执行。在循环的最后几次迭代中,首先开始执行的指令停止执行,稍后增加的依赖性指令继续执行,直到所有指令已经执行了它们的所表示的次数。
[0035]语义上,指令通过相对于级阈值测试它们的级数而被执行,级阈值在每次迭代中可能改变。在循环构造部分,如果指令的级数小于或等于级阈值,则指令被执行;在循环析构部分,如果指令的级数大于或等于级阈值,则指令被执行。级阈值在循环构造和析构部分期间在每次迭代都递增;级阈值在循环构造部分中被初始化为其最低值,在循环析构部分中被初始化为其次低值。级阈值在循环的稳定状态部分中保持恒定。在一实施例中,级阈值的递增量等于循环展开因子,如下面将更详细地描述的那样。本领域技术人员将理解,有许多方式来在硬件中实现这种语义(semantics),本发明不局限于使用级阈值。实现相同结果的其它途径可以是使用掩码寄存器,其可以在开始循环内核的下一次迭代时移位,或者使用从循环行程计数、级计数和展开因子的值获得的其它状态。这里仅为了清楚说明而对级阈值进行论述。[0036]如图2所示,示例200可辅助描述本发明的该实施例。虽然示例200包括一组具体的指令和依赖性,但是本发明不是仅限于该配置,示例200仅意味着示范。在该示例中,循环执行三次迭代且包括五个指令a、b、C、d和e。冲突存在于指令a和c之间(即,指令c依赖于指令a的输出和/或硬件禁止它们同时执行)。类似地,指令d和e由于另一冲突而不能与指令a、b或c同时运行。基于这些依赖性,编译器向指令a和b分配级[0],向指令c分配级[I],向指令d和e分配级[2]。
[0037]循环内核的开始间隔也可以被确定。如上所述,开始间隔是执行流水线化的循环内核的一次迭代所用的周期数。在该示例中,假设硬件能够在第一周期中执行指令a、c和d,在第二周期中执行指令b和e。开始间隔因此是二,因为花费两个周期来执行所有的循环
指令。例如:
[0038]
【权利要求】
1.一种通过计算机处理器来执行循环的方法,该方法包括: 将该循环的循环内核指令加载到该计算机处理器的存储器中,每个循环内核指令具有与之相关联的级数; 确定该循环的每个迭代期间的级阈值; 通过基于该级阈值和级数执行该循环内核指令的子集来执行循环序言; 通过重复地执行该循环内核指令来执行循环内核;以及 通过基于该级阈值和级数执行该循环内核指令的第二组子集来执行循环尾言。
2.权利要求1的方法,其中,该计算机处理器是标量处理器,其中该循环内核指令包括具有指令级并行性或多周期潜伏的指令,其中该循环内核指令被软件流水线化。
3.权利要求1的方法,其中,该级数根据展开的循环内核的每个副本而被调节。
4.权利要求1的方法,其中,循环指令的最后执行比循环的更早迭代在更少的处理元件或矢量元件上运行。
5.权利要求4的方法,其中,所述更少的处理元件或矢量元件根据控制每个处理元件或矢量元件的掩码比特而被选择。
6.权利要求1的方法,还包括接收循环构造指令,该循环构造指令包括与级阈值相关的信息。
7.权利要求6的方法,其中,所述循环构造指令包括总循环计数、执行循环指令时使用的处理元件的数目、级计数或循环展开因子。
8.权利要求1的方法,其中,执行所述循环尾言、循环内核和循环序言包括在所述计算机处理器中将指令级数与级阈值进行比较。
9.一种用于执行计算机可执行的循环指令的系统,该系统包括: 序列器,用于接收包括循环信息的循环构造指令; 一个或更多寄存器,用于存储与级阈值相关的数据,该数据从所述循环信息导出;以及 处理元件,用于(i)通过基于级阈值和与循环内核指令相关联的级数执行所接收的循环内核指令的子集来执行循环序言,(ii)通过重复地执行循环内核指令来执行循环内核,以及(iii)通过基于级阈值和级数执行循环内核指令的第二组子集来执行循环尾言。
10.权利要求9的系统,其中,该寄存器包括级掩码或级阈值寄存器。
11.权利要求9的系统,还包括至少一个附加的处理元件以用于执行循环内核指令或矢量指令从而并行地处理多个数据元素。
12.权利要求11的系统,其中,在指令的最后执行期间,仅所述处理元件或矢量元件的子集执行循环内核指令。
13.权利要求12的系统,其中,掩码寄存器存储与在最后迭代中执行循环内核执行相关的彳目息。
14.权利要求9的系统,其中,所述循环信息包括总循环计数、执行循环指令时使用的处理元件的数目、级计数或循环展开因子。
15.权利要求9的系统,还包括循环计数寄存器以用于存储循环计数。
16.权利要求15的系统,其中,该循环计数从总循环计数除以执行循环指令时使用的处理元件的数目导出,根据级计数被调节,并根据循环展开因子而被舍入。
【文档编号】G06F9/30GK103530088SQ201310268022
【公开日】2014年1月22日 申请日期:2013年6月28日 优先权日:2012年6月29日
【发明者】M·G·佩尔金斯, A·J·希格哈姆 申请人:美国亚德诺半导体公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1