CN103268223B - 在编译过程中改善乘加类指令执行性能的方法 - Google Patents
在编译过程中改善乘加类指令执行性能的方法 Download PDFInfo
- Publication number
- CN103268223B CN103268223B CN201310150714.6A CN201310150714A CN103268223B CN 103268223 B CN103268223 B CN 103268223B CN 201310150714 A CN201310150714 A CN 201310150714A CN 103268223 B CN103268223 B CN 103268223B
- Authority
- CN
- China
- Prior art keywords
- instruction
- register
- accumulator
- pseudo
- multiply
- 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.)
- Active
Links
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/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/3001—Arithmetic instructions
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种在编译过程中改善乘加类指令执行性能的方法,包括如下步骤:编译器对源代码进行编译,得到内部表征;并优化;产生基于目标处理器的机器码,对所述机器码中的伪寄存器分配物理寄存器;再对乘积累加类指令的寄存器分配结果进行改进。实施本发明的在编译过程中改善乘加类指令执行性能的方法,具有以下有益效果:允许编译器通过得到最好的MAC指令使用收益去优化程序的实现。
Description
技术领域
本发明涉及源代码的编译方法,更具体地说,涉及一种在编译过程中改善乘加类指令执行性能的方法。
背景技术
在计算机的程序中,需要取得两个数相乘然后再与另外一个相加的结果是非常普遍的。例如,在纯量积、矩阵乘法和许多多项式形式的求解中。由于表达式a×b+c经常出现并需要对其运算,大多数流行的处理器提供乘加指令(multiply-addinstruction,MADD),以改进算法执行的性能。MADD用于提高计算速度,因为其能够实现先乘后加两次运算,所以其一个指令相当于两个指令。由于两次运算融合为一次,MADD也可以被视为一个融合的乘-加(fusedmultiply-add,FMA)运算。
通常,MADD指令的形式为:
d=a×b+c
此时,由于要求指定3个操作数和1个结果,在指令编码时,除了需要在指令中使用更多的字节,还会导致硬件实施更加复杂,这是由于该指令要求增加第3个硬件读取端口的缘故。另外一种选择是将MADD视为乘积累加(multiply-accumulate,MAC)运算,通过求和使乘积被累加。在这种情况下,处理器提供一个特殊的寄存器,累加器(accumulator,acc),其有一个隐含的操作数和一个隐含的MAC的结果。MAC的格式如下:
macab
此时,该式的意思是:acc=a×b+acc
由于acc是特殊的寄存器,处理器必须定义两个附加的指令,初始化acc指令(initacc)和由acc中取值指令(mvacc)。
对于MAC指令而言,虽然这种形式可以使硬件实施简化,但是其必须总是使用acc寄存器使得编程的灵活性有所下降。当程序员在使用高级语言例如C和c++编程时,仅仅编译器决定何时使用MAC以及何时不使用MAC就使得MAC这种方法变得较为困难,累加器资源变得不足常常是MAC能否使用的一个决定因素。因此,虽然MAC指令不需要增加额外的硬件结构,但是,在现有技术中,由于累加器的限制,在源代码编译后实际认出可执行MAC指令的情景并不多,使得其执行收益较低。
发明内容
本发明要解决的技术问题在于,针对现有技术的上述硬件结构复杂、执行受到限制、执行收益不高的缺陷,提供一种不需要改进硬件、执行收益较高的在编译过程中改善乘加类指令执行性能的方法。
本发明解决其技术问题所采用的技术方案是:构造一种在编译过程中改善乘加类指令执行性能的方法,包括如下步骤:
A)编译器对源代码进行编译,将源代码转换为内部表征;并优化所述内部表征;
B)产生基于目标处理器的机器码,对所述机器码中的伪寄存器分配物理寄存器;
C)分别对乘积累加类指令的寄存器分配进行改进,如果在该段代码存在至少一个累加器空闲,则按照设定条件将至少一个空闲累加器分配给当前乘积累加类指令中的伪寄存器,使其使用所述累加器实行乘积累加;如果当前没有累加器空闲,则分配普通寄存器到当前乘积累加类指令,使乘积累加类指令通过两个独立的运算实现。
更进一步地,所述步骤A)中,在对所述源代码进行编译的中端阶段,将源代码中所有的两数相乘再与另一数相加的表达式均转换为乘加指令形式。
更进一步地,所述步骤B)中进一步包括:将所有的乘加指令通过增加一个拷贝指令的步骤,并将其转换为乘积累加类指令。
更进一步地,所述步骤B)中采用基于优先权的寄存器分配方法,按照当多个伪寄存器竞争有限数量个物理寄存器时,优先分配执行次数最多的寄存器以及当多个物理寄存器可以配置到一个伪寄存器时,优先采用性能收益最大的物理寄存器配置的方法为所述伪寄存器配置物理寄存器。
更进一步地,判读所述性能收益最大包括:判断伪寄存器是否出现在一个乘积累加类指令中,如否,为其配置普通物理寄存器;如是,且当前存在至少一个空闲的累加器,将累加器配置到该伪寄存器。
更进一步地,所述步骤C)进一步包括:
如果一个乘积累加类指令没有分派到累加器,引入一个新的伪寄存器存储中间结果,并分别执行所述乘积累加类指令源代码中的两个运算操作。
更进一步地,所述步骤C)进一步包括:在一个累加器被分配给一个普通指令作为其操作结果的情况下,如果该指令是拷贝指令,转换该指令为初始化累加器(initacc)指令;否则,使用一个新的伪寄存器取代累加器,并插入一个初始化累加器(initacc)指令,使用所述普通指令中的伪寄存器初始化累加器。
更进一步地,所述步骤C)进一步包括:当一个拷贝指令的操作数是累加器时,转换该指令为累加器数值移出指令。
更进一步地,所述步骤C)进一步包括:当指令中的操作数是累加器时,引入一个伪寄存器,并在该指令之前插入一个将累加器数值移动到所述伪寄存器的累加器数值移出指令(mvacc),然后在该指令中所有累加器出现的操作中使用所述伪寄存器代替累加器。
更进一步地,所述乘积累加类指令包括MADD指令、MSUB指令、NMADD指令或/和NMSUB指令。
实施本发明的在编译过程中改善乘加类指令执行性能的方法,具有以下有益效果:其保证编译器在优化编程性能时将不会错过任何使用MAC指令的机会。当有多个申请者希望使用MAC时,该方法的好处是允许编译器将申请者中的大多数转换为MAC。未被选择的申请者通过隔离的乘和加指令被保持。在处理中,编译器也产生有效的代码去移动通用寄存器中的数据到acc或相反,并维持当acc使用时编码运行的正确性。总之,该方法允许编译器通过得到最好的MAC指令使用收益去优化程序的实现。
附图说明
图1是本发明在编译过程中改善乘加类指令执行性能的方法实施例的流程图;
图2是所述实施例中对寄存器分配改进的流程图。
具体实施方式
下面将结合附图对本发明实施例作进一步说明。
如图1所示,在本发明的在编译过程中改善乘加类指令执行性能的方法实施例中,包括如下步骤:
步骤S11将源代码转换为内部表征(internalrepresentation,IR)并优化:在本步骤中,在编译器中将源代码转换为内部表征,并优化这些内部表征;通常来讲,源代码在编译器中的编译过程被分为多个阶段。前端阶段(front-endphase)是负责将程序由其原来的语言转换为编译器的IR,中端阶段(middle-end)用于优化转换为IR的程序性能;其中,由于有许多不同的优化算法及理论,中端阶段也就有许多相对应的、一个连接一个的优化步骤。上述前端阶段和中端阶段是不依赖于处理器的,因为IR的形式并不涉及任何目标处理器的特殊性能。在本实施例中,要求中端阶段尽可能转换出MADDs的结构,也就是说,当一个乘积被作为一个加法的操作数时,中间阶段必须没有限制地转换乘和加两个运算为单个的MADD运算。即在步骤S11中,将所有的涉及一个乘积被作为一个加法的操作数指令转换为单个的MADD指令。该转换操作可以通过样品匹配(patternmatching)或其他技术来达成。
步骤S12产生基于处理器的机器码,并对其进行寄存器分配:在本步骤中,编译器在得到的IR的基础上产生基于目标处理器的机器码,对得到的机器码按其所用到的伪寄存器(pseudo-register,preg)分配物理寄存器。对于编译器而言,由本步骤开始,可以视为后端阶段(back-endphases),而在上述后端阶段,是与目标处理器相关的或基于目标处理器的。在本实施例中,编译器扩展得到的IR为目标处理器的机器码。后端阶段的剩余部分将对得到的机器码进行优化。在最后得到的机器码中的寄存器由其伪寄存器表示。在本步骤中,伪寄存器的使用是没有限制的。而寄存器分配阶段将分配物理寄存器到上述伪寄存器,于是,需要为上述代码分配实际的寄存器。这个物理寄存器的分配过程可以包含插入的附加指令,以移动变化的寄存器和内存中的数据,达到克服固定数量的实际寄存器带来的限制。将多个数据装载到寄存器可以提高程序运行的性能,这是由于指令需要采取上载、存储方式访问内存的动作被最小化。此外,附加指令会拖长程序的执行,内存访问指令可能导致性能的降低,因为其具有较长的延迟时间,可能导致缓存遗漏。
在机器码产生的初始阶段,由于伪寄存器的数量是无限的,产生的代码系列可以被视为开放式的,因为其表现为有足够的寄存器(即伪寄存器)用于存储所有数据值。基于此,可以忽略只有一个acc寄存器的事实。在实际中,许多不同的寄存器分配算法被用于编译器。尽管这些算法具有不同的操作方法,但是也具有一些共同点,例如,将目标处理器提供的、固定数量的实际寄存器分配到无限数量的伪寄存器中;当一个物理寄存器被分配到多于一个的伪寄存器候选者时,必须保证在其使用上没有冲突。一个充分的条件是,这两个伪寄存器的存活期间没有交叉或重叠的地方;当没有可以分配的物理寄存器配置给伪寄存器时,生成的代码将该伪寄存器溢出并配置到内存中(即使用内存配置给伪寄存器),这导致附加的指令需要对本地存储器进行读写操作。即使优化这些配置,还是可能导致运行时间拖长。
在本实施例中,选择基于优先权的着色寄存器分配方法(priority-basedcoloringregisterallocationalgorithm,PCRAA),其具有如下特点:当多个伪寄存器在有限数量的物理寄存器中竞争时,将采取执行次数最多的伪寄存器作为下一个配置的寄存器;当多于一个寄存器能够配置到一个伪寄存器时,比较每个寄存器实现的不同性能,选择其性能收益最多的一个配置到该伪寄存器。
值得一提的是,在本步骤中,当将IR转换为机器码时,还包括将IR中的所有的乘加指令(MADD)通过增加一个拷贝指令的步骤,并将其转换为乘积累加类(MAC)指令。这使得我们能够将MADDs作为MAC指令来使用。由于其包含一个拷贝指令,使得无论何时,在MADD中的附加操作数与来自MADD的结果不同。
之前,d=a×b+c(aMADD)
对上述表达式进行MADD-to-MAC转换:
d=c
d=a×b+c(aMAC)
注意,此时MAC指令有其明确规定的第3个操作数(d在上面的式子中),因为还未将其限定为acc。在本实施例中,计划是将该操作数引入寄存器分配中。寄存器分配可以自由地为该操作数分配任何寄存器。在寄存器分配之后,产生一段改进的代码,并转换该段代码使其符合处理器的限制。当我们发表最终的MAC指令时,acc的特性作为其隐含的条件被省略。
在本步骤中,进行上述转换后再依据基于优先权的着色寄存器分配方法对寄存器进行分配,在分配时,除了遵循上述原则外,还需要按照如下原则对寄存器进行分配:将acc视为一个通用的寄存器一样,如果一个伪寄存器没有出现在任何MAC指令的结果中,则不将acc寄存器分配给它;如果一个伪寄存器出现在任何MAC指令的结果中,且如果acc在该伪寄存器的存活其间内皆空闲,将acc寄存器分配给它。经过上述原则与上述PCRAA原有的寄存器分配原则的结合,acc配置到MAC指令系列可以得到最好的性能收益。例如:MAC指令处于一个循环中-寄存器分配将为其中的伪寄存器分配acc,这是由于(该伪寄存器)一直在循环中而具有较高的优先级;一个MAC的层叠指令在同一个伪寄存器上累加-多次出现(或使用)使得该伪寄存器具有更高的优先级。在本步骤中,判读所述性能收益最大包括判断伪寄存器是否出现在一个乘积累加类指令中,如否,为其配置普通物理寄存器;如是,且当前存在至少一个空闲的累加器,将累加器配置到该伪寄存器。
由于PCRAA依照伪寄存器的优先权排列顺序指派寄存器到伪寄存器,具有较低优先权且与具有较高优先权的伪寄存器冲突的伪寄存器将不会被指派到acc。同时,由于PCRAA将一直运行到不再具有寄存器可以指派,使得acc能够指派的时间尽可能地长,直到一个伪寄存器出现,作为任何一个MAC指令的结果,于是acc将被用于该MAC指令。
步骤S13对机器码中的乘加指令所涉及的寄存器进行优化,在累加器空闲的情况下为其分配累加器或使其由两个分开的运算实现:在本步骤中,分别对上述机器码每段中的乘积累加类指令的寄存器分配进行改进,如果存在至少一个累加器空闲,则按照设定条件将至少一个空闲累加器分配给当前乘积累加类指令中的伪寄存器,使其使用所述累加器实行乘积累加;如果当前没有累加器空闲,则分配普通寄存器到当前乘积累加类指令,使乘积累加类指令通过两条指令的运算实现。值得一提的是,本步骤中的优化处理对于整个由源代码得到的机器码都是适用的。也就是说在对于所有的机器码都要进行这样的处理。
如图2所示,在本实施例中,上述步骤S13中还可以进一步包括如下步骤:
步骤S201对每一个指令查看是不是乘积累加类指令。如是,执行步骤S202;否则,执行步骤S204。
步骤S202对乘积累加类指令查看是否分配到累加器:在本步骤中判断乘积累加类指令是否分配到累加器,如是,执行步骤S204;否则,执行步骤S203,然后执行步骤S204。
步骤S203使用单独的乘和加指令实现,引入新的伪存储器存储中间结果:在本步骤中,由于acc没有分配到该乘积累加类指令中,所以,该指令没有办法通过一个指令实现。所以,需要通过单独的两个指令(分别是乘指令和加指令)进行两个运算而得到结果。在本步骤中,需要引入一个新的伪寄存器来存储两次运算的中间结果,例如,引入一个伪寄存器存储乘积,再将其作为被加数与加数进行加法运算,而得到最后的结果。
步骤S204看该指令有否从累加器读取数据,如有,执行步骤S205;如否,执行步骤S208。
步骤S205察看该指令设否拷贝指令;如是,执行步骤S206;如否,执行步骤S207。
步骤S206转换该指令为mvacc:在本步骤中,由于是从累加器中读出数据,所以将其转换为专用于取得累加器数据的指令mvacc执行;执行本步骤后,跳转到步骤S208执行。
步骤S207引入伪寄存器并在该指令前插入mvacc指令,然后用存储在伪寄存器中的操作数取代acc中的数值:在本步骤中,引入一个新的伪寄存器,并增加一条mvacc指令,之后,将acc中的数据利用mvacc指令送入该伪寄存器,然后用存储在伪寄存器中的操作数取代acc中的数值,即使用该取得数据的伪寄存器取代该acc,进行操作。这是因为acc无法用于普通的指令的操作码上。
步骤S208是否拷贝数据到累加器,如是,执行步骤S209;如否,执行步骤S210。
步骤S209转换该指令为initacc:在本步骤中,转换对累加器的操作为初始化累加器;指令initacc是一个专用于初始化累加器的指令,其消除累加器中原来的值,然后将需要拷贝的值送入该累加器。
步骤S210察看该普通指令(乘积累加类指令除外)是否把结果放在累加器上;如是,执行步骤S211。
步骤S211使用新的伪寄存器取代累加器并使累加器初始化:由于acc无法在普通指令中出现,所以,使用一个新的伪寄存器取代该累加器,跟着插入initacc始化该累加器。
值得一提的是,在图2中,为了便于叙述起见,步骤S201-S211具有一定的顺序。实际上,也可以将上述步骤分为几个组,每个组内部的步骤具有一定的顺序,而在组与组之间,可以是如上所述的顺序关系,也可以是并行的,还可以是与上述顺序不同的顺序。例如,一种分组的方法是:步骤S201,S202、S203是一组,步骤S208、S209,S210和S211是一组,步骤S204、S205,S206和S207是一组;这些组之间的可以是并列的或并行执行的,也可以是按照一定规律顺序执行的(可以不是上述的顺序)。
此外,在本实施例中,为了描述的方便及便于理解,在上述步骤中,某些步骤后没有后续的步骤,例如步骤S209、步骤S210和步骤S211。在实际操作中,这些步骤之后将进入下一个指令的分析(与图2中的步骤一致)。
总之,当寄存器分配通过后,需要遍历代码实施查找这些情况并对其做出必要的改进如下:对于一个没有分配到acc的MAC指令,分别执行MAC为独立的MUL和ADD指令,一个新的伪寄存器需要引入以便于存储MUL指令的中间结果;对于一个分配到acc为结果的普通指令,如果其是一个拷贝指令,转换这个指令为initacc;此外,引入一个伪寄存器替代该acc,并插入一个初始化acc的initacc;对于一个操作数是acc的拷贝指令,转换该指令到mvacc;如果指令中的操作数是acc,则在该指令之前引入一个伪寄存器并插入mvacc,之后,用新的伪寄存器的操作数取代acc的所有事件并代入该指令。
由于acc本质上不是通用寄存器,上述情况的后面3种是必须的。对于整个编译过程而言,initacc和mvacc需要在第一时间出现在程序序列中。
同时由于新的伪寄存器被引入,需要被在MAC优化分配物理寄存器之后,再次对新的伪寄存器进行寄存器分配。由于新的伪寄存器的用户均在本地(该伪寄存器是本地变量或本地参数),其分配较为容易。
值得一提的是,在本实施例上述例子中,使用的是a×b+c(对应于MADD指令)这一表达式对其方法进行说明,但是,这些例子并不表示该方法仅能用于这一表达式,使用该表达式仅仅是出于便于描述的考虑。实际上,在本实施例中使用的方法对于表达式a×b-c(对应于MSUB指令)、表达式-((a×b)+c)(对应于NMADD指令)、表达式-((a×b)-c)(对应于NMSUB指令)或其他类似的表达式是同样适用的。在用于这些表达式时,只需要要根据具体的表达式做出相应的运算即可。为了便于称呼,将现有技术中实现这些类似的表达式的指令称为乘加类指令。同时,由于在上述例中并没有限定累加器的数量,所以本实施例中的方法对于目标处理器具有多个累加器的情况也是适用的。
为了便于说明情况,在此列举几个实际例子如下:
例一、假设在使用C语言的源代码中,由如下表达式:f=a+b*c+d*e,在步骤S12中,首先被转换为:
temp1=MADD(b,c,a)
f=MADD(d,e,temp1)
然后,进行MADD-to-MAC转换,得到:
temp1=a
temp1=MAC(b,c,temp1)
f=temp1
f=mac(d,e,f)
当执行完寄存器分配步骤时,如下:
acc=a
acc=MAC(b,c,acc)
acc=acc
acc=MAC(d,e,acc)
f=acc
请注意,上述表达式中,acc被分配给temp1和f,同时,第三行的acc=acc是不必要的。
按照本实施例中的方法对其进行优化或改进,得到:
initacca(请参见步骤S208、S209)
macb,c
macd,e
mvaccf(请参见步骤S204、S205,S206)
例二、假设在使用C语言的源代码中,有如下表达式: ,在步骤S12中,首先被转换为:
c=MADD(a,b,c)
f=MADD(d,e,f)
c=MADD(g,h,c)
然后,进行MADD-to-MAC转换,得到:
c=MAC(a,b,c)
f=MAC(d,e,f)
c=MAC(g,h,c)
当执行完寄存器分配步骤时,如下(按照本实施例中的寄存器分配原则,c的优先级较高,故分配acc到c):
acc=c
acc=MAC(a,b,acc)
f=MAC(d,e,f)
acc=MAC(g,h,acc)
c=acc
请注意,在上述表达式中,由于没有累加器可用,其第二个MAC将被转换回两个单独的乘和加运算(请参见步骤S203)。
按照本实施例中的方法对其进行优化或改进,得到:
initaccc(请参见步骤S208、S209)
maca,b
multemp1,d,e(即temp1=d*e)
addf,temp1,f(即f=temp1+f)
macg,h
mvaccc(请参见步骤S204、S205,S206)
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (8)
1.一种在编译过程中改善乘加类指令执行性能的方法,其特征在于,包括如下步骤:
A)编译器对源代码进行编译,将源代码转换为内部表征;并优化所述内部表征;
B)产生基于目标处理器的机器码,对所述机器码中的伪寄存器分配物理寄存器;
C)分别对乘积累加类指令的寄存器分配进行改进,如果存在至少一个累加器空闲,则按照设定条件将至少一个空闲累加器分配给当前乘积累加类指令中的伪寄存器,使其使用所述累加器实行乘积累加;如果当前没有累加器空闲,则分配普通寄存器到当前乘积累加类指令,再使乘积累加类指令通过两个独立的运算实现;
其中,所述步骤A)中,在对所述源代码进行编译的中端阶段,将源代码中所有的两数相乘再与另一数相加的表达式均转换为乘加类指令形式;
所述步骤B)中进一步包括:将所有的乘加类指令通过增加一个拷贝指令的步骤,并将其转换为乘积累加类指令。
2.根据权利要求1所述的在编译过程中改善乘积累加类指令执行性能的方法,其特征在于,所述步骤B)中采用基于优先权的寄存器分配方法,按照当多个伪寄存器竞争有限数量个物理寄存器时,优先分配执行次数最多的伪寄存器以及当多个物理寄存器可以配置到一个伪寄存器时,优先采用性能收益最大的物理寄存器配置的方法为所述伪寄存器配置物理寄存器。
3.根据权利要求2所述的在编译过程中改善乘加类指令执行性能的方法,其特征在于,判读所述性能收益最大包括:判断伪寄存器是否出现在一个乘积累加类指令中,如否,为其配置普通物理寄存器;如是,且当前存在至少一个空闲的累加器,将累加器配置到该伪寄存器。
4.根据权利要求3所述的在编译过程中改善乘加类指令执行性能的方法,其特征在于,所述步骤C)进一步包括:
如果一个乘积累加类指令没有分派到累加器,引入一个新的伪寄存器存储中间结果,并分别执行所述乘积累加类指令源代码中的两个运算操作。
5.根据权利要求4所述的在编译过程中改善乘加类指令执行性能的方法,其特征在于,所述步骤C)进一步包括:在一个累加器被分配作为一个普通指令操作结果的情况下,如果该指令是拷贝指令,转换该指令为初始化累加器指令;否则,使用一个新的伪寄存器取代累加器,并插入一个初始化累加器指令,使用所述普通指令中的伪寄存器初始化累加器。
6.根据权利要求3所述的在编译过程中改善乘加类指令执行性能的方法,其特征在于,所述步骤C)进一步包括:当一个拷贝指令的操作数是累加器时,转换该指令为累加器数值移出指令。
7.根据权利要求3所述的在编译过程中改善乘加类指令执行性能的方法,其特征在于,所述步骤C)进一步包括:当指令中的操作数是累加器时,引入一个伪寄存器并在该指令之前插入一个将累加器数值移动到所述伪寄存器的累加器数值移出指令,然后在该指令中所有累加器出现的操作中使用所述伪寄存器代替累加器。
8.根据权利要求1-7任意一项所述的在编译过程中改善乘加类指令执行性能的方法,其特征在于,所述乘加类指令包括MADD指令、MSUB指令、NMADD指令或/和NMSUB指令。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310150714.6A CN103268223B (zh) | 2013-04-26 | 2013-04-26 | 在编译过程中改善乘加类指令执行性能的方法 |
US14/257,271 US9081561B2 (en) | 2013-04-26 | 2014-04-21 | Method for improving execution performance of multiply-add instruction during compiling |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310150714.6A CN103268223B (zh) | 2013-04-26 | 2013-04-26 | 在编译过程中改善乘加类指令执行性能的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103268223A CN103268223A (zh) | 2013-08-28 |
CN103268223B true CN103268223B (zh) | 2016-06-29 |
Family
ID=49011856
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310150714.6A Active CN103268223B (zh) | 2013-04-26 | 2013-04-26 | 在编译过程中改善乘加类指令执行性能的方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US9081561B2 (zh) |
CN (1) | CN103268223B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9329848B2 (en) * | 2013-03-27 | 2016-05-03 | Intel Corporation | Mechanism for facilitating dynamic and efficient fusion of computing instructions in software programs |
KR102545176B1 (ko) * | 2015-11-16 | 2023-06-19 | 삼성전자주식회사 | 레지스터 관리 방법 및 장치 |
CN110187882B (zh) * | 2019-05-17 | 2022-12-06 | 湖南科技大学 | 一种面向指令源操作数的寄存器对分配方法及存储介质 |
CN110187883B (zh) * | 2019-05-17 | 2022-12-06 | 湖南科技大学 | 一种面向指令目标操作数的寄存器对分配方法及存储介质 |
CN118069142B (zh) * | 2024-01-25 | 2024-10-22 | 龙芯中科技术股份有限公司 | 编译优化方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101196825A (zh) * | 2002-08-02 | 2008-06-11 | 松下电器产业株式会社 | 编译程序、编译程序装置和编译方法 |
CN102053817A (zh) * | 2009-10-30 | 2011-05-11 | Arm有限公司 | 用于执行乘法累加运算的设备和方法 |
US20120198212A1 (en) * | 2009-11-30 | 2012-08-02 | Martin Raubuch | Microprocessor and Method for Enhanced Precision Sum-of-Products Calculation on a Microprocessor |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6857061B1 (en) * | 2000-04-07 | 2005-02-15 | Nintendo Co., Ltd. | Method and apparatus for obtaining a scalar value directly from a vector register |
US7278137B1 (en) * | 2001-12-26 | 2007-10-02 | Arc International | Methods and apparatus for compiling instructions for a data processor |
US20050055394A1 (en) * | 2003-09-10 | 2005-03-10 | Worley John S. | Method and system for high performance, multiple-precision multiply-and-add operation |
US7774766B2 (en) * | 2005-09-29 | 2010-08-10 | Intel Corporation | Method and system for performing reassociation in software loops |
US20080005722A1 (en) * | 2006-06-28 | 2008-01-03 | Hidenori Matsuzaki | Compiling device, compiling method and recording medium |
US20080313438A1 (en) * | 2007-06-14 | 2008-12-18 | David Arnold Luick | Unified Cascaded Delayed Execution Pipeline for Fixed and Floating Point Instructions |
US8365156B2 (en) * | 2010-04-17 | 2013-01-29 | Microsoft Corporation | Intermediate language support for change resilience |
US8375373B2 (en) * | 2010-04-19 | 2013-02-12 | Microsoft Corporation | Intermediate language support for change resilience |
US8832671B1 (en) * | 2010-07-07 | 2014-09-09 | Nvidia Corporation | Conflict-free register allocation |
US8478969B2 (en) * | 2010-09-24 | 2013-07-02 | Intel Corporation | Performing a multiply-multiply-accumulate instruction |
US9405535B2 (en) * | 2012-11-29 | 2016-08-02 | International Business Machines Corporation | Floating point execution unit for calculating packed sum of absolute differences |
-
2013
- 2013-04-26 CN CN201310150714.6A patent/CN103268223B/zh active Active
-
2014
- 2014-04-21 US US14/257,271 patent/US9081561B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101196825A (zh) * | 2002-08-02 | 2008-06-11 | 松下电器产业株式会社 | 编译程序、编译程序装置和编译方法 |
CN102053817A (zh) * | 2009-10-30 | 2011-05-11 | Arm有限公司 | 用于执行乘法累加运算的设备和方法 |
US20120198212A1 (en) * | 2009-11-30 | 2012-08-02 | Martin Raubuch | Microprocessor and Method for Enhanced Precision Sum-of-Products Calculation on a Microprocessor |
Also Published As
Publication number | Publication date |
---|---|
US20140325190A1 (en) | 2014-10-30 |
CN103268223A (zh) | 2013-08-28 |
US9081561B2 (en) | 2015-07-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7840954B2 (en) | Compilation for a SIMD RISC processor | |
EP2951681B1 (en) | Solution to divergent branches in a simd core using hardware pointers | |
Phothilimthana et al. | Chlorophyll: Synthesis-aided compiler for low-power spatial architectures | |
US9009692B2 (en) | Minimizing register spills by using register moves | |
CN103268223B (zh) | 在编译过程中改善乘加类指令执行性能的方法 | |
US11720332B2 (en) | Compiling a program from a graph | |
US10430191B2 (en) | Methods and apparatus to compile instructions for a vector of instruction pointers processor architecture to enable speculative execution and avoid data corruption | |
US9830164B2 (en) | Hardware and software solutions to divergent branches in a parallel pipeline | |
US8539462B2 (en) | Method for allocating registers for a processor based on cycle information | |
JP5522283B1 (ja) | リストベクトル処理装置、リストベクトル処理方法、プログラム、コンパイラ、及び、情報処理装置 | |
US10353708B2 (en) | Strided loading of non-sequential memory locations by skipping memory locations between consecutive loads | |
US20180004515A1 (en) | Processor and control method of processor | |
US9158511B2 (en) | Scalable partial vectorization | |
US20220019531A1 (en) | Allocating Variables to Computer Memory | |
US7676799B1 (en) | Address simplification by binary transformation | |
US10606602B2 (en) | Electronic apparatus, processor and control method including a compiler scheduling instructions to reduce unused input ports | |
Tomiyama et al. | Automatic parameter optimization for edit distance algorithm on GPU | |
US20210042111A1 (en) | Efficient encoding of high fanout communications | |
JP2023002165A (ja) | コンパイラ及びコンパイル方法 | |
Yang et al. | A self-indexed register file for efficient arithmetical computing hardware | |
CN115910208A (zh) | 用于在加速史密斯-沃特曼序列对齐时存储子对齐数据的技术 | |
Artico | Performance Optimization Of GPU ELF-Codes | |
JP2008293169A (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 | ||
CP02 | Change in the address of a patent holder |
Address after: Unit 06-08, 7th Floor, Changhong Science and Technology Building, 18 Science and Technology South 12 Road, Nanshan District, Shenzhen City, Guangdong Province Patentee after: Shenzhen ICube Technology Corp. Address before: Room 706-8, Changhong Science and Technology Building, 18 No. 12 South Science and Technology Road, Nanshan District, Shenzhen City, Guangdong Province, 518057 Patentee before: Shenzhen ICube Technology Corp. |
|
CP02 | Change in the address of a patent holder |