一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

计算程序中数据依赖关系的方法及计算机可读存储介质与流程

2021-12-03 23:20:00 来源:中国专利 TAG:


1.本公开一般地涉及计算机领域。更具体地,本公开涉及计算程序中数据依赖关系的方法及计算机可读存储介质。


背景技术:

2.精确的数据流分析是让编译优化能高效进行的基础,静态单赋值(static single assignment,ssa)形式就是一种高效的数据流分析技术,目前几乎可以应用于所有的现代编译器。静态单赋值形式是一种中介码(intermediate representation,ir),每个变量仅被赋值一次,使得其使用定值链(use-define chain)非常明确,能帮助简化编译器的算法。
3.当一个内存区间可能会由多条指令来定值时,现有技术难以分析指令之间的数据依赖关系,使得编译过程无法有效简化,导致运算资源的浪费,因此一种新的方法来分析内存之间的数据依赖关系是迫切需要的。


技术实现要素:

4.为了至少部分地解决背景技术中提到的技术问题,本公开的方案提供了一种计算程序中数据依赖关系的方法及计算机可读存储介质。
5.在一个方面中,本公开揭露一种计算程序中数据依赖关系的方法,所述方法包括:将所述程序建构成静态单赋值形式的控制流图,所述控制流图包括多个节点;设定所述多个节点的内存描述符的初始信息,所述初始信息为直接支配节点的所有内存描述符的定值信息及kill集信息;以及基于所述控制流图进行迭代,每次迭代执行下列步骤:遍历所述多个节点,计算并更新每个节点的内存描述符的定值信息及kill集信息,并更新指令的数据依赖关系。其中所述指令的数据依赖关系用于指令编译优化时的参考信息。
6.在另一个方面,本公开揭露一种计算机可读存储介质,其上存储有计算程序中数据依赖关系的计算机程序代码,当所述计算机程序代码由处理器运行时,执行前述的方法。
7.本公开通过编译器对每一条指令或中介码定值的内存区间和使用的内存区间进行分析,计算各指令之间的数据依赖关系,同时对于有定值-使用关系的指令,建立定值-使用链和使用-定值链,以简化内存之间的数据依赖关系,加速图像、语音、文本数据的计算。
附图说明
8.通过参考附图阅读下文的详细描述,本公开示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施方式,并且相同或对应的标号表示相同或对应的部分其中:
9.图1a示出示例性的源代码及控制流图;
10.图1b示出等价的静态单赋值形式及控制流图;
11.图2示出示例性的控制流图;
12.图3示出本公开实施例的流程图;
13.图4示出本公开另一个实施例的流程图;
14.图5示出本公开另一个实施例的流程图;
15.图6示出本公开另一个实施例的流程图;
16.图7示出本公开另一个实施例进行置入时的流程图;
17.图8示出本公开另一个实施例的流程图;
18.图9是示出本公开实施例的集成电路装置的结构图;以及
19.图10是示出本公开实施例的板卡的结构图。
具体实施方式
20.下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
21.应当理解,本公开的权利要求、说明书及附图中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同对象,而不是用于描述特定顺序。本公开的说明书和权利要求书中使用的术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
22.还应当理解,在此本公开说明书中所使用的术语仅仅是出于描述特定实施例的目的,而并不意在限定本公开。如在本公开说明书和权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。还应当进一步理解,在本公开说明书和权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
23.如在本说明书和权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。
24.下面结合附图来详细描述本公开的具体实施方式。
25.本公开是一种利用静态单赋值形式的控制流图,通过编译器对每一条指令定值的内存区间和使用的内存区间进行分析,计算各个指令间的数据依赖关系。对于有定值和使用关系的指令,建立起定值-使用链及使用-定值链。
26.控制流图是用在编译器中的一种抽象数据结构,代表了一个程序在执行过程中会遍历的所有路径,以流程图的形式反映过程内所有基本块(basic block,bb)的可能流向。控制流图是由节点和节点间的关系所组成的,节点即是基本块,是程序中最大限度顺序执行的语句序列,每个基本块只有一个入口和出口,执行时从其入口开始,从其出口结束。基本块的特点是只要是基本块内的第一条指令被执行了,那么基本块内所有指令都会按照顺序被执行,直到基本块的所有指令都被执行完毕。
27.静态单赋值形式最主要的用途是通过调整变量,使得每一个变量仅会被赋值一次,以达到较佳的运算效率。举例来说,以下3行代码:
28.y:=1
29.y:=2
30.x:=y
31.第一行是将y变量赋值1,第二行是将y变量赋值2,第三行是将y变量的值赋值给x变量,由于y变量在第二行被二度赋值,覆盖了第一行的赋值,而y变量的数值在第三行被使用,故第一行是没有必要的。在静态单赋值形式下,前述代码会转换成下列的中介码:
32.y1:=1
33.y2:=2
34.x1:=y235.再以图1为例,图1a示出示例性的源代码及控制流图,首先将输入数据的值赋值给x变量,接着判断x变量的值是否为42,如果是,y变量赋值1,如果不是,则y变量谓词x 2,最后打印y变量的值。图1b示出等价的静态单赋值形式及控制流图,y变量在两个分支中被改写为y1和y2,静态单赋值形式在控制流交汇处利用ф(phi)函数合并了来自不同分支的y1和y2值,表示将获得y1和y2值的其中一个,接着赋值给y3,最后打印y3的值。从图1b可知,静态单赋值形式会将源代码中的各个变量做调整,使得一个变量仅被赋值一次。
36.静态单赋值形式的特征在于:源变量按照活动范围(从变量的一次定值到使用)进行分割,并产生添加数字编号后缀的新变量,每个变量只定值一次,如前述的y变量调整成y1和y2;控制流交汇处有phi函数将来自不同路径的值合并。phi函数表示一个平行操作,根据运行的路径选择一个赋值。
37.静态单赋值形式简化了两种链接关系:使用-定值链(use-def chain)和定值-使用链(def-use chain)。使用-定值链是一个数据结构,包含一个定值(或称定义)变量,以及它的全部使用的集合。相对的,定值-使用链包含一个使用变量,以及它的全部定值的集合。由于非静态单赋值形式下的变量不止一次被定值,所以每个变量的定值-使用链非常复杂。而在静态单赋值形式下,没有同名变量,每个变量只被定值一次,所以同名的使用都是属于它的定值-使用链,而且每个变量在使用前都只被定值一次,所以使用-定值链是一对一的。可见,静态单赋值形式下的使用-定值链和定值-使用链都得到了简化。
38.静态单赋值形式带来以下好处:对于标量而言,每个变量只有唯一的定值,数据流分析和优化算法更加简单;使用-定值关系链所占用的内存空间从指数增长降低为线性增长;使用和定值的关系更加直观;源程序中对同一个变量的不相关的若干次使用,在静态单赋值形式中会转变成对不同变量的使用,因此能避免执行不必要的冗余指令。
39.对于张量而言,每个变量可以是以内存描述符(memory descriptor)所定义的,内存描述符用以描述一块内存区间,其具有3种信息:变量名称、偏移及大小,例如md1(var:a,offset:0,size:128)代表编号1号的内存描述符载有变量a的数据,该数据存储在自偏移量为0的地址起的连续128个地址空间[0:127]里。
[0040]
如果还存在一个md2(var:a,offset:32,size:32),显然,md2和md1在内存区间[32,63]存在交集,那么,当一个指令在定值md1的同时,也可能会对md2对应的内存区间产生影响,则该指令对md1的定值为必须定值(must define),而该指令对其他与md1产生交集区间的内存描述符(如md2)而言则是可能定值(may define)。同样地,对使用的内存描述符也有相似的定义,分别为必须使用(must use)和可能使用(may use)。换言之,“必须”指的是对区间的必然描述,而“可能”则是任意跟“必须”有交集其他区间。
[0041]
再者,如果一个内存描述符的偏移和大小都是精确的数值或范围,则该内存描述符是“精确(exact)”的,否则便不是精确的。例如:md3[0,127]是精确的,md4[32,x]是不精
确的(x为未知)。
[0042]
另外,同样以前述md1及md2为例,如果md2的定值早于md1的定值,那么不论md2的定值为何,都会被后来的md1所“杀掉(kill)”,也就是覆盖掉;如果md2的定值晚于md1的定值,那么md2的定值会kill掉md1的定值区间的一部分,即[32,63]。这种被kill的区间信息称为kill集信息。也就是说,内存描述符的kill集记录了会被其他指令kill掉的区间,内存描述符的定值对这些区间来说是无效的。
[0043]
控制流图中有所谓的支配节点(dominator)、严格支配节点(strictly dominator)及直接支配节点(immediate dominator)。图2示出一个示例性的控制流图以说明这些节点,以h节点来说,路径的起点是a节点,再经过e节点,e节点后有个分支,可能进行f节点或g节点,不论进行f节点或g节点,结束后都会经过h节点。支配节点指的是自控制流图的起点开始,进行至某个特定基本块必须途经的基本块,欲到达h节点,必然会经过a节点、e节点和h节点本身,故a节点、e节点和h节点都是h节点的支配节点。严格支配节点则是特定基本块本身以外的支配节点,同样以h节点为例,a节点及e节点是h节点的严格支配节点。而直接支配节点指的是最接近特定基本块的支配节点,e节点便是h节点的直接支配节点。
[0044]
在构建静态单赋值形式的过程中,还需要考量支配边界(dominance frontier),即为某一节点的支配关系终止的地方,也是会有其他控制流出现的地方,支配边界直观理解就是特定节点所能支配的边界(并不包括该边界)。以图2的e节点为例,其严格支配了f节点、g节点、h节点,则e节点的支配边界为d节点(f节点的立即后驱节点)、m节点(h节点的立即后驱节点)、l节点(节点的立即后驱节点),如图所示,d节点、m节点、l节点都有其他分支导入,以至于不受e节点支配。
[0045]
本公开的一个实施例是一种在控制流图中计算程序中数据依赖关系的方法,适用张量指令的环境中,所述程序可以用于对图像、语音、文本数据在神经网络进行推理计算或其他运算中,此处不做具体限定。对于包含张量指令的情况,一个张量内存区间可能会由多个指令进行定值,本技术实施例的方法用于根据内存描述符分析指令之间的数据依赖关系。图3示出此实施例的流程图。
[0046]
在步骤301中,将所述程序建构成静态单赋值形式的控制流图。把程序转换为静态单赋值形式的方式有很多种,最简单的就是先将每个被赋值的变量用一个新的变量名称来取代,如图1a所示的源程序中的a基本块与b基本块的变量y变更为图1b中a基本块的变量y1与b基本块的变量y2。
[0047]
然而,在图1a中的基本块c里变量y的使用无法确定,这是因为前驱基本块(基本块a与基本块b)都对变量y进行了定值,编译时无法得知程序会从哪个前驱基本块到达基本块c。当控制流图遇到这种情况时,此步骤接着加入phi函数。如图1b所示,基本块c的起始处添加了一条phi函数指令,同时基于变量y重新定义一个变量y3,phi函数可以根据程序的运行路径选择对应的版本,也就是选择使用变量y1或y2。
[0048]
此实施例通过支配边界以准确掌握phi函数应当置入在哪些基本块中。如果某个节点定值了某个变量,那么这个变量会到达被该节点支配的每一个节点,在立即后驱基本块中就需要加入phi函数。
[0049]
此实施例利用以下方式来实现phi函数。同样以图1b为例,假设a基本块的y1分配
至r1缓存器,b基本块的y2分配至r2缓存器,则c基本块中的phi函数y3←
ф(a:y1,b:y2)可以在a基本块的末尾会生成以下指令:
[0050]
move r3←
r1[0051]
也就是将r1缓存器的数据搬移到r3缓存器。同理,在b基本块的末尾生成以下指令:
[0052]
move r3←
r2[0053]
将r2缓存器的数据搬移到r3缓存器。如此不论程序经过a基本块还是b基本块,r3缓存器都会是变量y3的正确定值。
[0054]
在步骤302中,识别所有节点的直接支配节点。此步骤可以采用经典的lengauer-tarjan演算法或其他演算法识别出直接支配节点。以图2的控制流图为例,此实施例识别出直接支配节点为a节点、b节点、e节点及i节点。
[0055]
在步骤303中,设定所有节点的初始信息,所述初始信息为相对应的直接支配节点的所有内存描述符的定值信息及kill集信息。由于直接支配节点里的各变量会直接在后驱基本块被使用,故此实施例在设定初始信息时,将直接支配节点里各变量的定值及kill集作为后驱基本块的初始信息。再者,变量是由内存描述符所定义的,故设定所有节点的初始信息就是设定节点内各变量的初始信息,也就是设定变量所对应的内存描述符的定值信息及kill集信息的初始信息。
[0056]
以图2的c节点为例,其直接支配节点为b节点,因此利用b节点内变量的内存描述符的定值信息及kill集信息,来作为c节点内的变量的内存描述符的定值信息及kill集信息的初始信息。又以图2的l节点为例,其直接支配节点为a节点,因此利用a节点内的变量的内存描述符的定值信息及kill集信息,来作为l节点内的变量的内存描述符的定值信息及kill集信息的初始信息。
[0057]
在此实施例中,kill集信息皆为有序列表,一般是地址由低到高排列,方便做各种交集和并集运算。
[0058]
在步骤304中,基于所述控制流图进行迭代,每次迭代执行时,遍历所有节点,计算并更新每个节点的内存描述符的定值信息及kill集信息,并更新指令的数据依赖关系。初始是基于步骤303中所得到的初始信息计算每个节点的内存描述符的定值信息及kill集信息,获得新的定值信息及kill集信息后,再以新的定值信息及kill集信息代入重新计算,如此迭代,直到每个节点内的变量的内存描述符的定值信息及kill集信息不再改变为止。
[0059]
在迭代的过程中,数据流的顺序可以采用先序、中序、后序或逆后序的方式。以后序为例,其操作为以倒序遍历左子树,再倒序遍历右子树,最后访问根结点。以图2为例,其后序遍历的结果是m

