CN103530088A - 分级循环指令 - Google Patents
分级循环指令 Download PDFInfo
- Publication number
- CN103530088A CN103530088A CN201310268022.1A CN201310268022A CN103530088A CN 103530088 A CN103530088 A CN 103530088A CN 201310268022 A CN201310268022 A CN 201310268022A CN 103530088 A CN103530088 A CN 103530088A
- Authority
- CN
- China
- Prior art keywords
- circulation
- instruction
- iteration
- level
- progression
- 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.)
- Granted
Links
- 230000004087 circulation Effects 0.000 claims description 210
- 238000011282 treatment Methods 0.000 claims description 48
- 238000000034 method Methods 0.000 claims description 37
- 230000008569 process Effects 0.000 claims description 11
- 230000001143 conditioned effect Effects 0.000 claims 2
- 238000012545 processing Methods 0.000 abstract description 12
- 230000001419 dependent effect Effects 0.000 abstract description 2
- 238000004458 analytical method Methods 0.000 description 19
- 238000010586 diagram Methods 0.000 description 8
- 238000013139 quantization Methods 0.000 description 5
- 230000007423 decrease Effects 0.000 description 4
- 230000006870 function Effects 0.000 description 4
- 238000012360 testing method Methods 0.000 description 4
- 238000006073 displacement reaction Methods 0.000 description 3
- 238000002372 labelling Methods 0.000 description 3
- 238000004519 manufacturing process Methods 0.000 description 3
- 230000009183 running Effects 0.000 description 3
- 125000002015 acyclic group Chemical group 0.000 description 2
- 238000013459 approach Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 239000000470 constituent Substances 0.000 description 2
- 230000003247 decreasing effect Effects 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004083 survival effect Effects 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000003190 augmentative effect Effects 0.000 description 1
- 230000006378 damage Effects 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 230000000873 masking effect Effects 0.000 description 1
- 239000011159 matrix material Substances 0.000 description 1
- 238000011022 operating instruction Methods 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- GOLXNESZZPUPJE-UHFFFAOYSA-N spiromesifen Chemical compound CC1=CC(C)=CC(C)=C1C(C(O1)=O)=C(OC(=O)CC(C)(C)C)C11CCCC1 GOLXNESZZPUPJE-UHFFFAOYSA-N 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3802—Instruction prefetching
- G06F9/3808—Instruction prefetching for instruction reuse, e.g. trace cache, branch target cache
- G06F9/381—Loop buffering
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/445—Exploiting fine grain parallelism, i.e. parallelism at instruction level
- G06F8/4452—Software pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/451—Code distribution
- G06F8/452—Loops
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Complex Calculations (AREA)
- Executing Machine-Instructions (AREA)
- Advance Control (AREA)
Abstract
本公开涉及分级循环指令。循环指令被分析,并基于它们之间的依赖性和可用的机器资源而被分配有级数。循环指令基于它们的级数被选择性地执行,从而消除了对明确的循环构造和析构指令的需要。在单指令多数据机器上,每个指令的最后实例可以根据原始循环的迭代数而在处理元件或矢量元件的子集上执行。
Description
技术领域
本发明的实施例总体上涉及硬件并行性(hardware parallelism)的有效使用,更特别地,涉及循环展开以及软件流水线技术。
背景技术
编译器获取高级通用语言(诸如C、C++或Java)编写的计算机源代码并且将其转换成低级机器特定的对象代码。针对简单的单核处理器编译代码可包括相对直接地将高级指令一对一地转换成低级指令。例如,访问C++类中的数据可被编译成地址算法和存储器访问机器级指令。
然而,针对具有多个功能单元或支持矢量处理的处理器编译代码可能更复杂得多。一般目标是通过使每个核(和/或每个处理器、执行单元以及流水线,这根据给定设备的具体硬件而言)尽可能地忙碌来尽可能快地运行所编译的程序。然而,该目标要求原始以串行/序列写成的指令被编译为并行地运行,并非所有指令能够同时执行。例如,如果用于第二指令的输入取决于第一指令的结果,那么第一指令和第二指令不能并行运行;第二指令必须等候第一指令完成。
“智能”编译器识别能够并行运行的指令并且创建被剪裁来并行运行的机器代码(明确地说,诸如针对超长指令字VLIW处理器产生的代码,或者含蓄地说,针对超标量(superscalar)处理器产生的代码)。可并行化情形的两个大类包括(i)表现出指令级并行性的指令和(ii)表现出数据级并行性的指令。指令级并行性指的是两个或更多指令对彼此的输出没有依赖性且因此可以被并行地计算。数据级并行性指的是对数据的集合(即,矢量)执行操作,其中对集合成员的单独操作不依赖于涉及其它成员的操作。例如,为了将两个矩阵加在一起,矩阵元素的数据级并行性可以用于并行地运行元素相加指令中的一些或全部,因为元素级别的相加操作是独立的。
编译器实现指令级和数据级并行性的一个途径是利用源代码中编写的循环(例如,for和while循环)。循环的两次或更多次迭代可以并行地执行(即“矢量化”,其利用数据级并行性)和/或循环的连续迭代可以部分地重叠(即“软件流水线技术”,其利用指令级并行性)。用于软件流水线技术的一种有用的算法是“模数调度”。关于矢量化,for循环(例如)可调用十次迭代;如果每次迭代中运行的指令独立于其它迭代的那些指令,并且如果编译器可访问例如五个处理元件,那么编译器可创建并行地在五个处理元件的每个处执行循环的两次迭代的汇编代码。关于软件流水线技术,例如,如果循环包括两个指令,但是第一指令不依赖于前一迭代的第二指令的结果,则循环的下一迭代的第一指令可被调度为与循环的当前迭代的仍在执行的第二指令并行地运行。
矢量化和软件流水线技术的一个缺点是它们增大了所执行的代码的大小。矢量化需要应付循环的余数大小的最终迭代的代码(例如,如果循环需要十一次迭代且五个处理元件可用,那么最后的迭代仅使用处理元件之一)。这种“部分填充的”最终迭代可能不仅仅是效率低的问题;许多大规模处理器阵列被调谐成期望稳定的有效数据流,个体处理元件可能不那么容易被关闭。软件流水线技术在可运行一组有效率的核心指令(循环内核(loop kernel))之前需要构造指令(set-upinstruction)(循环序言(loop prolog))来准备硬件环境,在运行之后还需要开销指令(overhead instruction)(循环尾言(loop epilog))来析构循环并且整理硬件环境以用于进一步的指令。在许多情况下,该附加的开销代码可能大于循环内核代码本身,并且在具有有限的指令高速缓存或缓存容量的处理器上,可能降低性能。另一缺点是对具有可变迭代次数(称为循环的“行程计数”)的循环的处理较差;因为在编译时不能知晓行程计数,所以在运行时需要行程计数的各种测试,由此增大了程序的运行时间(尤其是在最终行程计数表现为小的时候)。
试图解决这些缺点的已有系统仅可产生进一步的缺点。例如,一些处理器(例如,矢量处理器)实施一种方法,该方法在循环的最后迭代中选择性地禁用个别处理元件。然而,在循环的最后迭代中禁用处理元件与软件流水线技术不合,流水线技术使来自循环内核中的各迭代的指令重叠。另一些系统通过将循环指令储存在固定大小的缓存中并且发布特殊循环指令来表达循环的构造、析构和稳定状态,但是这些系统不仅限制了循环内核的大小(基于固定缓存的大小),而且还不能处理更复杂的循环(诸如需要寄存器重命名的那些循环)。还有另一些系统使用一组复杂的旋转硬件寄存器来处理复杂的循环,但是这些寄存器从处理器的其它部分占据了宝贵的占用面积。因此,存在对更有效地执行任意大小和复杂度的循环内核的方法的需要。
发明内容
总体上,这里描述的系统和方法的各方面提供一种编译器和硬件机构以允许构造和析构软件流水线化的、矢量化的循环而不需要软件序言和尾言。本发明的实施例减小了代码大小并且,在未知行程计数的情况下,改善了所得代码的性能。循环代码被分析,每个指令被分配反映执行的总体顺序的级数;具体而言,每个指令可被分配多个时间上有序的“级”之一,每个级具有反映其在执行顺序中的位置的“级数”。当循环被执行时,其中的指令基于它们的级数被选择性地执行。
在一方面,通过计算机处理器来执行循环的方法包括将循环的循环内核指令加载到计算机处理器的存储器中(其中每个循环内核指令具有与其相关联的级数)。级阈值在循环的每次迭代期间确定,循环序言通过基于级阈值和级数执行循环内核指令的子集来执行。循环内核通过重复地执行循环内核指令来执行,循环尾言通过基于级阈值和级数执行循环内核指令的第二组子集来执行。
计算机处理器可以是标量处理器,其中循环内核指令包括具有指令级并行性或多周期潜伏(latency)的指令,和/或循环内核指令被软件流水线化。级数可以根据展开的循环内核的每个副本而被调整。循环指令的最后执行可以在比循环的较早迭代更少的处理元件或矢量元件上运行。更少的处理或矢量元件可以根据控制每个处理或矢量元件的掩码位来选择。包括与级阈值相关的信息的循环构造指令可以被接收,循环构造指令可包括总循环计数、执行循环指令时使用的处理元件数量、级计数或循环展开因子。执行循环尾言、循环内核和循环序言可包括在计算机处理器中将指令级数与级阈值相比较。
在另一方面,用于执行计算机可执行循环指令的系统包括序列器,其用于接收包括循环信息的循环构造指令。一个或更多寄存器存储与级阈值相关的数据(该数据从循环信息获得)。处理元件(i)通过基于级阈值和与循环内核指令相关联的级数执行所接收的循环内核指令的子集来执行循环序言,(ii)通过重复地执行循环内核指令来执行循环内核,并且(iii)通过基于级阈值和级数执行循环内核指令的第二组子集来执行循环尾言。
寄存器可包括级掩码或级阈值寄存器。至少一个附加处理元件可执行循环内核指令,或者矢量指令可并行处理多数据元素。在指令的最后执行期间,可以仅处理元件或矢量元件的子集执行循环内核指令。掩码寄存器可存储与执行最后迭代中的循环内核指令相关的信息。循环信息可包括总循环计数、执行循环指令时使用的处理元件的数量、级计数或循环展开因子。循环计数寄存器可存储循环计数,其可以从总循环计数除以执行循环指令的处理元件数获得并根据级计数而被调整且根据循环展开因子而被舍入。
这些和其它目的以及这里公开的本发明的优点和特征将通过参照下面的描述、附图以及权利要求书而变得更加显然。此外将理解,这里描述的各实施例的特征并不相互排斥,而是能以各种组合和置换的方式存在。
附图说明
在图中,贯穿不同视图,相似的附图标记一般指示相同的部件。在下面的描述中,参照下面的附图描述了本发明的各种实施例,附图中:
图1是流程图,示出根据本发明一实施例用级信息注释循环指令的方法;
图2是框图,示出根据本发明一实施例的分级循环的执行;
图3是框图,示出根据本发明一实施例的部分展开分级循环的执行;
图4是框图,示出根据本发明一实施例的要求延迟开始的部分展开分级循环的执行;
图5是框图,示出根据本发明一实施例的在多个处理元件上运行的分级循环的执行;
图6是根据本发明一实施例的用于用级数注释循环指令的系统的框图;
图7是根据本发明一实施例的用于执行分级循环指令的系统的框图;
图8是根据本发明一实施例的用于执行分级循环指令的方法的流程图。
具体实施方式
这里描述在具有多个处理元件或功能单元的计算机系统上通过用附加信息标注循环内核指令或循环指令的分组来运行循环的方法和系统的各种实施例,所述附加信息涉及哪些信息应被执行和按什么顺序执行从而以有效率的方式构造和析构循环内核。当处理器接收指令时,它分析标签信息并基于标签信息来在执行循环内核之前和之后执行某些循环内核指令,由此消除了对明确的循环构造/析构指令的需要。例如,编译器可以用[0]标签标注循环中的某些指令,用[1]标签标注另一些指令,用[2]标签标注再另一些指令;很一般地,如下面将更详细论述的那样,标注的分组内的指令表现出指令级并行性,更高编号的标注分组中的指令可以依赖于更低编号的分组中的指令的输出。在循环的第一迭代中,处理器可执行(并行地)用[0]标注的指令,在第二迭代中,执行用[0]或[1]标注的指令,在第三和后续迭代中,执行所有指令(即,用[0]、[1]或[2]标注的指令)。在循环的倒数第二迭代中,处理器可仅执行用[1]或[2]标注的指令,在循环的最后迭代中,仅执行用[2]标注的指令。如下面更详细说明的那样,这个简单示例可以扩展到更复杂的循环和/或处理器架构。
为了说明,将首先定义循环的若干一般属性或性质。用于传统循环的代码包括循环构造指令(即,循环序言)、循环内核和循环析构指令(即,循环尾言)。根据本发明一实施例执行的循环包括在其执行的开端处的其中并非所有循环指令被执行的一个或更多迭代、其中所有循环指令都执行的一个或更多迭代(即,循环的执行的“稳定状态”部分)、以及最后在循环的执行末尾处的其中并非所有循环指令都执行的一个或更多迭代。在一实施例中,在循环的执行的开端和末尾处的迭代为循环的稳定状态部分提供构造和析构功能,而不需要明确的额外指令来这样做。
流水线化循环内的每个连续循环迭代的起点之间的周期(cycle)总数称为开始间隔(initiation interval),其也是稳定状态循环内核中的指令行数。当以该稳定状态执行时,在每个(开始间隔)周期,新的迭代开始,同时更早开始的迭代结束其执行。开始间隔短于完成未流水线化循环的迭代所用的周期总数,因为原始循环的多个迭代已经被重叠,允许循环的稍后的迭代在稍早的迭代已经完成之前开始。例如,如果开始间隔为2,并且完成迭代所需的周期总数为6,那么迭代n、n+1和n+2将在同一时间都在运行。
循环中的指令被赋予“级数”,其依赖于从循环迭代开始起已经过去的开始间隔的倍数。在以上例子中,未流水线化循环中的头两个指令行属于第一级,指令行三和四属于第二级,而指令行五和六属于第三级。级的总数称为级计数;在该示例中,级计数为三。在循环内核的稳定状态,迭代n在执行最后级(在该例子中,第三级)中的指令,迭代n+1在执行倒数第二级(在该例子中,第二级),以此类推。在该例子中,迭代n+2通过执行第一级中的指令来开始执行。
在本发明一实施例中,级数用于标注循环内核中的指令。属于第一级的指令用[0]标注,属于第二级的指令用[1]标注,以此类推。
更小的开始间隔给出更有效率的循环内核。有助于降低开始间隔的因素包括处理器上可用的更大数量的功能单元以及指令之间更小数量的数据依赖性。小的开始间隔一般还增大产生用于循环的代码所需的级计数,如果必须产生明确的循环序言和尾言的话,这又导致更大的代码膨胀。在循环到达稳定状态之前运行所需的级数为级计数减一(即,级计数-1);在循环到达稳定状态之前运行所需的周期数因此为(级计数-1)×(开始间隔)。在本发明一实施例中,用于该开销的代码膨胀被去除。
展开循环指的是将一些或全部循环指令重写为更大数量的非循环指令。迭代六次的两指令for循环例如可通过重写为十二个普通(非循环)指令而被完全展开。作为另一例子,该for循环可通过重写为每个迭代具有更多指令但是具有更少的总迭代(例如,重写为迭代三次的四指令for循环)而被部分地展开。如果循环最初被写为具有奇数次迭代(例如,迭代五次的两指令for循环),则该部分展开技术可包括在循环外的初始(或最后)指令集(例如,两个指令加上迭代两次的四指令for循环)。
循环展开可在循环包含其结果长时间存续(即,需要保持可用)的指令时用于便于软件流水线化。因为在流水线化内核中的每个(开始间隔)周期都有新迭代开始,所以指令的结果在其定义之后的(开始间隔)周期不能再被使用,因为在该使用达成之前该结果将被后续迭代中的指令副本覆写或“破坏”。这个问题可以通过将循环内核展开来得到解决。展开循环当然将会引入长寿命指令的另一副本到循环内核中,为了避免该指令覆写长寿命值,它被给予了重命名的寄存器以将其值存储在该寄存器中(以避免破坏更早指令的结果)。利用以上定义的项之一,循环内核可被展开,如果循环的开始间隔(即,循环的“长度”)短于循环中的指令之一的寿命的话。所需的展开水平是开始间隔被超出多远的函数,且被称为循环展开因子。如果无需展开,那么循环展开因子为一;如果需要循环内核的两个副本,那么循环展开因子为二,以此类推。
循环的另一属性是其迭代计数是固定的还是可变的。如果是固定的,那么编译器可以通过(例如)测试迭代计数是奇数还是偶数(如上所述,这可能影响部分展开循环)来更容易地调度其执行并且相应地产生代码。然而,如果迭代计数可变(例如,迭代从1至x的for循环),那么编译器不能断定迭代计数是奇数还是偶数。
现在参照本发明的实施例,图1示出用于编译用于循环的代码的方法100。在第一步骤102中,确定循环指令中的指令依赖性(例如,对指令级并行性或数据级并行性的障碍)。在第二步骤104中,与开始间隔一起产生循环的未流水线化版本,其服从这些依赖性,从而在每个(开始间隔)周期,新迭代可以开始并与当前执行的迭代重叠,而不超越机器上可用的并行资源。在第三步骤106,确定循环的循环展开因子(例如,基于循环的开始间隔和循环指令的寿命)。在第四步骤108中,确定循环的迭代数量(例如,未知或已知,如果已知,则为奇数还是偶数)。在第五步骤110中,至少部分地基于依赖性以及硬件上可用的并行性,向循环中的指令分配级数。
在一实施例中,给定循环的指令之间具有依赖性,但是循环的展开因子为一(即,不需要展开),而且循环的迭代数量已知。在该实施例中,编译器用流水线信息(即,级数)标注每个循环指令。该信息可以为三或四比特二进制数的形式,但是本发明不限于任何特定的信息表示。级数可以保持在指令内,将其自身编码,或者可以由另一机构指定,诸如并行数据结构。
执行期间,循环的运行最终到达稳定状态,在该状态中每个循环指令在每个迭代中被执行,但是在到达稳定状态之前,仅循环指令的子集在每个迭代中被执行,首先执行独立指令,接着可能是可能依赖于那些首先执行的指令的中间指令,接着是可能依赖于首先和中间指令的指令,以此类推,直到所有指令被执行。在循环的最后几次迭代中,首先开始执行的指令停止执行,稍后增加的依赖性指令继续执行,直到所有指令已经执行了它们的所表示的次数。
语义上,指令通过相对于级阈值测试它们的级数而被执行,级阈值在每次迭代中可能改变。在循环构造部分,如果指令的级数小于或等于级阈值,则指令被执行;在循环析构部分,如果指令的级数大于或等于级阈值,则指令被执行。级阈值在循环构造和析构部分期间在每次迭代都递增;级阈值在循环构造部分中被初始化为其最低值,在循环析构部分中被初始化为其次低值。级阈值在循环的稳定状态部分中保持恒定。在一实施例中,级阈值的递增量等于循环展开因子,如下面将更详细地描述的那样。本领域技术人员将理解,有许多方式来在硬件中实现这种语义(semantics),本发明不局限于使用级阈值。实现相同结果的其它途径可以是使用掩码寄存器,其可以在开始循环内核的下一次迭代时移位,或者使用从循环行程计数、级计数和展开因子的值获得的其它状态。这里仅为了清楚说明而对级阈值进行论述。
如图2所示,示例200可辅助描述本发明的该实施例。虽然示例200包括一组具体的指令和依赖性,但是本发明不是仅限于该配置,示例200仅意味着示范。在该示例中,循环执行三次迭代且包括五个指令a、b、c、d和e。冲突存在于指令a和c之间(即,指令c依赖于指令a的输出和/或硬件禁止它们同时执行)。类似地,指令d和e由于另一冲突而不能与指令a、b或c同时运行。基于这些依赖性,编译器向指令a和b分配级[0],向指令c分配级[1],向指令d和e分配级[2]。
循环内核的开始间隔也可以被确定。如上所述,开始间隔是执行流水线化的循环内核的一次迭代所用的周期数。在该示例中,假设硬件能够在第一周期中执行指令a、c和d,在第二周期中执行指令b和e。开始间隔因此是二,因为花费两个周期来执行所有的循环指令。例如:
使用该信息,循环内核202可以被构建,表明指令a、c和d在第一周期,指令b和e在第二周期。尽管仅示出循环内核202的一次迭代,但是循环内核202可以执行任意次数(根据原始代码中指定的迭代数)。指令已经被注释有它们的级数[0]、[1]和[2],使用该信息,系统可以通过相对于级阈值测试级数来导出循环构造和析构指令。例如,在第一迭代204中,系统执行级数小于或等于级阈值[0]的指令(即,指令a[0]和b[0])。为了示范,指令被进一步标注有与它们已经执行的次数对应的角标(例如,a1和b1),但是该信息未被系统所要求。在第二迭代206中,系统执行级数小于或等于递增的级阈值[1]的指令(即,指令a2[0]、b2[0]和c1[1])。注意,指令c1在第二迭代206中的第一次执行发生在指令a1和b1在第一迭代204中的第一次执行之后,因此满足指令之间的依赖性/冲突。
在该示例200中,循环在第三迭代202进入其稳定状态。级阈值又递增,达到[2],所有指令都执行。其它循环可要求更少或更多的构造迭代,这取决于循环的本质,本发明不限于任何特定数量的构造(或析构)迭代。
一旦循环已经到达其倒数第二迭代,它就退出循环内核202,进入第一析构迭代208。级阈值被初始化为其次低值(即,[1]),在析构部分中,仅级数大于或等于级阈值的指令(即,指令c3[1]、d2[1]和c2[2])得以执行。换言之,在该示例中,指令a和b已经执行了它们的要求数量,三次,它们的执行在第一析构迭代208中停止。级阈值又递增到[2],并且在最后的析构迭代208中,仅指令d3[2]和e3[2]得以执行,因此满足每个指令执行三次的要求,同时遵守指令之间的依赖性。
在本发明的另一实施例中,再次参照图1的步骤104,循环需要部分展开。如上所述,该需求可能发生在循环中的指令的结果的寿命超越循环的开始间隔时。如上所述,指令根据它们的依赖性而被分配有级数,指令在循环的每次迭代中根据运行指令的硬件限制而被调度。此外,在该实施例中,循环内核根据需要被展开(即,循环指令在循环内核中被复制)以允许长寿命指令结果被保持,直到其使用时。在一实施例中,在原始循环内核指令的每个连续副本中,(i)指令的级数递减一,并且(ii)为循环内核中的长寿命指令的一个或多个副本定义副本(即,重命名的)寄存器(由此防止它们的值彼此破坏)。最后,当在以上示例中(其中循环展开因子为一)通过将级阈值递增一来选择指令用于执行时,级阈值递增循环展开因子(以反映循环的超过一个展开迭代存在于循环内核中)。再一次地,以硬件提供该功能的其它方式是可行的,包括但不限于使用掩码寄存器。这里关于级阈值的说明仅用于清楚描述而给出。
一般地,级数的范围可以分配为从零到所需最大值(例如,一、二或更大)。然而,当循环展开因子大于一时,级数范围的下边界可以为负数。在一实施例中,下边界等于(1-循环展开因子),上边界等于(级计数-1)。然而,可以使用任何方便的范围,本发明不限于任何特定范围。例如,从(1-循环展开因子-级计数)到-1的全负数范围可以使硬件设计更简单。
如前面一样,示范性示例300可以辅助说明本发明的该实施例。在该示例中,循环具有七次迭代和三个指令a、b和c:指令b依赖于指令a的输出,指令c依赖于指令b的输出。将运行代码的系统能够同时运行所有这三个指令,使循环的开始间隔等于一。例如:
for(i=1;i<=7;i++){
a;b;c;
}
因此,在一简单的情况下,三个指令a、b、c可以分别分配三个级数[0]、[1]、[2],循环可以以与上面图2所示的示例200类似的方式运行。
然而,在该情况下,指令b用两个周期来完成,使得它的执行时间大于循环的开始间隔(即,一)。因此,循环可以展开以适应该指令;一展开水平(循环展开因子=二)提供更有效的操作(例如,没有或更少由于指令b的更长执行时间而引起的流水线停滞的操作)。此外,依赖于指令b的输出的指令c可被分配更后面的级数以反映该依赖性。在一实施例中,指令a被分配级[0],指令b被分配级[1],指令c被分配级[3](即,由于指令b的更长执行时间而级[2]为空)。因为展开而增加的循环内核指令的第二副本具有递减一个单位的级数。例如:
再参照图3,循环内核302示为具有第一部分304和第二部分306,第一部分304包括循环内核指令a[0]、b[1]和c[3]的第一迭代,第二部分306包括级数递减一的相同指令(例如,a[-1]、b[0]和c[2])。如在以上示例中那样,执行该循环的系统可以被传递仅该信息(即,循环内核指令和它们的标签信息)并可仅基于其导出循环构造和析构指令。
因此,在循环的第一迭代308中,级阈值设置为级数[0],循环内核302中的级数小于或等于0的指令被运行(即,指令a1[0]、a2[-1]和b1[0])。在第二迭代310中,级阈值根据循环展开因子二而递增到[2],级数小于或等于[2]的指令被运行(即,a3[0]、b2[1]、a4[0]、b3[0]和c1[2])。因此,在第二迭代310中,指令a3[0]和b2[1]在循环的第一展开实例中运行,指令a4[-1]、b3[0]和c1[2]在循环的第二展开实例中运行。因为指令b具有两个周期的寿命,所以指令b3[0]的结果存储在重命名寄存器中以避免覆写更早执行的指令b2[1]的结果。
如上所述,一旦第二迭代310的指令已经执行(并且在指令b3[0]的情况下,仍在执行中),循环内核302的指令就开始执行。在一实施例中,级阈值再递增二(即,与循环展开因子相等的量)到[4],因为[4]大于最大级数,所以循环中的所有指令被执行。再一次地,尽管仅示范了循环内核302的一个副本,但是它是循环的稳定状态部分且可以执行任意次数(根据原始的源代码中指定的循环参数)。
一旦已经到达循环的倒数第二迭代,第一析构迭代312就开始。在该迭代中,级阈值被初始化为次低级数(即,[0]);级数大于或等于零的指令(即,a6[0]、b6[1]、c4[3]、b7[0]和c5[2])被执行。最后,在最后析构迭代314中,级数大于或等于再递增的级阈值(即,[2])的指令被运行。如以上示例那样,每个指令a、b、c根据原始循环迭代计数而执行七次,每个依赖性得到遵守(例如,指令b的每个实例(instance)在对应的指令a的执行之后执行一个时钟周期;类似地,指令c在指令b之后执行两个周期)。
在本发明的另一实施例中,参照图1的步骤108,循环的迭代数可以在编译时未知。在循环展开因子为一的情况下,诸如在图2所示的示例200中,迭代计数的不确定性可能不造成挑战;根据运行时的迭代计数,循环的稳定状态部分简单地重复必要的次数。然而,在循环展开因子大于一的情况下,可能更难以创建必要数量的迭代。因为循环内核中部分展开的循环具有内建的两个或更多迭代,所以可能难以构建不是那两个或更多展开的迭代的倍数的总循环迭代计数。
作为示例,图3所示的循环300具有部分展开的内核302(具有循环展开因子二)。在该简单示例中,内核302执行仅一次,循环的迭代总数为七(即,每个指令执行七次)。如果迭代总数为九、十一或十三等,那么循环内核302可能重复两次、三次或四次等以创建所需数量的总迭代。然而,如果期望的迭代的总数为八,那么图3的循环结构不能在没有修改的情况下创建该数目(即,循环302的一个迭代太少,但是两个迭代太多)。
在一实施例中,构成循环构造的第一迭代的指令根据需要延迟一个或更多开始间隔,以创建期望的总迭代计数。源代码中的原始循环调用的迭代数为N;根据本发明的实施例构造的循环的迭代数可以为(N+[级计数-1]),其中(级计数-1)个附加迭代用于循环构造和析构迭代。如果(N+[级计数-1])不是循环展开因子的整数倍,那么它被上舍入,直到其是循环展开因子的整数倍(即,循环被构造为运行至少多一个迭代)。在该情况下,级阈值的初始值减小到零以下,从而在进入流水线化的循环时,展开的循环的初始部分被关闭。
再一次地,一示例是有帮助的。图3的循环300配置为运行总共七次迭代,其已经被修改为运行八次迭代,如图4中的图400所示。循环内核402已经被复制以执行两次,其一般将产生循环的总共九次迭代。然而,在该情况下,级阈值的初始值设置为[-1]。循环序言的第一周期404因此被禁用,因为这行的所有指令的级数大于初始级阈值。结果,指令a、b、c中的每个执行八次(而不是九次)。
404处表示的延迟的另一优点涉及循环展开中所需的寄存器重命名。在从流水线化的循环退出时,循环期间计算的并且在循环外使用的任何值必须存储在已知寄存器中,从而可以找到正确的值。然而,循环展开期间长寿命结果的寄存器重命名动作创建超过一个寄存器,所述值在循环期间存续在该寄存器中。如果循环内核402能半途退出其执行(或者,在循环展开因子大于二的循环的情况下,在完全通过其执行之外的某一点),那么在循环外使用的结果的最终值可以保持在任何这些重命名寄存器中;即,如果循环行程计数在编译时未知,那么就不知晓哪个寄存器将保持最终结果。通过将延迟404置于循环序言404的开端处,内核402在完全完成其执行之后退出,因此确保总是知晓哪个寄存器将保持循环中的结果的最终值。进入内核402,容易确保重命名寄存器的所有副本被初始化到它们正确的初始值(如果需要的话)。
在一实施例中,超过一个处理元件可用于代码的执行,编译器将数据独立的指令发送到每个处理元件。如果循环的迭代数不是处理元件数的倍数,那么一些处理单元可以在循环的最后迭代中空闲(即,它们的操作可以被掩蔽掉)。在两处理元件的系统上执行七次迭代的循环的示范性实施例500示于图5中。代码可表现出下面的依赖性:
因为七不是二的偶数倍,所以循环的四次迭代被发送到第一处理元件502,三次迭代被发送到第二处理元件504。根据级阈值,级[0]的指令在第一级506开始执行,循环内核508在后面的级执行。内核508在第二处理器504上首先退出,而它在第一处理器502上运行额外的迭代。两个处理器502、504都在最后迭代510中执行级[1]。
用于用级数来注释循环指令的系统600的一实施例示于图6中。源代码分析模块602分析源代码以获得表现出指令级并行性或数据级并行性的候选指令(例如,循环指令)。(模块一般以软件形式实现,即,作为存储在非易失性存储器中供处理器执行的计算机可执行指令集。程序模块包括例程、程序、对象、组元、和/或数据结构等,其执行特定任务或实现特定的抽象数据类型。然而,如本领域公知的那样,功能模块也可以以硬件实现或者作为软件/硬件组元的混合,这取决于特定应用的要求。)源代码分析模块602可以基于模式匹配、解析、部分(或完全)编译、或者本领域已知的分析代码的任何其它方法识别源代码中的这些指令。任何类型的源代码都在本发明的范围内。一旦被识别,根据本发明的实施例,级数生成模块604就基于指令间的依赖性、限制、或者将运行代码的硬件特征、或任何其它相关因子来向指令分配级数。模块602、604之一或二者可以确定与循环相关的属性,诸如其开始间隔、级计数、和/或循环展开因子,任意或全部这些属性可以用于向指令分配级数。一旦已经针对一些或全部指令确定了级数,汇编代码或对象代码输出模块606就可以准备、格式化和输出适于在一个或更多目标处理器上运行的汇编代码或对象代码(其包括级数)。然而,本发明不限于仅涉及这些模块602、604、606的实施方式,本领域技术人员将理解,模块602、604、606中实现的功能性可以以更多或更少模块实现。
用于执行具有级数注释的代码的系统700示于图7中。序列器702包含状态信息且向一个或多个处理元件704发布指令。序列器702可存储关于当前执行的循环的信息,诸如循环展开因子、保留在循环中的迭代数(即,“循环计数”),在循环的每次迭代中应执行哪些级数、以及多个处理元件704中的哪些应执行循环的最后迭代中的指令。本领域技术人员将意识到,有许多方法来实现序列器702(或将其类似功能性实现到另一功能块中),本发明不限于任何特定实施方式。此外,处理元件704可以是任意类型的通用或专用计算块,其受序列器的控制。此外,将理解,本发明还应用到在单个计算单元内处理的矢量内的独立元素的控制,在该意义上这些元素可以视为好像它们存在于单独的处理元件中。这种机器通常称为单指令多数据(SIMD)处理器。
序列器702(更具体而言,实现其的硬件)包括用于存储状态信息的寄存器,诸如用于存储循环计数的循环计数寄存器706和用于存储循环展开计数(也称为可变模数扩展或“MVE”展开因子)的循环展开因子寄存器708。级掩码寄存器710填充有关于(基于它们的级数)在哪个迭代中应执行哪些指令的信息;例如,级掩码寄存器710的一个比特可指示应执行级[0]的指令,另一比特可指示应执行级[1]的指令,以此类推。级掩码寄存器可以在每个处理元件704处在局域级掩码寄存器714中复制(因为如下事实,即,在每个迭代中每个处理元件704可能执行具有不同级数的指令)。最后迭代掩码寄存器712可用于表示多个处理元件704中的哪些应在循环的最后迭代期间开启或关闭。
循环计数寄存器706可以为八、十六或任意其它比特数的大小。存储在循环计数寄存器706中的值在每次循环迭代时递减(例如递减循环展开因子)。一旦循环计数寄存器706中的值达到零,循环就停止迭代。循环展开因子寄存器708可以为两比特大小以支持为四的最大展开因子,可以为三比特大小以支持为八的最大展开因子,或者可以为任何其它大小。级掩码寄存器710的大小可以等于至少循环展开因子和最大级计数的和。在一实施例中,级掩码寄存器710为23比特大小。最后迭代掩码寄存器712可具有用于每个处理元件704的一比特。
循环指令可以用于初始化序列器702中的状态寄存器706、708、710、712。循环指令可包括指示总循环计数、使用的处理元件数、级计数以及循环展开因子的参数。循环展开因子寄存器708加载有循环指令中给出的循环展开因子的值;其它寄存器706、710、712的值可以根据下面示出的方程式(1)-(3)从循环指令参数获得。
级掩码寄存器
最后迭代掩码寄存器712=(1<<(((N-1)%VLEN)+1))-1 (3)
关于方程式(1),循环计数与源代码中的迭代数(N)除以并行地执行指令的处理元件704的数目(VLEN或矢量长度)相关。需要额外迭代(SC-1)用于循环构造和析构。结果被上舍入到循环展开因子MVE的最接近的倍数。关于方程式(2),考虑到在循环计数寄存器706中计算的循环展开因子(MVE)所需的任何上舍入(LC),根据级计数(SC)将二进制的一移位到级掩码寄存器710中。关于方程式(3),二进制的一移位到最后迭代掩码寄存器712中,与迭代数(N)以处理元件704的数量(VLEN)为模相等,以在最后迭代中掩蔽掉不需要的处理元件704(即,模操作给出了在最后迭代中“剩余”指令的数目)。例如,N=13且VLEN=8给出了FMASK=00011111,而N=16给出FMASK=11111111。最后,如果循环计数寄存器706的值小于或等于级掩码寄存器710中的比特数(即,循环中的最后几个迭代可能正在靠近),那么在级掩码寄存器710中超出并包括第(LC-1)比特的任何比特被清除,来自最后迭代掩码寄存器712的值被用于重新填充级掩码寄存器710中的第(LC-1)比特的位置。
级掩码寄存器710的重新计算的内容然后被推出到每个处理元件704中的寄存器的局域副本714,其中第(LC-1)比特的位置在被达到时指示一些处理元件704在最后迭代期间切换为关闭。每个处理元件704接收和解码指令并检查每个指令的级数;如果指令的在该处理元件的局域掩码寄存器714中的对应比特条目被设置,则指令被执行。在一实施例中,局域掩码寄存器714中的对应级数的比特位置在编译和汇编时被计算并被编码在指令中,从而使硬件免于计算和/或存储该值。
在一示例中,循环指令指定循环计数为523,处理元件数(VLEN)为4,级计数为3,循环展开(MVE)因子为2。在该示例中,循环计数寄存器706接收值134,循环展开因子寄存器708接收值2,级掩码寄存器710接收值11...11000(所有的局域寄存器714也是如此),最后迭代掩码寄存器712接收值0111。
状态寄存器706和710可以在每次循环迭代时更新。在一实施例中,循环计数寄存器706递减循环展开因子寄存器708的值,级掩码寄存器710右移位与循环展开因子寄存器708的值相等的次数。如果循环在靠近其最后几个迭代(例如,如果循环计数寄存器706的值小于或等于级掩码寄存器710中的比特数),那么零被移位进入;否则的话,一被移位进入。如上所述,如果循环在其最后(或最后几个)迭代中,那么最后迭代掩码寄存器712的值被复制到局域掩码寄存器714(在它们的第(LC-1)比特位置)。
例如,在上个示例中介绍的循环的一个迭代之后,循环计数寄存器706更新到值132,级掩码寄存器710更新到值11...11110(所有的局域寄存器714也是如此)。在循环的接近但并不位于其寿命末端的另一迭代中,循环计数寄存器706更新到值4,级掩码寄存器710更新到值00...00111。局域寄存器714根据最后迭代掩码寄存器712而更新为具有不同的值,即00...1111、00...1111、00...1111和00...0111。在循环的最后迭代中,循环计数寄存器706更新到值2,级掩码寄存器710更新到值00...001。局域寄存器714再次根据最后迭代掩码寄存器712而更新为具有不同的值,即00...0011、00...0011、00...0011和00...0001。
根据本发明的实施例的用于执行循环指令的方法800示于图8中。在第一步骤802,循环指令被接收,带有关于将要运行的循环的信息(例如,循环展开因子和迭代计数)。状态寄存器(例如序列器中的)被用该信息(和/或从其导出的值)初始化。在第二步骤804中,针对一个或更多处理元件计算掩码并向其发送掩码;该掩码(例如,上面参照图7描述的级掩码)包含关于执行哪些级的指令的信息。在第三步骤806中,循环指令根据它们的级数和掩码而被执行。在第四步骤808中,掩码(和状态信息)在循环回来(loop back)时被更新。本领域技术人员将意识到,有许多可以在掩码寄存器中或以其它方式组织控制处理元件的比特的方法,本发明不限于所描述的在序列器内保持的全局掩码寄存器和在每个处理元件内的局域掩码寄存器的实现方式。例如,同样可行的是,所有的所需状态保持在序列器以及根据针对每个处理元件哪些指令当前被启用而分发到处理元件的指令内。
还应注意,本发明的实施例可以提供为一个或更多计算机可读程序,该程序体现于一个或更多制造物品上或其中。制造物品可以是任何适当的硬件装置,诸如,例如软盘、硬盘、CD ROM、CD-RW、CD-R、DVD ROM、DVD-RW、DVD-R、闪存卡、PROM、RAM、ROM、或磁带。一般地,计算机可读程序可以以任何编程语言实现。可使用的语言的一些例子包括C、C++或JAVA。软件程序还可以转换成机器语言或虚拟机器指令并存储在该形式的程序文件中。程序文件然后可以存储在一个或更多制造物品上或其中。
上面描述了本发明的某些实施例。然而,明确说明的是,本发明不限于这些实施例,而是,对这里明确描述的那些的增补和修改的发明也包括在本发明的范围内。此外将理解,这里描述的各实施例的特征不是相互排斥的,而是在不偏离本发明的思想和范围的情况下,可以以各种组合和置换的形式存在,即使这种组合或置换未明确描述于此。实际上,在不偏离本发明的思想和范围的情况下,本领域技术人员可以对这里描述的实施例做出变型、修改和其它实现方式。因此,本发明不是仅有前面的示范性描述来定义。
Claims (16)
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的系统,其中,该循环计数从总循环计数除以执行循环指令时使用的处理元件的数目导出,根据级计数被调节,并根据循环展开因子而被舍入。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/537,731 | 2012-06-29 | ||
US13/537,731 US9038042B2 (en) | 2012-06-29 | 2012-06-29 | Staged loop instructions |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103530088A true CN103530088A (zh) | 2014-01-22 |
CN103530088B CN103530088B (zh) | 2016-08-17 |
Family
ID=48670409
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310268022.1A Active CN103530088B (zh) | 2012-06-29 | 2013-06-28 | 分级循环指令 |
Country Status (4)
Country | Link |
---|---|
US (1) | US9038042B2 (zh) |
EP (1) | EP2680132B1 (zh) |
JP (1) | JP5882950B2 (zh) |
CN (1) | CN103530088B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105389158A (zh) * | 2014-08-28 | 2016-03-09 | 想象技术有限公司 | 组合路径 |
CN103942158B (zh) * | 2014-02-17 | 2017-08-25 | 上海新储集成电路有限公司 | 一种具有智能优化循环指令模块功能的自学习系统 |
CN107193535A (zh) * | 2017-05-16 | 2017-09-22 | 中国人民解放军信息工程大学 | 基于simd扩展部件的嵌套循环向量并行的实现方法及其装置 |
CN109086049A (zh) * | 2018-07-25 | 2018-12-25 | 北京金和网络股份有限公司 | 遍历用户在线状态数据的方法 |
CN112445527A (zh) * | 2019-09-05 | 2021-03-05 | 富士通株式会社 | 近似计算并行化电路和方法以及并行信息处理装置 |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101962248B1 (ko) * | 2012-03-16 | 2019-03-27 | 삼성전자주식회사 | 재구성 가능 프로세서의 검증 지원 장치 및 방법 |
US9244677B2 (en) * | 2012-09-28 | 2016-01-26 | Intel Corporation | Loop vectorization methods and apparatus |
US10585801B2 (en) | 2012-11-26 | 2020-03-10 | Advanced Micro Devices, Inc. | Prefetch kernels on a graphics processing unit |
US9459871B2 (en) * | 2012-12-31 | 2016-10-04 | Intel Corporation | System of improved loop detection and execution |
EP2972781A4 (en) | 2013-03-15 | 2016-10-19 | Intel Corp | METHOD AND SYSTEMS FOR VECTORIZING SCALAR COMPUTER PROGRAM GRINDINGS WITH GRINDING DEPENDENCIES |
JP6245031B2 (ja) * | 2014-03-27 | 2017-12-13 | 富士通株式会社 | コンパイルプログラム、コンパイル方法およびコンパイル装置 |
CN104317572B (zh) * | 2014-09-30 | 2017-05-24 | 南京大学 | 一种实时系统的循环边界内向分析方法 |
US11275710B2 (en) * | 2018-03-31 | 2022-03-15 | Micron Technology, Inc. | Loop thread order execution control of a multi-threaded, self-scheduling reconfigurable computing fabric |
US10691430B2 (en) * | 2018-08-27 | 2020-06-23 | Intel Corporation | Latency scheduling mehanism |
US11366646B2 (en) * | 2020-01-23 | 2022-06-21 | Huawei Technologies Co., Ltd. | Method and apparatus for predicting and scheduling copy instruction for software pipelined loops |
JP7302728B2 (ja) * | 2020-02-14 | 2023-07-04 | 日本電気株式会社 | ループアンローリング処理装置、方法およびプログラム |
US11340958B2 (en) | 2020-07-08 | 2022-05-24 | Vmware, Inc. | Real-time simulation of compute accelerator workloads for distributed resource scheduling |
JP2022182260A (ja) * | 2021-05-28 | 2022-12-08 | 富士通株式会社 | コンパイラ、コンパイル方法、及びコンパイラ装置 |
US11782725B2 (en) * | 2021-08-16 | 2023-10-10 | Micron Technology, Inc. | Mask field propagation among memory-compute tiles in a reconfigurable architecture |
US20230385040A1 (en) * | 2022-05-24 | 2023-11-30 | Xilinx, Inc. | Splitting vector processing loops with an unknown trip count |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2003108387A (ja) * | 2001-09-27 | 2003-04-11 | Toshiba Corp | ソフトウエア・パイプライニング処理方法及びソフトウエア・パイプライニング処理装置 |
CN1666187A (zh) * | 2002-06-28 | 2005-09-07 | 摩托罗拉公司 | 可重配置的流型矢量处理器 |
US20090327674A1 (en) * | 2008-06-27 | 2009-12-31 | Qualcomm Incorporated | Loop Control System and Method |
Family Cites Families (31)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5920724A (en) * | 1996-03-28 | 1999-07-06 | Intel Corporation | Software pipelining a hyperblock loop |
DE69936952T2 (de) | 1998-01-28 | 2008-05-21 | Texas Instruments Inc., Dallas | Verfahren und Vorrichtung zur Verarbeitung von Programmschleifen |
US6954927B2 (en) * | 1999-02-17 | 2005-10-11 | Elbrus International | Hardware supported software pipelined loop prologue optimization |
US6820250B2 (en) * | 1999-06-07 | 2004-11-16 | Intel Corporation | Mechanism for software pipelining loop nests |
US7302557B1 (en) * | 1999-12-27 | 2007-11-27 | Impact Technologies, Inc. | Method and apparatus for modulo scheduled loop execution in a processor architecture |
US6754893B2 (en) | 1999-12-29 | 2004-06-22 | Texas Instruments Incorporated | Method for collapsing the prolog and epilog of software pipelined loops |
US6629238B1 (en) | 1999-12-29 | 2003-09-30 | Intel Corporation | Predicate controlled software pipelined loop processing with prediction of predicate writing and value prediction for use in subsequent iteration |
US6567895B2 (en) | 2000-05-31 | 2003-05-20 | Texas Instruments Incorporated | Loop cache memory and cache controller for pipelined microprocessors |
US6615403B1 (en) * | 2000-06-30 | 2003-09-02 | Intel Corporation | Compare speculation in software-pipelined loops |
US6912709B2 (en) | 2000-12-29 | 2005-06-28 | Intel Corporation | Mechanism to avoid explicit prologs in software pipelined do-while loops |
US20020144092A1 (en) * | 2001-01-31 | 2002-10-03 | Siroyan Limited. | Handling of loops in processors |
GB2398411B (en) * | 2001-10-12 | 2005-04-27 | Pts Corp | Processors and compiling methods for processors |
US7415601B2 (en) | 2002-06-28 | 2008-08-19 | Motorola, Inc. | Method and apparatus for elimination of prolog and epilog instructions in a vector processor using data validity tags and sink counters |
JP3847672B2 (ja) * | 2002-07-03 | 2006-11-22 | 松下電器産業株式会社 | コンパイラ装置及びコンパイル方法 |
JP3958662B2 (ja) | 2002-09-25 | 2007-08-15 | 松下電器産業株式会社 | プロセッサ |
JP3974063B2 (ja) | 2003-03-24 | 2007-09-12 | 松下電器産業株式会社 | プロセッサおよびコンパイラ |
US7631305B2 (en) * | 2003-09-19 | 2009-12-08 | University Of Delaware | Methods and products for processing loop nests |
US7168070B2 (en) | 2004-05-25 | 2007-01-23 | International Business Machines Corporation | Aggregate bandwidth through management using insertion of reset instructions for cache-to-cache data transfer |
US20050283772A1 (en) * | 2004-06-22 | 2005-12-22 | Kalyan Muthukumar | Determination of loop unrolling factor for software loops |
US7669042B2 (en) * | 2005-02-17 | 2010-02-23 | Samsung Electronics Co., Ltd. | Pipeline controller for context-based operation reconfigurable instruction set processor |
US7721267B2 (en) * | 2005-05-16 | 2010-05-18 | Texas Instruments Incorporated | Efficient protocol for encoding software pipelined loop when PC trace is enabled |
US7778494B2 (en) | 2005-10-13 | 2010-08-17 | Texas Instruments Incorporated | FIR-based interpolation in advanced video codecs on VLIW processor |
US7984431B2 (en) * | 2007-03-31 | 2011-07-19 | Intel Corporation | Method and apparatus for exploiting thread-level parallelism |
US7813567B2 (en) * | 2007-04-26 | 2010-10-12 | Texas Instruments Incorporated | Method of CABAC significance MAP decoding suitable for use on VLIW data processors |
US8213511B2 (en) | 2007-04-30 | 2012-07-03 | Texas Instruments Incorporated | Video encoder software architecture for VLIW cores incorporating inter prediction and intra prediction |
US8136107B2 (en) * | 2007-10-24 | 2012-03-13 | International Business Machines Corporation | Software pipelining using one or more vector registers |
US8572590B2 (en) | 2008-09-17 | 2013-10-29 | Reservoir Labs, Inc. | Methods and apparatus for joint parallelism and locality optimization in source code compilation |
JP5326314B2 (ja) * | 2008-03-21 | 2013-10-30 | 富士通株式会社 | プロセサおよび情報処理装置 |
US9436469B2 (en) * | 2011-12-15 | 2016-09-06 | Intel Corporation | Methods to optimize a program loop via vector instructions using a shuffle table and a mask store table |
US8949809B2 (en) * | 2012-03-01 | 2015-02-03 | International Business Machines Corporation | Automatic pipeline parallelization of sequential code |
US9239712B2 (en) * | 2013-03-29 | 2016-01-19 | Intel Corporation | Software pipelining at runtime |
-
2012
- 2012-06-29 US US13/537,731 patent/US9038042B2/en active Active
-
2013
- 2013-06-13 JP JP2013124943A patent/JP5882950B2/ja active Active
- 2013-06-17 EP EP13172329.8A patent/EP2680132B1/en active Active
- 2013-06-28 CN CN201310268022.1A patent/CN103530088B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2003108387A (ja) * | 2001-09-27 | 2003-04-11 | Toshiba Corp | ソフトウエア・パイプライニング処理方法及びソフトウエア・パイプライニング処理装置 |
CN1666187A (zh) * | 2002-06-28 | 2005-09-07 | 摩托罗拉公司 | 可重配置的流型矢量处理器 |
US20090327674A1 (en) * | 2008-06-27 | 2009-12-31 | Qualcomm Incorporated | Loop Control System and Method |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103942158B (zh) * | 2014-02-17 | 2017-08-25 | 上海新储集成电路有限公司 | 一种具有智能优化循环指令模块功能的自学习系统 |
CN105389158A (zh) * | 2014-08-28 | 2016-03-09 | 想象技术有限公司 | 组合路径 |
CN105389158B (zh) * | 2014-08-28 | 2020-04-10 | 想象技术有限公司 | 数据处理系统、编译器、处理器的方法和机器可读介质 |
CN107193535A (zh) * | 2017-05-16 | 2017-09-22 | 中国人民解放军信息工程大学 | 基于simd扩展部件的嵌套循环向量并行的实现方法及其装置 |
CN107193535B (zh) * | 2017-05-16 | 2019-11-08 | 中国人民解放军信息工程大学 | 基于simd扩展部件的嵌套循环向量并行的实现方法及其装置 |
CN109086049A (zh) * | 2018-07-25 | 2018-12-25 | 北京金和网络股份有限公司 | 遍历用户在线状态数据的方法 |
CN112445527A (zh) * | 2019-09-05 | 2021-03-05 | 富士通株式会社 | 近似计算并行化电路和方法以及并行信息处理装置 |
Also Published As
Publication number | Publication date |
---|---|
US20140007061A1 (en) | 2014-01-02 |
US9038042B2 (en) | 2015-05-19 |
EP2680132B1 (en) | 2018-08-01 |
EP2680132A3 (en) | 2016-01-06 |
JP2014010832A (ja) | 2014-01-20 |
CN103530088B (zh) | 2016-08-17 |
JP5882950B2 (ja) | 2016-03-09 |
EP2680132A2 (en) | 2014-01-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103530088A (zh) | 分级循环指令 | |
Dadu et al. | Towards general purpose acceleration by exploiting common data-dependence forms | |
US5303357A (en) | Loop optimization system | |
KR102204282B1 (ko) | 다수의 기능 유닛을 가지는 프로세서를 위한 루프 스케쥴링 방법 | |
CN104040492A (zh) | 微处理器加速的代码优化器和依赖性重排序方法 | |
JPH09282179A (ja) | オーバーヘッド命令を最小限にする最適化コンパイラにおける命令スケジューリングの方法および装置 | |
CN104040490A (zh) | 用于多引擎微处理器的加速的代码优化器 | |
CN107810477A (zh) | 解码的指令的重复使用 | |
CN104040491A (zh) | 微处理器加速的代码优化器 | |
US10430191B2 (en) | Methods and apparatus to compile instructions for a vector of instruction pointers processor architecture to enable speculative execution and avoid data corruption | |
Six | Optimized and formally-verified compilation for a VLIW processor | |
JP6427053B2 (ja) | 並列化コンパイル方法、及び並列化コンパイラ | |
KR20140131200A (ko) | 멀티스레드 프로그램 코드의 변환 장치 및 방법 | |
US20240020239A1 (en) | Artificial intelligence (ai)/machine learning (ml) tensor processor | |
WO2022053152A1 (en) | Method of interleaved processing on a general-purpose computing core | |
She et al. | OpenCL code generation for low energy wide SIMD architectures with explicit datapath | |
CN113791770B (zh) | 代码编译器、代码编译方法、代码编译系统和计算机介质 | |
Suba | Hierarchical pipelining of nested loops in high-level synthesis | |
Whaley | Automated empirical optimization of high performance floating point kernels | |
US9207922B2 (en) | Compiling method and apparatus for scheduling block in pipeline | |
Schwarz et al. | Engineering an optimized instruction set architecture for AMIDAR processors | |
Sura et al. | Using multiple threads to accelerate single thread performance | |
US11675572B2 (en) | Sharing data structures | |
Song et al. | Compiling optimization for neural network accelerators | |
JP2011198198A (ja) | 命令スケジューリング装置、命令スケジューリング方法および命令スケジューリングプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |