CN116113927A - 用于函数调用中可重复使用和相对索引的寄存器资源分配的方法和装置 - Google Patents
用于函数调用中可重复使用和相对索引的寄存器资源分配的方法和装置 Download PDFInfo
- Publication number
- CN116113927A CN116113927A CN202180054297.8A CN202180054297A CN116113927A CN 116113927 A CN116113927 A CN 116113927A CN 202180054297 A CN202180054297 A CN 202180054297A CN 116113927 A CN116113927 A CN 116113927A
- Authority
- CN
- China
- Prior art keywords
- function
- ijk
- index
- calltarget
- rel
- 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
Links
Images
Classifications
-
- 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
- G06F8/4441—Reducing the execution time required by the program code
-
- 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/441—Register allocation; Assignment of physical memory space to logical memory space
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开的系统、装置和方法涉及通过编译器使用包括有限数量的寄存器的寄存器堆来优化模块中函数的寄存器资源分配。在所述模块中执行过程间分析后,所述编译器计算每个函数使用的寄存器的数量,并将所述函数编译到最终机器代码中,除了在检测到对另一个函数进行调用的调用点处之外。在每个调用点处,对于每个被调用函数,所述编译器在计算并设置供被调用函数用来在所述寄存器堆的可用部分中运行的相对索引后,将调用指令扩展到最终机器代码。所述相对索引通过在调用函数之前最小化溢出寄存器的数量来优化寄存器资源分配。
Description
相关申请
本发明要求于2020年9月4日提交的申请号为17/012,203、发明名称为“用于函数调用中可重复使用和相对索引的寄存器资源分配的方法和装置(METHOD AND APPARATUSFOR REUSABLE AND RELATIVE INDEXED REGISTER RESOURCE ALLOCATION IN FUNCTIONCALLS)”的在先提交的美国非临时申请的优先权,其内容在允许此类并入的司法管辖区内以引用的方式并入本申请中。
技术领域
本发明大体上涉及寄存器资源优化领域,尤其涉及一种用于优化函数调用中资源分配的方法和装置。
背景技术
处理器通常具有通用寄存器或寄存器堆,由处理线程共用,并在运行时进行分区。这些资源提供了非常快速地存取处理器的存储能力,但由于这些资源的硬件成本,资源数量有限。处理器还会使用更多较便宜的内存资源,例如,缓存和主存,但读/写性能也会慢得多。在处理过程中耗尽寄存器资源迫使处理器将寄存器中保存的值溢出到缓存和/或主存中。这种溢出对处理造成了很大的损失,而且在性能和能量两方面带来高成本,因此效率非常低。
对于函数调用,常规调用约定通常要求调用方和被调用方将活性寄存器溢出到堆栈中,并在被调用方返回后恢复活性寄存器。此类常规调用约定要求确定需要为调用方保存多少寄存器,需要将多少寄存器传递给被调用方,从而导致对可用寄存器堆进行分区,并导致大量溢出到其它内存资源。
这可能导致寄存器堆的利用率不足(即,尽管存在足够的寄存器来保存调用方和被调用方的实时数据,但数据往返堆栈存储/加载)。除此之外,处理器编程通常在可能的情况下使用内联(具有大的主函数和小的调用函数)。
例如,特定的计算环境可能会加剧此问题:使用图形处理单元(GraphicalProcessing Unit,GPU)进行光线跟踪处理的问题,其中,着色器管线使着色器之间的交互更加动态。着色器可以调用其它着色器,很像过程式编程中的间接方法调用。在此计算环境中,内联甚至不可能实现。
通常,所有函数/着色器寄存器资源分配请求都会在编译时解析和最终完成。这些请求被编码在生成的二进制中,因此一旦编译完成,寄存器资源分配是不可改变的。间接函数调用使寄存器资源分配在函数/着色器调用方和被调用方之间是动态的。
发明内容
本发明技术提供了一种寄存器分配方案,以使被调用方“重复使用”调用点处的空闲寄存器资源(动态调用的基本类别),这种分配方案是“相对”于调用方的。更具体地说,本发明技术使得编译器在调用(尤其是间接调用)中执行优化的动态寄存器资源分配。本发明技术通过动态资源重复使用和动态索引的资源访问,优化寄存器资源分配,例如,调用中的寄存器分配。本发明技术提出了一种新的机制,以基于每个调用点在编译时的实际资源使用分析,在运行时管理和优化寄存器资源分配,从而实现更加高效的资源利用率,并降低由于寄存器堆资源耗尽而因此溢出操作的概率。本发明技术为编译器提供了优化运行时代码的能力,所述运行时代码预期和处理寄存器资源耗尽,其中仅在资源实际上即将耗尽时,才会溢出该资源。
本发明技术使编译器能够执行寄存器资源数据流分析,以找到每个调用点处的资源重复使用模式。基于所述分析,编译器创建了自定义的分配映射和分配指针供被调用方使用,实现了调用方和一个或多个被调用方之间的优化、动态的分配方案。
本发明技术还提出了动态相对寄存器资源访问机制,以促进分配方案,其使编译器能够在运行时灵活地生成经过编译的代码的一个拷贝,以用于不同的分配场景。
因此,本发明技术的目标是提供一种通过利用空闲寄存器的可用性来优化函数对寄存器堆的使用的技术,以避免必须将寄存器中保存的值溢出到慢得多的缓存和/或主存。本文中公开的装置、方法和系统使得编译器在分析函数之间的调用交互之后,将相关索引传递到被调用函数,使得这些函数在必须从寄存器溢出值之前使用寄存器堆中的空闲寄存器。
根据此目标,本发明技术的一个方面提供了一种通过编译器使用包括多个(Nof_regfile)寄存器的寄存器堆来优化模块中函数Si(i>0)的寄存器资源分配的方法。所述方法包括:在所述模块中执行过程间分析;(i)计算所述函数Si使用的寄存器的数量Nof_regi;(ii)将所述函数Si编译到最终机器代码中,其中,如果所述编译器检测到对另一个函数Si的调用j,(j<>i),则所述编译器将调用指令保留为伪指令Callsiteij;所述方法还包括:对于每个Callsiteij,(i)将一个或多个被调用函数Sk(k<>i)确定为Calltargetijk;(ii)计算所述函数Si在Callsiteij处使用的活性寄存器的最大数量maxRegIndexij,并计算RegIndexForRelIndexij=maxRegIndexij+1。所述方法还包括:对于每个Callsiteij和每个Calltargetijk将所述调用指令扩展到所述最终机器代码,以:读取所述函数Si的相对索引Rel_Indexi的值,并计算所述函数Calltargetijk的总和Rel_Indexi+RegIndexForRelIndexij+Nof_regk;(ii)将所述计算到的总和与Nof_regfile进行比较,其中,如果所述计算到的总和小于或等于Nof_regfile,则计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;否则,计算并从所述寄存器堆中溢出寄存器,计算并设置关联的相对索引Rel_Indexijk,其中,所述相对索引解释说明所述溢出的寄存器,并传递到Callsiteij处的每个Calltargetijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;重复对所述模块中的所有函数Si进行计算、编译、确定、计算、读取、比较、计算和溢出和设置。
在所述方法的一些实施例中,所述函数Si是在图形处理单元(GraphicalProcessing Unit,GPU)中执行光线跟踪的着色器函数。
在所述方法的一些其它实施例中,所述在所述模块中执行过程间分析包括:对(i)所述函数Si之间的调用方-被调用方关系或(ii)函数Sk调用目标信息中的至少一个进行分析。
在所述方法的一些其它实施例中,所述编译器除了执行过程间分析之外,还使用画像信息。
在所述方法的一些其它实施例中,所述相对索引Rel_Indexijk是通过将所述相对索引写入Calltargetijk的寄存器R0来传递的。
在所述方法的一些其它实施例中,所述相对索引Rel_Indexijk是通过将所述相对索引写入不属于所述寄存器堆的处理器寄存器,并通过所述Calltargetijk在所述寄存器中提取所述相对索引来传递到Calltargetijk。
在所述方法的一些其它实施例中,当在所述模块中执行过程间分析包括对所述函数Si之间的调用方-被调用方关系进行分析时,所述计算供所述函数Si使用的寄存器的数量Nof_regi通过以下步骤执行:(i)计算所述函数Si中的每个叶子函数的Nof_regi;(ii)对于每个叶子函数,迭代地计算与所述叶子函数存在调用方-被调用方关系的所述函数Si中的沿调用链向上移动的每个函数的Nof_regi。
在所述方法的一些其它实施例中,当在所述模块中执行过程间分析包括对函数Sk调用目标信息进行分析时,所述计算供所述函数Si使用的寄存器的数量Nof_regi是按需执行的,如果Callsiteij的调用目标信息未知,则所述编译器返回Nof_regi作为Nof_regfile。
在所述方法的一些其它实施例中,在所述计算到的总和小于或等于Nof_regfile的情况下,所述计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk包括:将所述调用指令扩展到所述最终机器代码,以:(i)计算:Rel_Indexijk=R0+RegIndexForRelIndexij,其中,R0保存函数Si的Rel_Indexi;(ii)将所述值Rel_Indexijk存储在以RegIndexForRelIndexij为索引的存储器RRegIndexForRelIndexij中;(iii)设置:Rel_Indexk=RRegIndexForRelIndexij;(v)调用Sk;(v)计算:R0=R0–RRegIndexForRelIndexij;(vi)设置:Rel_Indexi=R0。
在所述方法的一些其它实施例中,在所述计算到的总和小于或等于Nof_regfile的情况下,所述计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk包括:将所述调用指令扩展到所述最终机器代码,以:(i)计算从所述寄存器堆溢出的寄存器的数量NSpillij:NSpillij=(Nof_regfile–(R0+RegIndexForRelIndexij+Nof_regk);(ii)设置:Rel_Indexi=Rel_Indexijk;(iii)溢出寄存器R0至RNSpillij–1;(iv)将Rel_Indexijk存储在R0中,并将(RegIndexForRelIndexij–NSpillij)存储在R1中;(v)调用Sk;(vi)计算:Rfree=R0+R1,并将Rfree存储在除了R0或R1之外的寄存器中;(vi)不溢出寄存器R0至RNSpillij–1;(vii)设置:设置Rel_Indexi=Rfree。
根据此目标,本发明技术的另一个方面提供了一种装置。所述装置包括处理器、包括多个(Nof_regfile)寄存器的寄存器堆和存储器,所述处理器运行编译器,所述编译器用于将包括函数S的模块编译到处理器可执行指令中,所述编译器还用于优化所述模块中函数Si(i>0)的寄存器资源分配,所述优化包括:在所述模块中执行过程间分析,(i)计算所述函数Si使用的寄存器的数量Nof_regi;(ii)将所述函数Si编译到处理器可执行指令中。所述优化还包括:如果所述编译器检测到对另一个函数Si的调用j(j<>i),则将调用指令保留为伪指令Callsiteij;对于每个Callsiteij,(i)将一个或多个被调用函数Sk(k<>i)确定为Calltargetijk;(ii)计算函数Si在Callsiteij处使用的活性寄存器的最大数量maxRegIndexij,并计算RegIndexForRelIndexij=maxRegIndexij+1。所述优化还包括:对于每个Callsiteij和每个Calltargetijk,将所述调用指令扩展到所述处理器可执行指令,以:(i)读取所述函数Si的相对索引Rel_Indexi的值,并计算所述函数Calltargetijk的总和Rel_Indexi+RegIndexForRelIndexij+Nof_regk;(ii)将所述计算到的总和与Nof_regfile进行比较,其中,如果所述计算到的总和小于或等于Nof_regfile,则计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;否则,计算并将寄存器从所述寄存器堆中溢出到所述存储器,计算并设置关联的相对索引Rel_Indexijk,其中,所述相对索引解释说明所述溢出的寄存器,并传递到Callsiteij处的每个Calltargetijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量。对所述模块中的所有函数Si重复进行计算、编译、确定、计算、读取、比较、计算和溢出和设置。
在所述装置的一些实施例中,所述处理器是图形处理单元(GraphicalProcessing Unit,GPU),所述函数Si是执行光线跟踪的着色器函数。
在所述装置的一些其它实施例中,所述相对索引Rel_Indexijk是通过将所述相对索引写入所述Calltargetijk的寄存器R0来传递的。
在所述装置的一些其它实施例中,所述相对索引Rel_Indexijk是通过将所述相对索引写入所述处理器中的不属于所述寄存器堆的寄存器,并通过Calltargetijk在所述寄存器中提取所述相对索引来传递到所述Calltargetijk。
根据此目标,本发明技术的又一方面提供了一种存储有计算机可执行指令的非瞬时性计算机可读介质。所述指令在由处理器执行时,使得所述处理器使用包括多个(Nof_regfile)寄存器的寄存器堆来优化模块中函数Si(i>0)的寄存器资源分配,所述优化包括:在所述模块中执行过程间分析;(i)计算所述函数Si使用的寄存器的数量Nof_regi;(ii)将所述函数Si编译到最终机器代码中,其中,如果所述编译器检测到对另一个函数Si的调用j(j<>i),则所述编译器将调用指令保留为伪指令Callsiteij。所述优化还包括:对于每个Callsiteij,(i)将一个或多个被调用函数Sk(k<>i)确定为Calltargetijk;(ii)计算函数Si在Callsiteij处使用的活性寄存器的最大数量maxRegIndexij,并计算RegIndexForRelIndexij=maxRegIndexij+1。所述优化还包括:对于每个Callsiteij和每个Calltargetijk,将所述调用指令扩展到所述最终机器代码,以:读取所述函数Si的相对索引Rel_Indexi的值,并计算所述函数Calltargetijk的总和Rel_Indexi+RegIndexForRelIndexij+Nof_regk;(ii)将所述计算到的总和与Nof_regfile进行比较,其中,如果所计算的总和小于或等于Nof_regfile,则计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;否则,计算并从所述寄存器堆中溢出寄存器,计算并设置关联的相对索引Rel_Indexijk,其中,所述索引解释说明所述溢出的寄存器,并传递到Callsiteij处的每个Calltargetijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;重复对所述模块的所有函数Si进行计算、编译、确定、计算、读取、比较、计算和溢出和设置。
在所述存储有计算机可执行指令的非瞬时性计算机可读介质的一些实施例中,所述在所述模块中执行过程间分析包括:对(i)函数Si之间的调用方-被调用方关系或(ii)函数Sk调用目标信息中的至少一个进行分析。
在所述存储有计算机可执行指令的非瞬时性计算机可读介质的又一些其它实施例中,所述编译器除了执行过程间分析之外,还使用画像信息。
在本描述的上下文中,表述“处理器”旨在包括单个专用处理器、单个共享处理器或其中的一些可被共用的多个单独处理器提供。在本发明技术的一些方面中,处理器可以是例如通用处理器,例如中央处理单元(Central Processing Unit,CPU),专用处理器,例如GPU,或在FPGA中实现的处理器。也可以包括其它常规的和/或定制的硬件。
附图说明
结合附图,通过以下详细描述,本发明的特征和优点将变得显而易见,在附图中:
图1示出了可以使用本发明技术优化的函数之间的调用;
图2示出了对可以使用本发明技术优化的函数进行调用的顶层函数;
图3示出了进行间接调用的顶层函数,其中,实际目标函数可以是可以使用本发明技术优化的几个函数中的一个函数;
图4描绘了根据本发明技术的编译器的方法步骤;
图5描绘了可以实现本文中描述的方法和过程步骤的计算系统。
应当理解,在所有附图和对应的描述中,相同的特征由相同的附图标记标识。此外,还应当理解,附图和以下的描述仅用于说明目的,并且这些公开内容并不旨在限制权利要求书的范围。
具体实施方式
本发明技术是在通用计算环境上下文中描述的,然而本领域技术人员应当了解,本文中的指导也适用于特定计算环境,例如GPU中的光线跟踪和着色器调用方和被调用方的计算环境,作为一种通过动态相对索引和重复使用资源来优化函数调用中寄存器资源分配的方法和系统。
对于正在编译的处理函数,例如调用函数(被调用方),可以参考分配映射和分配指针,以查找沿调用链向上的可重复使用的寄存器资源。为了访问编译主体内的寄存器资源,可使用资源的相对索引,其中,基本索引根据在调用点处传递的分配映射和分配指针动态地设置。本文中的“函数”定义了包括指令且由模块或函数库形成的软件处理元素,其中,编译器进行的“过程间分析”可以确定直接调用中的调用方/被调用方关系,而对于间接调用和给定调用方,可以确定具有关联的可能性或被调用%的可能被调用方的视图。在该技术的特定实施例中,除了过程间分析之外,还可以使用画像(profiling)信息。本文中的“调用(call)”、“被调用(called)”或“调用(calling)”可以与“调用(invoke)”、“被调用(invoked)”或“调用(invoking)”互换使用,是指使程序、函数、例程等执行的动作,而不存在影响本文中指导的一般性的技术差异。
运行时代码可以在每个调用点处生成,以检查寄存器资源耗尽,并对必要的溢出操作/非溢出操作执行最少指令。如果编译函数调用其它函数,则可以执行数据流分析,以确定每个调用点处潜在的可重复使用的寄存器资源。可以确定最大的连续空闲索引资源,这形成了可以传递到被调用函数(被调用方)的分配映射。被调用方可以使用相同的机制进行编译。
图1示出了可以使用本发明技术优化的函数之间的调用。本领域技术人员应当了解,使用的语言和表示是伪代码的语言和表示,不是特定于任何编程语言的,但反映了特定的架构。函数101调用(104)函数102,函数102反过来调用(105)函数103。一种举例说明的假设是,环境中的处理器可以使用寄存器堆100,包括64个寄存器,编号为R0至R63。
关于函数101,更多举例说明的假设包括:函数101(i)总共使用62个寄存器R0至R61(如106所示),(ii)在调用点处对函数102使用21个活性寄存器R0至R20,(iii)在R0中的值为“0”。本文中的“活性寄存器”定义了存储数据值的寄存器,该数据值是函数在已经调用低层函数后所需要的。
函数101包括使用R0到R20的多个指令。然后,在对函数102进行调用(104)之前,(i)从R0读取的值可以与值“21”(调用点处使用的活性寄存器的数量,编译器的常量(未示出),或可以直接在指令中编码的立即值)相加,并且结果可以存储在R21中(指令:R21=R0+21=21),(ii)特殊指令(设置Rel_Index=R21)可以将相对索引/偏移量传递到函数102,硬件可以使用该相对索引/偏移量来偏移函数102(如107所示)使用的寄存器相对于寄存器堆100的物理位置。
从函数102返回,可以从R0读取值,此时,R0仍是函数102使用的值为21的R0(因为相对索引仍是由上述指令设置的相对索引:设置Rel_Index=R21),并且可以从该值中减去“21”(调用点处使用的活性寄存器的数量)。相对索引实际上可以在调用104之前恢复到其值。然后,函数101可以使用R21至R61运行指令。
函数101使用的寄存器的数量Nof_reg101可以计算为“64”(寄存器堆100中的寄存器数量)与“62”(函数101使用的62个寄存器)和一个数量之间的最大值中的最小值,该数量取决于从函数101开始的调用链向下的函数所使用的寄存器,如下所述。
关于函数102,更多举例说明的假设包括:函数102(i)总共使用31个寄存器R0至R30(如107所示),(ii)在调用点处对函数103使用11个活性寄存器R0至R10。通过函数101中的设置Rel_Index=R21指令,R0的值可以为“21”。
函数102包括使用R0到R10的多个指令。然后,在对函数103进行调用(105)之前,(i)从R0读取的值可以与值“11”(调用点处使用的活性寄存器的数量,编译器的常量,或可以直接在指令中编码的立即值)相加,并且结果可以存储在R11中(指令:R11=R0+11=32),(ii)特殊指令(设置Rel_Index=R11)可以将相对索引/偏移量传递到函数103,硬件可以使用该相对索引/偏移量来偏移函数103(表示为108)使用的寄存器相对于寄存器堆100的物理位置。
从函数103返回,可以从R0读取值,此时,R0仍是函数103使用的值为11的R0(因为相对索引仍是由上述指令设置的相对索引:设置Rel_Index=R11),并且可以从该值中减去“11”(调用点处使用的活性寄存器的数量)。相对索引实际上可以在调用105之前恢复到其值。然后,函数102可以使用R11至R30运行指令。
函数102使用的寄存器数量Nof_reg102可以计算为“64”(寄存器堆100中的寄存器数量)与“31”(函数102使用的31个寄存器)和一个数量之间最大值中的最小值,该数量取决于从函数102开始的调用链向下的函数所使用的寄存器,如下所述。
关于函数103,更多举例说明的假设包括:函数103(i)总共使用27个寄存器R0至R26(如108所示),(ii)不调用沿调用链向下的任何其它函数。因此,函数103使用的寄存器的数量Nof_reg103可以计算为“27”,这反过来可以计算Nof_reg102和Nof_reg101。
因此,寄存器堆100中的物理寄存器R21至R61最适合由函数102和103使用。
图2示出了在包括64个寄存器的寄存器堆100的相同处理环境中,对可以使用本发明技术来优化的函数进行调用的顶层函数。
关于顶层函数201,举例说明的假设包括:顶层函数201(i)总共使用31个寄存器R0至R30(如204所示),(ii)在调用点处对函数202使用9个活性寄存器R0至R8,(iii)在R0中的值为“0”。关于被调用函数202,更多举例说明的假设有:被调用函数202总共使用62个寄存器R0至R61(如205所示)。
函数201包括使用R0到R8的多个指令。然后,在对函数202进行调用(203)中,编译器(未示出)可以进行过程间分析,并可以查看所有函数的寄存器需求,因此可以在顶层函数201中的调用点处了解到(i)函数202是唯一可能的调用目标,(ii)函数201需要9个活性寄存器,(iii)Nof_reg202=62。总和9+62=71大于寄存器堆100中可用寄存器的总数(Nof_reg100=64),因此,需要在调用203之前溢出7个寄存器。然后,顶层函数201运行时溢出检查可以是以下值之间的比较:
[Nof_live reg201+R0+Nof_reg202]与Nof_reg100
编译器可以在调用203之前动态地生成对7个寄存器R2至R8的溢出。可以溢出到缓存/内存206。
溢出的寄存器可以是紧接着最后一个活性寄存器R8之前的7个连续寄存器,即函数201可以溢出寄存器R2至R8。接下来,(i)从R0读取的值可以与值“9–7”(编译器的常量,或可以直接在指令中编码的立即值:调用点处使用的活性寄存器的数量减去溢出的寄存器的数量)相加,结果可以存储在溢出后成为下一个可用寄存器的地方,即R2(指令:R2=R0+(9–7)=2),(ii)特殊指令(设置Rel_Index=R2)可以将相对索引/偏移量传递到函数202,硬件可以使用该相对索引/偏移量来偏移函数202(如205所示)使用的寄存器相对于寄存器堆100的物理位置。
从函数202返回,可以从R0读取值,此时,R0仍是函数202使用的值为2的R0(因为相对索引仍是由上述指令设置的相对索引:设置Rel_Index=R2),并且可以从该值中减去“9–7”(调用点处使用的活性寄存器的数量减去溢出的寄存器的数量)。相对索引实际上可以在调用203之前恢复到其值。然后,函数201可以使用R9至R30运行指令。
函数201使用的寄存器数量Nof_reg201可以计算为“64”(寄存器堆100中的寄存器数量)与“9+62”(函数201使用的9个活性寄存器加上函数202使用的62个寄存器)和“31”(函数201使用的寄存器数量)之间的最大值中的最小值。
然后,编译器可以将寄存器R2到R8从缓存/内存206溢回寄存器堆100。这样,通过本发明技术,可以生成刚刚好的溢出/非溢出量。编译器可以检查调用点处失效的任何临时或本地寄存器的数量,并通过动态地设置被调用方的相对索引将这些寄存器重新用于被调用方。
图3示出了进行间接调用的顶层函数,其中,实际目标函数可以是几个函数中的一个函数。除非另有说明,通过图1和图2所示的假设,顶层函数301中的调用点可以具有两个可能的目标,并且可以对函数202进行间接调用302,或对函数102进行间接调用303。
关于顶层函数301,举例说明的假设包括:顶层函数301(i)总共使用35个寄存器R0至R34,(ii)在调用点处使用11个活性寄存器R0至R10以间接调用函数202或102中的一个函数,(iii)在R0中的值为“0”。关于潜在的被调用函数202和102,更多假设如图1和图2所示。
函数301包括使用R0到R10的多个指令。然后,在间接调用(302、303)之前,编译器(未示出)可以进行过程间分析,并可以查看:可以调用函数202或102,具有关联的可能性或被调用%,函数103可以被函数102调用,也可以查看所有函数的所有寄存器需求,因此,可以在顶层函数301中的调用点处了解到(i)函数301需要11个活性寄存器,(ii)Nof_reg202=62,(iii)Nof_reg102=38。
因此,编译器可以生成检查所有可能的调用目标函数的代码,并根据实际目标通过分别比较以下值来确定溢出寄存器的任何需要:对于调用302,比较[Nof_live reg301+R0+Nof_reg202]与Nof_reg100;对于调用303,比较[Nof_live reg301+R0+Nof_reg102]与Nof_reg100。
相应地,编译器可以生成代码,代码既溢出寄存器,又根据目标函数设置相对索引:
-如果目标是函数202,则总和[Nof_live reg301+R0+Nof_reg202]为11+0+62,大于寄存器堆100中的寄存器的数量;在这种情况下,需要溢出73–64=9个寄存器。编译器可以动态地生成对9个寄存器R2至R10的溢出。可以溢出到缓存/内存206。接下来,从R0读取的值可以与值“11–9”(编译器的常量,或可以直接在指令中编码的立即值:调用点处使用的活性寄存器的数量减去溢出的寄存器的数量)相加,结果可以存储在溢出后成为下一个可用寄存器的地方,即R2(指令:R2=R0+(11–9)=2),(ii)特殊指令(设置Rel_Index=R2)可以将相对索引/偏移量传递到函数202(如果被调用),硬件可以使用该相对索引/偏移量来偏移函数202使用的寄存器相对于寄存器堆100的物理位置;
-如果目标是函数102,则总和[Nof_live reg301+R0+Nof_reg102]为11+0+38,小于寄存器堆100中的寄存器的数量;在这种情况下,不需要溢出寄存器。接下来,(i)值“11”(调用点处使用的活性寄存器的数量,编译器的常量,或可以直接在指令中编码的立即值)可以在R11中输入,(ii)特殊指令(设置Rel_Index=R11)可以将相对索引/偏移量传递到函数102(如果被调用),硬件可以使用该相对索引/偏移量来偏移函数102使用的寄存器相对于寄存器堆100的物理位置。
因此,编译器可以根据实际目标及其寄存器的使用溢出寄存器,并且仅溢出最小数量的寄存器。优化溢出,并根据目标调整最佳溢出代码。
从间接调用返回,
-如果从函数202返回,则可以从R0读取值,此时,R0仍是函数202使用的值为2的R0(因为相对索引仍是由上述指令设置的相对索引:设置Rel_Index=R2),并且可以从该值中减去“11–9”(调用点处使用的活性寄存器的数量减去溢出的寄存器的数量)。相对索引实际上可以在调用302之前恢复到其值。然后,编译器可以将寄存器R2到R10从缓存/内存206溢回寄存器堆100;
-如果从函数102返回,则可以从R0读取值,此时,R0仍是函数102使用的值为11的R0(因为相对索引仍是由上述指令设置的相对索引:设置Rel_Index=R11),并且可以从该值中减去“11”(调用点处使用的活性寄存器的数量)。相对索引实际上可以在调用303之前恢复到其值;
-然后,函数301可以运行使用R11至R34的指令。
这样,通过本发明技术,可以生成刚刚好的溢出量。
在上述示例和附图中,假设函数101、201和301在R0中的值为“0”,表示函数101、201和301分别是顶层函数。一般而言,假设在给定函数的编译时,编译器可以通过过程间分析等,为每个分析函数了解R0的值,或了解该函数的相对索引,或了解该函数的层(顶层或其它层)。然而,可能存在这样的情况,在编译时,编译器可能无法访问或推断出上述信息。
图4描绘了以下通用情况下的根据本发明技术的编译器(未示出)的方法步骤:被分析函数的编译器不能访问上述信息,尤其是不能在编译时确定函数的R0的值是“0”(顶层函数的情况),或更一般地是不能确定R0中相对索引的值(被调用函数的情况)。硬件环境是包括有限数量(Nof_regfile)的寄存器的寄存器堆100的硬件环境。
在步骤401中,编译器可以在模块内执行过程间分析,并且对于模块中的所有函数Si,(i)计算函数Si使用的寄存器的对应数量Nof_regi,(ii)将函数Si编译到最终机器代码中,除以下情况之外:如果编译器在函数Si中检测到对另一个函数的调用j,则编译器将对应的调用指令保留为伪指令(Callsiteij),以在后面的步骤中扩展到最终机器代码。
对于叶子函数,即无调用的函数,Nof_regi只是该函数使用的最大寄存器索引+1。例如,如果叶子函数f使用寄存器R0至R35,则Nof_regf=35+1=36。对于非叶子函数n和n中的每个调用点c,RegIndexc可以计算为maxRegIndexnc+1,其中,maxRegIndexnc是非叶子函数n在调用点c处使用的最大寄存器索引。对于n中的每个调用点c和c的每个调用目标t,编译器可以将t所需的寄存器的数量计算为:Nof_regtc=RegIndexc+Nof_regt。Nof_regn定义为min(Nof_regfile,max(Nof_regtc,RegIndexn)。
在本发明技术的一个实施例中,编译器可以利用过程间分析以一定顺序计算函数的Nof_regi;例如,通过首先计算叶子函数,并迭代地沿调用链向上移动到调用方-被调用方关系图中的调用方函数。在另一个实施例中,编译器可以按需计算Nof_regi,并参考过程间分析结果以获得调用目标。如果Callsiteij的调用目标信息未知,则编译器可以简单地返回Nof_regfile作为保守估计。
在步骤402中,对于每个函数Si和每个Callsiteij,编译器根据对(i)函数调用方-被调用方关系和/或(ii)函数调用目标信息的分析,将除Si之外的一个或多个被调用函数确定为Calltargetijk。
在步骤403中,对于每个函数Si和每个遇到的Callsiteij,编译器计算Callsiteij处的活性寄存器的最大数量maxRegIndexij。该最大数量是从函数Si开始到Callsiteij的任何执行路径上的最大寄存器索引。例如,在图1中,函数106的最大寄存器索引是R20。编译器进一步计算RegIndexForRelIndexij:RegIndexForRelIndexij=maxRegIndexij+1。
在步骤404处,对于每个函数Si、每个遇到的Callsiteij和每个遇到的Calltargetijk,编译器扩展伪调用指令并为函数Si生成运行时指令,以:(i)读取函数Si的相对索引Rel_Indexi在R0中的值,(ii)计算以下各项的总和:RegIndexForRelIndexij、Rel_Indexi和函数Calltargetijk使用的寄存器Nof_regk的数量。
在步骤405中,对于每个函数Si、每个遇到的Callsiteij和每个遇到的Calltargetijk,编译器生成运行时指令,以将在步骤404中计算到的总和与寄存器堆100中的寄存器总数Nof_regfile进行比较。
在步骤406中,如果在步骤404中计算到的总和小于或等于寄存器堆100中的寄存器总数Nof_regfile,则编译器使用运行时指令扩展伪调用指令,以计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk,以供函数Calltargetijk用作通过寄存器堆100的可用部分来运行的寄存器偏移量。
在上述技术的一个实施例中,这可以通过执行以下操作的运行时指令来实现:(i)计算:Rel_Indexijk=R0+RegIndexForRelIndexij,其中,R0保存函数Si的Rel_Indexi;(ii)将值Rel_Indexijk存储在以RegIndexForRelIndexij为索引的寄存器RRegIndexForRelIndexij中;如果需要,可以在RRegIndexForRelIndexij+1、RRegIndexForRelIndexij+2等中设置其它参数;(iii)生成指令:设置Rel_Indexk=RRegIndexForRelIndexij,以对Sk设置新的相对索引,(iv)生成调用指令,(v)生成指令:R0=R0–RRegIndexForRelIndexij,以将R0值重置回Si的先前值,生成指令:设置Rel_Indexi=R0,以重置Si的相对索引。
在步骤407中,如果在步骤404中计算到的总和大于寄存器堆100中的寄存器总数Nof_regfile,则编译器使用函数Si的运行时指令来扩展伪调用指令,以计算并从寄存器堆100中溢出多个寄存器,调用Calltargetijk,即计算并设置关联的相对索引Rel_Indexijk,其中,该相对索引解释说明这些溢出的寄存器,并传递到Callsiteij处的每个Calltargetijk,以供Calltargetijk用作通过寄存器堆100的可用部分来运行的寄存器偏移量。
在上述技术的一个实施例中,这可以通过执行以下操作的运行时指令来实现:(i)生成指令,以计算从寄存器堆100溢出的寄存器数量NSpillij和关联的相对索引Rel_Indexijk,其中,该相对索引传递到Callsiteij处的Calltargetijk,以供Calltargetijk用作通过寄存器堆100的可用部分来运行的寄存器偏移量。NSpillij=(Nof_regfile–(R0+RegIndexForRelIndexij+Nof_regk);(ii)生成保存NSpillij个寄存器的溢出指令,首先生成指令:设置Rel_Indexi=Rel_Indexijk以先调整相对索引,然后溢出R0、R1至RNSpillij–1;(iii)生成将值Rel_Indexijk存储在R0中的指令,并将值(RegIndexForRelIndexij–NSpillij)存储在R1中。R1中的值可以用作附加参数,以表示被调用方的相对索引与调用方的相对索引相比是如何移位的,(iv)生成调用指令,(v)生成指令:Rfree=R0+R1,以计算Rel_Indexi并将其保存在空闲寄存器中,因为R0和R1在非溢出后被覆写,(vi)生成从R0处索引的寄存器开始恢复NSpillij个寄存器的非溢出指令,(vii)生成指令:设置Rel_Indexi=Rfree,以将Si的相对索引重置为Rel_Indexi。
关于上述(i),NSpillij是运行时值,其可能大于RegIndexForRelIndexij。这表示除了将Callsiteij处的所有活性寄存器保存在Si中外,还可以保存沿调用链向上的一些活性寄存器。因此,待溢出的寄存器范围可以从NSpillij个寄存器的以Rel_Indexijk=(R0+RegIndexForRelIndexij–NSpillij)为索引的物理寄存器开始。
在给定函数的编译时,编译器已经通过过程间分析等,为每个分析函数了解R0的值,或了解该函数的相对索引,或了解该函数的层(顶层或其它层),则在上述步骤中检查溢出等某种计算可以在编译时而不是运行时使用编译器生成的指令来执行。在图1中,例如,如果编译器知道R0保存某个值或具有上限的信息,则步骤405中的检查可以在编译时执行。如果检查表示不会发生溢出,则编译器不会生成任何溢出指令
上述方法步骤和过程步骤以及编译器(未示出)可以在计算系统中实现,其示例不存在限制,可以结合图5找到。本领域技术人员将了解,这种计算系统可以在任何其它合适的硬件、软件和/或固件或它们的组合中实现,并且可以是单个物理实体,或者是具有分布式功能的多个单独的物理实体。
在本发明技术的一些方面中,计算系统500可以包括各种硬件组件,包括由处理器501、固态驱动器502、存储器503和输入/输出接口504统一表示的一个或多个单核处理器或多核处理器。在此上下文中,处理器501可以或可以不包括在FPGA中。在一些其它方面中,计算系统500可以是“现成的”通用计算系统。在一些方面中,计算系统500还可以分布在多个系统之间。计算系统500还可以专门用于本发明技术的实现。本发明技术的本领域技术人员可以了解,在不脱离本发明技术的范围的情况下,可设想关于如何实现计算机系统500的多种变化。
处理器501可以包括寄存器堆100。在一些方面中,寄存器堆100还可以包括在存储器503中,或分布在多个系统之间。
计算系统500中的各种组件之间的通信可以通过一个或多个内部和/或外部总线505(例如,PCI总线、通用串行总线、IEEE 1394“火线”总线、SCSI总线、串行-ATA总线、ARINC总线等)来实现,各种硬件组件电耦合到这些总线。
输入/输出接口504可以实现使能网络能力,例如有线接入或无线接入。例如,输入/输出接口504可以包括网络接口,例如但不限于网络端口、网络套接字、网络接口控制器等。网络接口可以如何实现的多个示例对于本发明技术的技术人员来说是显而易见。根据本发明技术的实现方式,固态驱动器502可以存储程序指令,如例如适合于加载到存储器503中并由处理器501执行的库、应用等的那些部分,用于执行根据本发明技术的方法步骤和过程步骤。
存储器503可以包括缓存/内存206。在一些方面中,缓存/内存206还可以包括在处理器501中,或分布在多个系统之间。
在此环境中,每个函数Si根据情况使用调用函数在其寄存器R0中传递的自己的相对索引执行,作为用于通过寄存器堆100的可用部分运行的寄存器偏移量。在本发明技术的一个实施例中,执行设置Rel_Index指令的后果是,相对索引的值可以存储在不属于寄存器堆100的硬件寄存器中。当前活动的相对索引可以经由此硬件寄存器读取。在这种实施例中,不需要将当前相对索引作为R0中的参数传递,因为其可以始终从硬件寄存器中读取。
应当理解,所公开的方法和装置的操作和功能可以通过基于硬件的元件、基于软件的元件、基于固件的元件和/或它们的组合来实现。此类操作替代方案并不以任何方式限制本发明的范围。
还应理解,尽管本文提出的发明概念和原理已经参考特定的特征、结构和实施例描述,但很明显,可以在不脱离这些公开内容的情况下进行各种修改和组合。因此,说明书和附图被简单地视为由所附权利要求所定义的发明概念和原理的说明,并被设想涵盖属于本发明范围的任何和所有修改、变化、组合或等同物。
Claims (17)
1.一种通过编译器使用包括多个(Nof_regfile)寄存器的寄存器堆来优化模块中函数Si(i>0)的寄存器资源分配的方法,其特征在于,所述方法包括:
在所述模块中执行过程间分析;
计算所述函数Si使用的寄存器的数量Nof_regi;
将所述函数Si编译到最终机器代码中,其中,如果所述编译器检测到对另一个函数Si的调用j(j<>i),则所述编译器将调用指令保留为伪指令Callsiteij;
对于每个Callsiteij,
将一个或多个被调用函数Sk(k<>i)确定为Calltargetijk;
计算所述函数Si在Callsiteij处使用的活性寄存器的最大数量maxRegIndexij,并计算RegIndexForRelIndexij=maxRegIndexij+1;
对于每个Callsiteij和每个Calltargetijk,将所述调用指令扩展到所述最终机器代码,以:
读取所述函数Si的相对索引Rel_Indexi的值,并计算所述函数Calltargetijk的总和Rel_Indexi+RegIndexForRelIndexij+Nof_regk;
将所述计算到的总和与Nof_regfile进行比较,其中,
如果所述计算到的总和小于或等于Nof_regfile,则计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;
否则,计算并从所述寄存器堆中溢出寄存器,计算并设置关联的相对索引Rel_Indexijk,其中,所述相对索引解释说明所述溢出的寄存器,并传递到Callsiteij处的每个Calltargetijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;
重复对所述模块中的所有函数Si进行计算、编译、确定、计算、读取、比较、计算和溢出和设置。
2.根据权利要求1所述的方法,其特征在于,所述函数Si是在图形处理单元(GraphicalProcessing Unit,GPU)中执行光线跟踪的着色器函数。
3.根据权利要求1或2所述的方法,其特征在于,所述在所述模块中执行过程间分析包括:对(i)函数Si之间的调用方-被调用方关系或(ii)函数Sk调用目标信息中的至少一个进行分析。
4.根据权利要求1至3中任一项所述的方法,其特征在于,所述编译器除了执行过程间分析之外,还使用画像信息。
5.根据权利要求1至4中任一项所述的方法,其特征在于,所述相对索引Rel_Indexijk是通过将所述相对索引写入Calltargetijk的寄存器R0来传递的。
6.根据权利要求1至5中任一项所述的方法,其特征在于,所述相对索引Rel_Indexijk是通过将所述相对索引写入不属于所述寄存器堆的处理器寄存器,并通过Calltargetijk在所述寄存器中提取所述相对索引来传递到Calltargetijk。
7.根据权利要求3所述的方法,其特征在于,当在所述模块中执行过程间分析包括对所述函数Si之间的调用方-被调用方关系进行分析时,所述计算所述函数Si使用的寄存器的数量Nof_regi通过以下步骤执行:
计算所述函数Si中的每个叶子函数的Nof_regi;
对于每个叶子函数,迭代地计算与所述叶子函数存在调用方-被调用方关系的所述函数Si中的沿调用链向上移动的每个函数的Nof_regi。
8.根据权利要求3所述的方法,其特征在于,当在所述模块中执行过程间分析包括对函数Sk调用目标信息进行分析时,所述计算所述函数Si使用的寄存器的数量Nof_regi是按需执行的,如果Callsiteij的调用目标信息未知,则所述编译器返回Nof_regi作为Nof_regfile。
9.根据权利要求1至8中任一项所述的方法,其特征在于,在所述计算到的总和小于或等于Nof_regfile的情况下,所述计算并设置传递到所述Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk包括:将所述调用指令扩展到所述最终机器代码,以:
计算:Rel_Indexijk=R0+RegIndexForRelIndexij,其中,R0保存函数Si的Rel_Indexi;
将所述值Rel_Indexijk存储在以RegIndexForRelIndexij为索引的寄存器RRegIndexForRelIndexij中;
设置:Rel_Indexk=RRegIndexForRelIndexij;
调用Sk;
计算:R0=R0–RRegIndexForRelIndexij;
设置:Rel_Indexi=R0。
10.根据权利要求1至9中任一项所述的方法,其特征在于,在所述计算到的总和大于Nof_regfile的情况下,所述计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk包括:将所述调用指令扩展到所述最终机器代码,以:
计算从所述寄存器堆溢出的寄存器的数量NSpillij:NSpillij=(Nof_regfile–(R0+RegIndexForRelIndexij+Nof_regk);
设置:Rel_Indexi=Rel_Indexijk;
溢出寄存器R0至RNSpillij–1;
将Rel_Indexijk存储在R0中,并将(RegIndexForRelIndexij–NSpillij)存储在R1中;
调用Sk;
计算:Rfree=R0+R1,并将Rfree存储在除R0或R1之外的寄存器中;
不溢出寄存器R0至RNSpillij–1;
设置:设置Rel_Indexi=Rfree。
11.一种装置,其特征在于,所述装置包括处理器、包括多个(Nof_regfile)寄存器的寄存器堆和存储器,所述处理器运行编译器,所述编译器用于将包括函数S的模块编译到处理器可执行指令中,所述编译器还用于优化所述模块中函数Si(i>0)的寄存器资源分配,所述优化包括:
在所述模块中执行过程间分析;
计算所述函数Si使用的寄存器的数量Nof_regi;
将所述函数Si编译到处理器可执行指令中,其中,如果所述编译器检测到对另一个函数Si的调用j(j<>i),则所述编译器将调用指令保留为伪指令Callsiteij;
对于每个Callsiteij,
将一个或多个被调用函数Sk(k<>i)确定为Calltargetijk;
计算函数Si在Callsiteij处使用的活性寄存器的最大数量maxRegIndexij,并计算RegIndexForRelIndexij=maxRegIndexij+1;
对于每个Callsiteij和每个Calltargetijk,将所述调用指令扩展到所述处理器可执行指令,以:
读取所述函数Si的相对索引Rel_Indexi的值,并计算所述函数Calltargetijk的总和Rel_Indexi+RegIndexForRelIndexij+Nof_regk;
将所述计算到的总和与Nof_regfile进行比较,其中,
如果所述计算到的总和小于或等于Nof_regfile,则计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;
否则,计算并将寄存器从所述寄存器堆中溢出到所述存储器,计算并设置关联的相对索引Rel_Indexijk,其中,所述相对索引解释说明所述溢出的寄存器,并传递到Callsiteij处的每个Calltargetijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;
重复对所述模块中的所有函数Si进行计算、编译、确定、计算、读取、比较、计算和溢出和设置。
12.根据权利要求11所述的装置,其特征在于,所述处理器是图形处理单元(GraphicalProcessing Unit,GPU),所述函数Si是执行光线跟踪的着色器函数。
13.根据权利要求11或12所述的装置,其特征在于,所述相对索引Rel_Indexijk是通过将所述相对索引写入Calltargetijk的寄存器R0来传递的。
14.根据权利要求11至13中任一项所述的装置,其特征在于,所述相对索引Rel_Indexijk是通过将所述相对索引写入所述处理器中的不属于所述寄存器堆的寄存器,并通过Calltargetijk在所述寄存器中提取所述相对索引来传递到Calltargetijk。
15.一种存储有计算机可执行指令的非瞬时性计算机可读介质,其特征在于,所述指令在由处理器执行时,使得所述处理器使用包括多个(Nof_regfile)寄存器的寄存器堆来优化模块中函数Si(i>0)的寄存器资源分配,所述优化包括:
在所述模块中执行过程间分析;
计算所述函数Si使用的寄存器的数量Nof_regi;
将所述函数Si编译到最终机器代码中,其中,如果所述编译器检测到对另一个函数Si的调用j(j<>i),则所述编译器将调用指令保留为伪指令Callsiteij;
对于每个Callsiteij,
将一个或多个被调用函数Sk(k<>i)确定为Calltargetijk;
计算函数Si在Callsiteij处使用的活性寄存器的最大数量maxRegIndexij,并计算RegIndexForRelIndexij=maxRegIndexij+1;
对于每个Callsiteij和每个Calltargetijk,将所述调用指令扩展到所述最终机器代码,以:
读取所述函数Si的相对索引Rel_Indexi的值,并计算所述函数Calltargetijk的总和Rel_Indexi+RegIndexForRelIndexij+Nof_regk;
将所述计算到的总和与Nof_regfile进行比较,其中,
如果所述计算的总和小于或等于Nof_regfile,则计算并设置传递到Callsiteij处的每个Calltargetijk的相对索引Rel_Indexijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;
否则,计算并从所述寄存器堆中溢出寄存器,计算并设置关联的相对索引Rel_Indexijk,其中,所述相对索引解释说明所述溢出的寄存器,并传递到Callsiteij处的每个Calltargetijk,以供Calltargetijk用作通过所述寄存器堆的可用部分来运行的寄存器偏移量;
重复对所述模块中的所有函数Si进行计算、编译、确定、计算、读取、比较、计算和溢出和设置。
16.根据权利要求15所述的非瞬时性计算机可读介质,其特征在于,所述在所述模块中执行过程间分析包括:对(i)函数Si之间的调用方-被调用方关系或(ii)函数Sk调用目标信息中的至少一个进行分析。
17.根据权利要求15或16所述的非瞬时性计算机可读介质,其特征在于,所述编译器除了执行过程间分析之外,还使用画像信息。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17/012,203 US11188315B1 (en) | 2020-09-04 | 2020-09-04 | Method and apparatus for reusable and relative indexed register resource allocation in function calls |
US17/012,203 | 2020-09-04 | ||
PCT/CN2021/094790 WO2022048191A1 (en) | 2020-09-04 | 2021-05-20 | Method and apparatus for reusable and relative indexed register resource allocation in function calls |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116113927A true CN116113927A (zh) | 2023-05-12 |
Family
ID=78767820
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202180054297.8A Pending CN116113927A (zh) | 2020-09-04 | 2021-05-20 | 用于函数调用中可重复使用和相对索引的寄存器资源分配的方法和装置 |
Country Status (3)
Country | Link |
---|---|
US (1) | US11188315B1 (zh) |
CN (1) | CN116113927A (zh) |
WO (1) | WO2022048191A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118113486A (zh) * | 2024-04-30 | 2024-05-31 | 北京麟卓信息科技有限公司 | 一种gpu线程最大可用寄存器数量的快速测算方法 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11783528B2 (en) | 2021-12-21 | 2023-10-10 | Huawei Technologies Co., Ltd. | Method and apparatus for supporting an image rendering using ray tracing |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7207032B1 (en) | 2003-03-28 | 2007-04-17 | Applied Micro Circuits Corporation | Expanding a software program by insertion of statements |
US7530062B2 (en) * | 2003-05-23 | 2009-05-05 | Microsoft Corporation | Optimizing compiler transforms for a high level shader language |
US8375373B2 (en) | 2010-04-19 | 2013-02-12 | Microsoft Corporation | Intermediate language support for change resilience |
US9569369B2 (en) | 2011-10-27 | 2017-02-14 | Oracle International Corporation | Software translation lookaside buffer for persistent pointer management |
US8893104B2 (en) | 2012-01-26 | 2014-11-18 | Qualcomm Incorporated | Method and apparatus for register spill minimization |
US9612811B2 (en) * | 2014-01-21 | 2017-04-04 | Nvidia Corporation | Confluence analysis and loop fast-forwarding for improving SIMD execution efficiency |
US10242419B2 (en) * | 2015-09-02 | 2019-03-26 | Intel Corporation | Compiler optimization to reduce the control flow divergence |
US10025569B2 (en) * | 2016-07-19 | 2018-07-17 | Texas Instruments Incorporated | Linear-time algorithm to determine the maximum number of iterations of the iterative algorithm for data-flow analysis for reducible loops |
-
2020
- 2020-09-04 US US17/012,203 patent/US11188315B1/en active Active
-
2021
- 2021-05-20 CN CN202180054297.8A patent/CN116113927A/zh active Pending
- 2021-05-20 WO PCT/CN2021/094790 patent/WO2022048191A1/en active Application Filing
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118113486A (zh) * | 2024-04-30 | 2024-05-31 | 北京麟卓信息科技有限公司 | 一种gpu线程最大可用寄存器数量的快速测算方法 |
Also Published As
Publication number | Publication date |
---|---|
US11188315B1 (en) | 2021-11-30 |
WO2022048191A1 (en) | 2022-03-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8443343B2 (en) | Context-sensitive slicing for dynamically parallelizing binary programs | |
Lattner et al. | Making context-sensitive points-to analysis with heap cloning practical for the real world | |
US9250938B2 (en) | Caching runtime generated code | |
US8473935B2 (en) | Just-ahead-of-time compilation | |
US9104449B2 (en) | Optimized execution of dynamic languages | |
RU2658190C2 (ru) | Управление доступом во время выполнения к интерфейсам прикладного программирования | |
US9280350B2 (en) | Methods and apparatus to perform adaptive pre-fetch operations in managed runtime environments | |
CN109154908B (zh) | 具有精确垃圾收集报告的动态大小的局部 | |
CN108205469B (zh) | 一种基于MapReduce的资源分配方法及服务器 | |
CN116113927A (zh) | 用于函数调用中可重复使用和相对索引的寄存器资源分配的方法和装置 | |
US10761821B1 (en) | Object oriented programming model for graphics processing units (GPUS) | |
US20120227056A1 (en) | Method and system for enabling access to functionality provided by resources outside of an operating system environment | |
CN111459691A (zh) | 共享内存的读写方法及装置 | |
EP1990724A1 (en) | Method for locating resource leaks during software development | |
US10496433B2 (en) | Modification of context saving functions | |
WO2021098257A1 (zh) | 一种基于异构计算平台的业务处理方法 | |
CN115705294B (zh) | 用于获取函数调用信息的方法、装置、电子设备和介质 | |
US20060048148A1 (en) | Time measurement | |
CN113296837A (zh) | 资源计算方法、装置、电子设备及可读存储介质 | |
US20130166887A1 (en) | Data processing apparatus and data processing method | |
CN114428653B (zh) | 使用不同编译设置的代码的即时jit编译实例 | |
US11119743B1 (en) | Build time optimization using thread object variables | |
Yarza et al. | Static/dynamic real-time legacy software migration: a comparative analysis | |
Cherubin et al. | Stack size estimation on machine-independent intermediate code for OpenCL kernels | |
CN117112138A (zh) | 一种指针偏移获取方法、系统、设备及存储介质 |
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 |