d

c

b

h

f

g

e

l

j

k

i

a。再以逆后序为例,其是先以后序方式遍历,再将结果倒置而得,故图2的控制流图的逆后序遍历结果为a

i

k

j

l

e

g

f

h

b

c

d

m,逆后序可以更早的收敛。此实施例不限制遍历的顺序,但较佳的采用逆后序遍历。
[0060]
当每个节点内的变量的内存描述符的定值信息及kill集信息不再改变时,迭代便可结束,此时的定值-使用链、使用-定值链及kill集信息即为最终结果。详细来说,在更新各内存描述符的定值信息及kill集信息的过程中,其实就是更新指令间的数据依赖关系,这些数据依赖关系将做为指令编译优化时的参考信息,经编译优化的指令可编译为计算机能够执行的机器码,从而使得计算机能够根据这些指令的数据依赖关系执行图像、语音、文
本数据等计算。其中,指令编译优化包括但不限于死代码删除、公共子表达式删除、常量折叠等等。
[0061]
此实施例考量到节点可能会涉及phi函数,在此步骤会进一步遍历每个基本块的指令,判断每个基本块的后继基本块是否为phi节点。如为phi节点,则设定phi节点的所有直接前驱节点的定值信息为phi节点的内存描述符的定值信息,以确定phi节点的定值信息。接着将这些立即前驱节点的kill集信息取交集,以产生立即前驱节点的kill集信息的交集区间,再设定交集区间为phi节点的内存描述符的kill集信息,以确定phi节点的kill集信息。
[0062]
以一个例子来说明phi函数的定值方式。假设phi节点存在两个分支输入,在这两个立即前驱节点里分别具有指令对内存描述符md1定值,即为md1v1和md1v2,又假设md1v1和md1v2的记录信息如下:
[0063] 定值信息kill集信息md1v1ir1、ir2{[1,127]}md1v2ir3、ir4{[32,63]}
[0064]
设定phi节点的所有立即前驱节点的定值信息为phi节点的内存描述符的定值信息,即ir1、ir2、ir3、ir4。接着将这些立即前驱节点的kill集信息取交集,以产生立即前驱节点的kill集信息的交集区间,[1,127]与[32,63]的交集区间为[32,63],故phi节点的内存描述符的kill集信息为[32,63]。
[0065][0066]
在前述实施例的步骤304中,一般是先识别指令的使用,再识别指令的定值。更详细来说,前述实施例先识别各节点中的指令有哪些是使用,哪些是定值,然后计算并更新那些指令的使用的内存描述符的定值信息及kill集信息,再计算并更新那些指令的定值的内存描述符的定值信息及kill集信息。
[0067]
例如,对于加法指令:c[0,127]=a[0,127] b[0,127]来说,该加法指令定值了md1(var:c,offset:0,size:128),该加法指令使用了md2(var:a,offset:0,size:128)和md3(var:b,offset:0,size:128)。在本公开实施例中,在计算和更新各个节点中的内存描述符的定值信息及kill集信息时,可以首先计算并更新该加法指令的使用(md2和md3)的定值信息和kill集信息,再计算并更新该加法指令的定值md1的定值信息和kill集信息。
[0068]
本公开的另一个实施例是一种计算并更新指令的使用的内存描述符的定值信息及kill集信息的方法,图4示出其流程图。
[0069]
在步骤401中,判断指令的使用是否存在必须使用内存描述符。如不存在必须使用内存描述符,就执行步骤402,设定可能使用内存描述符的定值信息为指令的使用的内存描述符的定值信息。其中,该可能使用内存描述可以是同一变量对应的多个内存描述符,也可以是多个不同变量对应的描述符。如存在必须使用内存描述符,就执行步骤403,判断是否存在必须精确使用内存描述符,也就是必须使用内存描述符是否为精确。如不精确,便执行
步骤404,设定必须使用内存描述符及可能使用内存描述符的定值信息为指令的使用的定值信息,也就是必须使用内存描述符的定值信息及可能使用内存描述符的定值信息都作为所述指令的使用的内存描述符的定值信息。如精确,便执行步骤405。
[0070]
在步骤405中,判断所述必须精确使用内存描述符的定值信息是否存在。如不存在,则执行步骤406,识别所有存在定值信息的可能使用内存描述符,接着执行步骤413。如存在,则执行步骤407,设定所述必须精确使用内存描述符的定值信息为所述指令的使用的定值信息,接着执行步骤408。
[0071]
在步骤408中,判断所述必须精确使用内存描述符的kill集信息是否为空,其中,kill集可以是考虑同一变量的所有可能使用内存描述符确定的。如为空,表示所述必须精确使用内存描述符的定值信息未被kill掉,则执行步骤409,不需要再设定所述指令的使用的kill集信息了,也就是其kill集信息为空,结束整个流程。如不为空,表示所述必须精确使用内存描述符的部分定值信息被kill掉,则执行步骤411。
[0072]
在步骤411中,判断所述使kill集信息不为空的可能使用内存描述符的定值信息是否存在。如不存在,则不需要再考量可能使用内存描述符了,基于前述必须使用内存描述符的定值信息定值即可,此时执行步骤409,结束整个流程。如存在,则执行步骤413,判断所述必须使用内存描述符的定值信息与所述可能使用内存描述符的定值信息的交集区间是否被kill掉。如未被kill掉,则执行步骤414,设定所述可能使用内存描述符的定值信息和必须使用内存描述符的定值信息为所述使用的定值信息。如被kill掉,则执行步骤409,结束整个流程。
[0073]
本公开的另一个实施例亦为计算并更新指令的使用的定值信息及kill集信息的方法,图5示出此实施例的流程图,其与图4的实施例不同处有二。
[0074]
其一是图5的实施例不包括步骤413,换言之,在步骤406之后,不考虑必须使用内存描述符的定值信息与可能使用内存描述符的定值信息的交集区间是否被kill掉,直接执行步骤501,设定可能使用内存描述符的定值信息为所述指令的使用的定值信息。
[0075]
其二是在步骤411中,当判断所述可能使用内存描述符的定值信息存在时,不执行步骤413,而执行步骤502,设定所述可能使用内存描述符的定值信息和必须使用内存描述符的定值信息为指令的使用的定值信息。
[0076]
在计算并更新指令的使用的内存描述符的定值信息及kill集信息后,步骤304接着计算并更新指令的定值的定值信息及kill集信息。
[0077]
本公开的另一个实施例即为计算并更新指令的定值的定值信息及kill集信息的方法,图6示出其流程图。
[0078]
在步骤601中,判断指令的定值是否存在必须定值内存描述符。如不存在,则执行步骤602,识别所有可能定值内存描述符。接着执行步骤603,在所有可能定值内存描述符中,排除被其他可能定值内存描述符覆盖的可能定值内存描述符。接着执行步骤604,在所有可能定值内存描述符中,排除已有定值信息的可能定值内存描述符。接着执行步骤605,建立所有可能定值内存描述符中未被排除的可能定值内存描述符的定值信息。当在步骤601中判断指令的定值存在必须定值内存描述符时,则执行步骤606。
[0079]
在步骤606中,判断必须定值内存描述符是否精确。如精确,则执行步骤607,建立指令的定值中的必须定值内存描述符的定值信息。接着执行步骤608,识别所述指令的定值
中的必须定值内存描述符的可能定值内存描述符。接着执行步骤609,将所述指令的定值中的必须定值内存描述符的定值信息置入所述可能定值内存描述符的kill集信息中。当在步骤606中判断必须定值内存描述符不精确,则执行步骤610。
[0080]
在步骤610中,判断可能定值内存描述符是否存在定值信息。如存在定值信息,则执行步骤611,注记所述可能定值内存描述符被kill了。如不存在定值信息,表示没有任何可供定值的信息,则执行步骤612,结束整个流程。
[0081]
在步骤609中,其置入的方式可以再细化为如图7所示的流程。在步骤701中,判断所述可能定值内存描述符是否完全被kill掉。如完全被kill掉,则执行步骤702,删除所述可能定值内存描述符的记录。如未完全被kill掉,则执行步骤703,判断所述可能定值内存描述符的kill集信息是否为空。如为空,则执行步骤704,将所述指令的定值中的必须定值内存描述符的定值信息全部区间置入所述可能定值内存描述符的kill集信息中。如不为空,则执行步骤705,建立所述可能定值内存描述符的kill集信息与所述必须定值内存描述符的定值信息的并集区间。接着执行步骤706,将所述并集区间置入所述可能定值内存描述符的kill集信息中。
[0082]
在另一种情境下,当在步骤601中判断所述指令的定值是否存在必须定值内存描述符时,并不排除一些特殊的,如步骤603或604所示的可能定值内存描述符,而是在步骤602识别所有可能定值内存描述符后,直接建立所有可能定值内存描述符的定值信息。
[0083]
在另一种情境下,当前述的必须定值内存描述符被谓词(predicate)时,在编译时便无法确定该谓词是否会被执行。此实施例基于谓词的情况,更进一步执行如图8所示的流程。
[0084]
在步骤801中,判断指令的定值的必须定值内存描述符是否被谓词。如未被谓词,则执行步骤802,执行图6的流程。如被谓词,则需要建立所述指令的必须定值内存描述符的定值信息,这时继续执行步骤803,判断所述指令的定值的必须定值内存描述符是否存在定值信息。如存在定值信息,则执行步骤804,加入所述指令的定值至所述指令的定值的必须定值内存描述符的定值信息中。如不存在定值信息,需要建立新的指令的定值的必须定值内存描述符的定值信息,则执行步骤802,执行图6的流程。
[0085]
同时,在计算并更新指令的内存描述符的定值信息及kill集信息的过程中,步骤304还可以同时更新指令的数据依赖关系,指令的数据依赖关系可以是指各个指令的使用对应的定值信息,从而可以确定定值-使用链、使用-定值链。该数据依赖关系可以一数组的形式进行记录和存储。
[0086]
为更清楚理解本公开的技术方案,下面举例对前述各流程进行对照。
[0087]
在一个例子中,某个控制流图中的一个变量涉及多个内存描述符及其定值信息如下:md1[0,31]、md2[0,15]、md3[16,31]、md4[0,64],并基于逆后序的数据流,现有6条相关指令对该变量定值与使用如下表所示:
[0088][0089][0090]
依序处理各指令。首先处理指令ir1,其必须定值了md1,由于是指令的定值,故执行图6的流程。在步骤601中,判断ir1是否存在必须定值内存描述符,md1是必须定值内存描述符,因此执行步骤606,判断必须定值内存描述符是否精确,md1的区间[0,31]是精确,接着执行步骤607,建立ir1中的必须定值内存描述符的定值信息,也就是将md1[0,31]设定成该变量的定值信息。接着执行步骤608及步骤609,虽然md2、md3、md4是可能定值内存描述符,但通过查询初始信息确定在ir1之前的指令均未出现md2、md3、md4,故在此指令的定值中尚无法考虑可能定值内存描述符md2、md3、md4,因此在步骤608及步骤609中无需记录可能定值内存描述符也不用更新kill集信息。因此该变量的内存描述符建立记录信息如下:
[0091] 定值信息kill集信息md1ir1{}
[0092]
其中kill集信息记录为{}表示其kill集信息为空。
[0093]
接着处理指令ir2,其必须使用了md1,由于是指令的使用,故执行图4或图5的流程,在此以图4为例说明之。在步骤401中,判断所述指令的使用是否存在必须使用内存描述符,由于存在md1,故就执行步骤403,判断是否存在必须精确使用内存描述符,由于md1为精确,便执行步骤405,判断所述必须精确使用内存描述符的定值信息是否存在,md1的定值信息[0,31]是存在的,接着执行步骤407,设定所述必须精确使用内存描述符的定值信息为所述指令的使用的定值信息,因此指令ir2的使用的定值信息设定为ir1(md1的定值指令),接着执行步骤408,判断所述必须精确使用内存描述符的kill集信息是否为空,由于md1尚未有任何区间被kill掉,则执行步骤409,不需要再考量kill集信息了,结束整个流程。换言之,ir2的定值信息为ir1,从而可以确定指令ir2和ir1之间的数据依赖关系(即use_def链),kill集信息为空。
[0094]
接着处理指令ir3,其必须定值了md2,故执行图6的流程。在步骤601中,判断ir3是否存在必须定值内存描述符,md2是必须定值内存描述符,因此执行步骤606,判断必须定值内存描述符是否精确,md2的区间[0,15]是精确,接着执行步骤607,建立ir3中的必须定值内存描述符的定值信息,也就是将md2[0,15]设定成该变量的定值信息。接着执行步骤608及步骤609,由于md1是md2的可能定值内存描述符,因此在步骤609中,更新md1的kill集信息。因此该变量的内存描述符更新记录信息如下:
[0095] 定值信息kill集信息
md1ir1{[0,15]}md2ir3{}
[0096]
接着处理指令ir4,其必须使用了md1。在步骤401中,判断所述指令的使用是否存在必须使用内存描述符,由于存在md1,故执行步骤403,判断是否存在必须精确使用内存描述符,由于md1为精确,便执行步骤405,判断所述必须精确使用内存描述符的定值信息是否存在,md1的定值信息是存在的,接着执行步骤407,设定所述必须精确使用内存描述符的定值信息为所述指令ir4的使用的定值信息,因此指令ir4的使用的定值信息设定为ir1,接着执行步骤408,判断所述必须精确使用内存描述符的kill集信息是否为空,在处理ir3后,md1的kill集信息已不为空,则执行步骤411,判断所述可能使用内存描述符的定值信息是否存在,md2存在定值信息,故执行步骤413,判断md1的定值信息与md2的定值信息的交集区间[0,15]是否被kill掉。因md2的区间[0,15]未被kill掉,则执行步骤414,设定md2的定值信息亦为所述指令的使用的定值信息。因此ir4的定值信息为:ir1(md1的定值指令)和ir3(md2的定值指令),从而可以确定指令ir4、ir2和ir1之间的数据依赖关系(即use_def链)。换言之,ir4使用了md1,而md1的区间是由两条指令所定值,其中ir1定值了[16,31],且由ir3定值了[0,15]。
[0097]
接着处理指令ir5,其必须定值了md3,故执行图6的流程。在步骤601中,判断ir5是否存在必须定值内存描述符,md3是必须定值内存描述符,因此执行步骤606,判断必须定值内存描述符是否精确,md3为精确,接着执行步骤607,建立ir5中的必须定值内存描述符的定值信息,也就是将md3设定成该变量的内存描述符的定值信息。接着执行步骤608及步骤609,由于md1是md3的可能定值内存描述符,因此在步骤609中,更新md1的kill集信息,由于md1的原有kill区间为[0,15],新的kill区间为[16,31],这两个区间合并成一个新的区间[0,31],而这个区间恰好就是md1对应的完整区间,换言之,md1的定值已经全部被kill掉了。因此该变量的记录更新如下:
[0098] 定值信息kill集信息md2ir3{}md3ir5{}
[0099]
接着处理指令ir6,其必须使用了md4。在步骤401中,判断所述指令的使用是否存在必须使用内存描述符,由于md4尚未在前置的指令中被定值,故不存在任何必须使用内存描述符,因此执行步骤402,设定可能使用内存描述符的定值信息为指令的使用的定值信息。在考虑所有的可能使用内存描述符时,只有md2和md3在记录内存在,且这两个内存描述符的有效区间都没有被kill掉,故以这两个内存描述符的定值信息(即ir3和ir5)作为ir6的定值信息,从而可以确定指令ir6、ir3和ir5之间的数据依赖关系(即use_def链)。
[0100]
在另一个例子中,假设存在四个内存描述符,分别为:md1[0,31]、md2[0,x]、md3[0,31]、md4[0,63],其中x表示编译时无法确定对应内存区间的具体地址,且md1和md2描述相同变量,例如为变量a,md3和md4描述相同变量,例如为变量b。以下是针对这四个内存描述符的指令:
[0101][0102]
首先处理指令ir1,其必须定值了md1,由于是指令的定值,故执行图6的流程。在步骤601中,判断ir1是否存在必须定值内存描述符,md1是必须定值内存描述符,因此执行步骤606,判断必须定值内存描述符是否精确,md1为精确,接着执行步骤607,建立ir1中的必须定值内存描述符的定值信息,也就是将md1[0,31]设定成变量a的定值信息。接着执行步骤608及步骤609,虽然md2的定值会影响md1的定值信息,但在ir1之前指令均未定值md2,故在此指令中尚无法考虑可能定值内存描述符md2,因此在步骤608及步骤609中无需记录可能定值内存描述符也不用更新kill集信息。因此变量a的内存描述符建立记录信息如下:
[0103] 定值信息kill集信息is_killmd1ir1{}假
[0104]
其中is_kill是记录该内存描述符是否被kill了,为真表示被kill,为假表示未被kill。
[0105]
接着处理指令ir2,其必须定值了md2。在步骤601中,判断ir2是否存在必须定值内存描述符,md2是必须定值内存描述符,因此执行步骤606,判断必须定值内存描述符是否精确,md2并不精确,其中x未定,故在步骤610中,判断所述可能定值内存描述符是否存在定值信息。由于ir2的可能定值内存描述符md1存在定值信息,执行步骤611,注记md1被kill了,即md1的is_kill变更为真,用以表示md1的部分区间被kill了,但由于md2的定值信息不精确,无法确定md1的kill集信息,因此以is_kill信息表示md1被kill了。因此变量a的内存描述符的记录更新如下:
[0106] 定值信息kill集信息is_killmd1ir1{}真md2ir2{}假
[0107]
接着处理指令ir3,其必须使用了md2。在步骤401中,判断所述指令的使用是否存在必须使用内存描述符,md2是必须使用内存描述符,故执行步骤403,判断是否存在必须精确使用内存描述符,由于md2不精确,因此执行步骤404,设定必须使用内存描述符及可能使用内存描述符的定值信息为指令的使用的内存描述符的定值信息,也就是md2的定值信息及md1的定值信息都作为ir3的定值信息。ir3对md2使用的定值信息为ir1和ir2,从而可以确定指令ir3、ir2和ir1之间的数据依赖关系(即use_def链)。
[0108]
接着处理指令ir4,其为指令的定值。在步骤601中,判断所述指令是否存在必须定值内存描述符。因不存在,则执行步骤602,识别所有可能定值内存描述符。在此例子中,所
有可能定值内存描述符为md1、md2、md3、md4。接着执行步骤603,在所有可能定值内存描述符中,排除被其他可能定值内存描述符覆盖的可能定值内存描述符。由于md3完全被md4覆盖,故排除md3。接着执行步骤604,在所有可能定值内存描述符中,排除已有定值信息的可能定值内存描述符。md1及md2已有定值信息,故被排除,因此只剩下md4。接着执行步骤605,建立所有可能定值内存描述符中未被排除的可能定值内存描述符的定值信息,即新增变量b对应的md4的定值信息,更新后各个内存描述符的定值信息如下:
[0109] 定值信息kill集信息is_killmd1ir1{}真md2ir2{}假md4ir4{}假
[0110]
接着处理指令ir5,其必须定值了md1。由于ir5被谓词,故执行如图8所示的流程。在步骤801中,判断所述指令的定值的必须定值内存描述符是否被谓词。由于被谓词,故执行步骤803,判断所述指令的定值的必须定值内存描述符是否存在定值信息。md1存在定值信息,则执行步骤804,加入所述指令的定值至所述指令的定值的必须定值内存描述符的定值信息中。因此定值记录更新为:
[0111] 定值信息kill集信息is_killmd1ir1、ir5{}真md2ir2{}假md4ir4{}假
[0112]
接着处理指令ir6,其为指令的使用。在步骤401中,判断所述指令的使用是否存在必须使用内存描述符。因不存在必须使用内存描述符,就执行步骤402,设定可能使用内存描述符的定值信息为指令ir6的使用的定值信息。ir6中使用的定值信息为:ir1、ir2、ir4、ir5,从而可以确定指令ir6与ir2、ir1、ir4及ir5之间的数据依赖关系(即use_def链)。
[0113]
本公开另一个实施例为一种计算机可读存储介质,其上存储有计算程序中数据依赖关系的计算机程序代码,当所述计算机程序代码由处理器运行时,执行本公开的各种方法,如图3至8所述的方法。
[0114]
前述各实施例通过编译器对每一条定值和指令的使用的内存区间和kill集信息进行分析,计算各指令之间的数据依赖关系,同时对于有定值-使用关系的指令,建立定值-使用链和使用-定值链的技术手段,解决难以分析内存之间的数据依赖关系,导致运算资源浪费的技术问题,达到提升计算效率的技术效果。
[0115]
编译器可以基于该数据依赖关系进行编译优化,从而有效的减少不必要的计算程序,获得优化的代码。编译器还可以进一步将上述优化的代码转化为机器码,该机器码能够被人工智能芯片执行,使得人工智能芯片,特别是神经网络推理得以加速运行。
[0116]
图9是示出应用本公开实施例的一种集成电路装置900的结构图。如图9所示,集成电路装置900包括计算装置902,计算装置902载有应用本公开各实施例编译后的机器码,以实现神经网络推理。另外,集成电路装置900还包括通用互联接口904和其他处理装置906。
[0117]
其他处理装置906可以是中央处理器、图形处理器、人工智能处理器等通用和/或专用处理器中的一种或多种类型的处理器,其数目不做限制而是依实际需要来确定。其他处理装置906作为计算装置902与外部数据和控制的接口,执行包括但不限于数据搬运,完
成对计算装置902的开启、停止等的基本控制。其他处理装置906也可以和计算装置902协作共同完成运算任务。
[0118]
通用互联接口904可以用于在计算装置902与其他处理装置906间传输数据和控制指令。例如,计算装置902可以经由通用互联接口904从其他处理装置906中获取所需的输入数据,写入计算装置902片上的存储单元。进一步,计算装置902可以经由通用互联接口904从其他处理装置906中获取控制指令,写入计算装置902片上的控制缓存。替代地或可选地,通用互联接口904也可以读取计算装置902的存储模块中的数据并传输给其他处理装置906。
[0119]
集成电路装置900还包括存储装置908,其可以分别与计算装置902和其他处理装置906连接。存储装置908用于保存计算装置902和其他处理装置906的数据,尤其适用于所需要运算的数据在计算装置902或其他处理装置906的内部存储中无法全部保存的数据。
[0120]
根据应用场景的不同,集成电路装置900可以作为手机、机器人、无人机、视频采集等设备的片上系统(soc),从而有效地降低控制部分的核心面积,提高处理速度并降低整体的功耗。在此情况时,集成电路装置900的通用互联接口904与设备的某些部件相连接。此处的某些部件可以例如是摄像头,显示器,鼠标,键盘,网卡或wifi接口。
[0121]
本公开还揭露一种芯片或集成电路芯片,其包括了集成电路装置900。本公开还揭露一种芯片封装结构,其包括了上述芯片。
[0122]
本公开另一个实施例是一种板卡,其包括了上述芯片封装结构。参阅图10,板卡1000除了包括多个上述芯片1002以外,还可以包括其他的配套部件,该配套部件包括存储器件1004、接口装置1006和控制器件1008。
[0123]
存储器件1004与芯片封装结构内的芯片1002通过总线1014连接,用于存储数据。存储器件1004可以包括多组存储单元1010。
[0124]
接口装置1006与所述芯片封装结构内的芯片1002电连接。所述接口装置1006用于实现芯片1002与外部设备1012(例如服务器或计算机)之间的数据传输。在此实施例中,接口装置1006为标准pcie接口,待处理的数据由服务器通过标准pcie接口传递至芯片1002,实现数据转移。芯片1002的计算结果亦由接口装置1006传送回外部设备1012。
[0125]
控制器件1008与芯片1002电连接,以便对芯片1002的状态进行监控。具体地,芯片1002与控制器件1008可以通过spi接口电连接。控制器件1008可以包括单片机(“mcu”,micro controller unit)。
[0126]
本公开的另一个实施例是一种电子设备或装置,其包括了上述板卡1000。根据不同的应用场景,电子设备或装置可以包括数据处理装置、机器人、电脑、打印机、扫描仪、平板电脑、智能终端、手机、行车记录仪、导航仪、传感器、摄像头、服务器、云端服务器、相机、摄像机、投影仪、手表、耳机、移动存储、可穿戴设备、交通工具、家用电器、和/或医疗设备。所述交通工具包括飞机、轮船和/或车辆;所述家用电器包括电视、空调、微波炉、冰箱、电饭煲、加湿器、洗衣机、电灯、燃气灶、油烟机;所述医疗设备包括核磁共振仪、b超仪和/或心电图仪。
[0127]
依据以下条款可更好地理解前述内容:
[0128]
条款a1、一种计算程序中数据依赖关系的方法,所述方法包括:将所述程序建构成静态单赋值形式的控制流图,所述控制流图包括多个节点;设定所述多个节点的内存描述
符的初始信息,所述初始信息为直接支配节点的所有内存描述符的定值信息及kill集信息;以及基于所述控制流图进行迭代,每次迭代执行下列步骤:遍历所述多个节点,计算并更新每个节点的内存描述符的定值信息及kill集信息,并更新指令的数据依赖关系。其中所述指令的数据依赖关系用于指令编译优化时的参考信息。
[0129]
条款a2、根据条款a1所述的方法,其中所述迭代步骤是以逆后序数据流方式进行。
[0130]
条款a3、根据条款a1所述的方法,其中在所述计算步骤中,先计算并更新指令的使用的内存描述符,再计算并更新指令的定值的内存描述符。
[0131]
条款a4、根据条款a3所述的方法,其中对于所述指令的使用,所述计算步骤还包括:判断是否存在必须精确使用内存描述符;如存在,判断所述必须精确使用内存描述符的定值信息是否存在;如所述定值信息存在,设定所述必须精确使用内存描述符的定值信息为所述使用的定值信息。
[0132]
条款a5、根据条款a4所述的方法,其中如所述定值信息存在,所述计算步骤还包括:判断所述必须精确使用内存描述符的kill集信息是否为空;以及如不为空,识别使所述kill集信息不为空的可能使用内存描述符;判断所述可能使用内存描述符的定值信息是否存在;如所述可能使用内存描述符的定值信息存在,判断所述必须使用内存描述符的定值信息与所述可能使用内存描述符的定值信息的交集区间是否被kill掉;如未被kill掉,设定所述可能使用内存描述符的定值信息和所述必须使用内存描述符的定值信息为所述使用指令指令的使用的定值信息。
[0133]
条款a6、根据条款a4所述的方法,其中如所述定值信息存在,所述计算步骤还包括:判断所述必须精确使用内存描述符的kill集信息是否为空;以及如不为空,判断所述可能使用内存描述符的定值信息是否存在;如所述可能使用内存描述符的定值信息存在,设定所述可能使用内存描述符的定值信息和所述必须使用内存描述符的定值信息为所述指令的使用的定值信息。
[0134]
条款a7、根据条款a4所述的方法,其中如所述定值信息不存在,所述计算步骤还包括:识别所有存在定值信息的可能使用内存描述符;判断所述必须精确使用内存描述符的定值信息与所述可能使用内存描述符的定值信息的交集区间是否被kill掉;以及如未被kill掉,设定所述可能使用内存描述符的定值信息和所述必须使用内存描述符的定值信息为使用指令的定值信息为所述指令的使用的定值信息。
[0135]
条款a8、根据条款a4所述的方法,其中如所述定值信息不存在,所述计算步骤还包括:识别所有存在定值信息的可能使用内存描述符;以及设定所述可能使用内存描述符的定值信息为所述指令的使用的定值信息。
[0136]
条款a9、根据条款a4所述的方法,其中如不存在必须精确使用内存描述符,所述计算步骤还包括:设定必须使用内存描述符及可能使用内存描述符的定值信息为所述指令的使用的定值信息。
[0137]
条款a10、根据条款a4所述的方法,其中所述计算步骤还包括:判断所述指令的使用是否存在必须使用内存描述符;以及如不存在必须使用内存描述符,设定可能使用内存描述符的定值信息为所述指令的使用的定值信息。
[0138]
条款a11、根据条款a3所述的方法,其中对于所述指令的定值,所述计算步骤包括:建立所述指令的定值中的必须定值内存描述符的定值信息;识别所述指令的定值中的必须
定值内存描述符的可能定值内存描述符;以及将所述指令中的必须定值内存描述符的定值信息置入所述可能定值内存描述符的kill集信息中。
[0139]
条款a12、根据条款a11所述的方法,其中所述置入步骤包括:判断所述可能定值内存描述符是否完全被kill掉;以及如完全被kill掉,删除所述可能定值内存描述符的记录。
[0140]
条款a13、根据条款a11所述的方法,其中所述置入步骤包括:判断所述可能定值内存描述符的kill集信息是否为空;如为空,将所述指令的定值中的必须定值内存描述符的定值信息全部区间置入所述可能定值内存描述符的kill集信息中。
[0141]
条款a14、根据条款a13所述的方法,其中如所述可能定值内存描述符的kill集信息不为空,所述置入步骤包括:建立所述可能定值内存描述符的kill集信息与所述必须定值内存描述符的定值信息的并集区间;以及将所述并集区间置入所述可能定值内存描述符的kill集信息中。
[0142]
条款a15、根据条款a3所述的方法,其中对于所述指令的定值,所述计算步骤包括:判断所述指令的定值中的必须定值内存描述符是否精确;如精确:建立所述指令的定值中的必须定值内存描述符的定值信息;以及识别所述指令的定值中的必须定值内存描述符的可能定值内存描述符;如不精确:判断所述可能定值内存描述符是否存在定值信息;以及如所述可能定值内存描述符存在定值信息,注记所述可能定值内存描述符被kill了。
[0143]
条款a16、根据条款a3所述的方法,其中对于所述指令的定值,所述计算步骤包括:判断所述指令的定值是否存在必须定值内存描述符;如不存在必须定值内存描述符,执行以下步骤:识别所有可能定值内存描述符;在所有可能定值内存描述符中,排除被其他可能定值内存描述符覆盖的可能定值内存描述符;在所有可能定值内存描述符中,排除已有定值信息的可能定值内存描述符;以及建立所有可能定值内存描述符中未被排除的可能定值内存描述符的定值信息。
[0144]
条款a17、根据条款a3所述的方法,其中对于所述指令的定值,所述计算步骤包括:判断所述指令的定值是否存在必须定值内存描述符;如不存在必须定值内存描述符,建立所有可能定值内存描述符的定值信息。
[0145]
条款a18、根据条款a3所述的方法,其中对于所述指令的定值,所述计算步骤包括:判断所述指令的定值的必须定值内存描述符是否被谓词;如被谓词,建立所述指令的定值的必须定值内存描述符的定值信息。
[0146]
条款a19、根据条款a18所述的方法,其中所述建立所述指令的定值的必须定值内存描述符的定值信息步骤包括:判断所述指令的定值的必须定值内存描述符是否存在定值信息;如存在定值信息,则加入所述指令的定值至所述指令的定值的必须定值内存描述符的定值信息中;以及如不存在定值信息,则建立新的所述指令的定值的必须定值内存描述符的定值信息。
[0147]
条款a20、根据条款a1所述的方法,其中所述计算步骤包括:遍历每个基本块的指令,判断所述每个基本块的后继基本块是否为phi节点;如为phi节点,执行下列步骤:设定所述每个基本块的定值信息为所述phi节点的内存描述符的定值信息;建立所有所述每个基本块的kill集信息的交集区间;以及设定所述交集区间为所述phi节点的kill集信息。
[0148]
条款a21、根据条款a1所述的方法,其中还包括:识别所述多个节点里的所述直接支配节点。
[0149]
条款a22、根据条款a1-21任一项所述的方法,其中所述kill集信息为有序列表。
[0150]
条款a23、一种计算机可读存储介质,其上存储有计算程序中数据依赖关系的计算机程序代码,当所述计算机程序代码由处理器运行时,执行条款a1-22的任意一项所述的方法。
[0151]
以上对本披露实施例进行了详细介绍,本文中应用了具体个例对本披露的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本披露的方法及其核心思想;同时,对于本领域的一般技术人员,依据本披露的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本披露的限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献