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

编译串行指令队列的方法和相关产品与流程

2022-06-05 16:28:54 来源:中国专利 TAG:


1.本公开涉及计算机领域,更具体地,涉及程序的编译。


背景技术:

2.通常,计算机编程模型中的语句是串行执行的。将这种串行的编程模型编译到串行的指令集架构上比较直接。但是,如果将此串行执行的计算机编程模型编译到并行的指令集架构上,则可能会产生指令之间的冲突。


技术实现要素:

3.本公开的至少一个目的在于解决现有技术中将串行指令编译到并行架构上时产生的指令间冲突问题。
4.根据本公开的第一方面,提供一种根据并行架构来编译串行指令队列的方法,其中所述串行指令队列包括多个程序指令,所述并行架构包括多个并行模块,用于执行所述程序指令,所述方法包括:将所述串行指令队列形成与所述并行模块对应的多个并行的程序指令队列;确定在前程序指令与在后程序指令之间是否存在依赖关系;响应于在前程序指令与在后程序指令之间存在依赖关系,控制在后程序指令等待在前程序指令执行完毕之后可执行。
5.根据本公开的第二方面,提供一种电子设备,包括:一个或多个处理器;以及存储器,所述存储器中存储有计算机程序指令,当所述计算机程序指令由所述一个或多个处理器运行时,使得所述电子设备执行如上所述的方法。
6.根据本公开的第三方面,提供一种计算机可读存储介质,包括计算机程序指令,当所述计算机程序指令由一个或多个处理器运行时,执行如上所述的方法。
7.在本公开提出的技术方案中,可以对指令进行依赖关系的分析,使得即使具有依赖关系的指令被编译到并行架构上,也可以保证这些指令的有序执行。
附图说明
8.通过参考附图阅读下文的详细描述,本披露示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本披露的若干实施方式,并且相同或对应的标号表示相同或对应的部分,其中:
9.图1示出了根据本公开一个实施方式的根据并行架构来编译串行指令队列的方法流程图;
10.图2示出了根据本公开一个实施方式的将串行指令队列形成与并行模块对应的多个并行的程序指令队列;
11.图3示出了一个包含多个基本块的程序的示意图;
12.图4示出了根据本公开一个实施方式的在多个基本块环境下根据并行架构来编译串行指令队列的方法流程图;
13.图5示出了一种组合处理装置;以及
14.图6示出了一种示例性板卡。
具体实施方式
15.下面将结合本披露实施例中的附图,对本披露实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本披露一部分实施例,而不是全部的实施例。基于本披露中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本披露保护的范围。
16.应当理解,本披露的权利要求、说明书及附图中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同对象,而不是用于描述特定顺序。本披露的说明书和权利要求书中使用的术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
17.还应当理解,在此本披露说明书中所使用的术语仅仅是出于描述特定实施例的目的,而并不意在限定本披露。如在本披露说明书和权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。还应当进一步理解,在本披露说明书和权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
18.以上对本披露实施例进行了详细介绍,本文中应用了具体个例对本披露的原理及实施方式进行了阐述,以上实施例的说明仅用于帮助理解本披露的方法及其核心思想。同时,本领域技术人员依据本披露的思想,基于本披露的具体实施方式及应用范围上做出的改变或变形之处,都属于本披露保护的范围。综上所述,本说明书内容不应理解为对本披露的限制。
19.在计算机编程模型,有一些语句是串行执行的。如果将此串行执行的计算机编程模型编译到并行的指令集架构上,则可能会产生指令之间的冲突。例如,某些串行指令之间可能会存在相互依赖关系,如果将这些具有相互依赖关系的指令编译到并行模块上,那么这些指令就可能发生冲突。由此,需要使这些具有相互依赖关系的指令保持一定的执行顺序,而不至于产生冲突。
20.图1示出了根据本公开一个实施方式的根据并行架构来编译串行指令队列的方法流程图。本公开的方法可以是运行在主机上的编译器实现的。本公开的方法通过编译器在编译时,对程序进行分析以将串行执行的程序指令转换成能够在并行架构上并行执行的指令,并保证程序的执行顺序及正确性。
21.在该方法中,串行指令队列可以包括多个程序指令,所述并行架构可以包括多个并行模块,用于执行上述的程序指令,所述方法包括:在操作s110,将所述串行指令队列形成与所述并行模块对应的多个并行的程序指令队列;在操作s130,确定在前程序指令与在后程序指令之间是否存在依赖关系;以及,在操作s150,响应于在前程序指令与在后程序指令之间存在依赖关系,控制在后程序指令等待在前程序指令执行完毕之后可执行。
22.上文所述的“程序指令”可以包括程序运行阶段所涉及到的各种层面的指令,包括但不限于机器可直接执行的二进制指令、汇编语言指令、高级语言指令等。
23.下面举例说明串行指令,并行模块以及指令之间的依赖关系。
24.首先定义一种并行架构pa,其包括两个并行模块,例如输入输出模块(io模块)和运算模块。io模块负责将片外和片上数据交换,运算模块负责计算片上数据,并且io模块的指令和运算模块的指令可以并行执行。上述并行架构pa可以是处理器或芯片等,此处不做具体限定。
25.需要理解的是,上面的两个并行模块是出于示例的目的,而不是对本公开的技术方案的限制。本领域技术人员可以理解的是,如果需要,并行模块的数量和功能并不受限制。
26.根据本公开的一个实施方式,io模块还可以包括多个并行的io单元;和/或运算模块还可以包括多个并行的运算单元。例如,io模块还可以分为数据io模块和权值io模块等;运算模块可以包括多个并行的乘法单元、加法单元等。此处仅举例说明,并不用于限定该并行架构的具体结构。
27.假设存在如下的串行指令:
28.1 move a1,a1;
29.2 move a2,a2;
30.3 add a3,a1,a2;
31.4 move a3,a3;
32.5 sub a4,a1,a3;
33.6 mov a4,a4。
34.其中,可以用大写的字母(例如a1,a2,a3和a4等)来表示数据的目的存储区(如片上存储区),用小写的字母(例如a1,a2和a3等)来表示数据的源存储区(如片外存储器),则程序指令move a1,a1表示将片外存储区a1内的数据移动或加载到片上存储区a1内;程序指令move a2,a2表示将片外存储区a2内的数据移动或加载到片上存储区a2内;程序指令add a3,a1,a2表示将片上存储区a1和a2内的数据相加并将相加结果存储到片上存储区a3中;程序指令move a3,a3表示将片上存储区a3中的数据移动或加载到片外存储区a3中;程序指令sub a4,a1,a3表示将片上存储区a1中的内容减去片上存储区a3中的内容,并将相减结果存储在片上存储区a4中;程序指令mov a4,a4表示将片上存储区a4内的内容移动或加载到片外存储区a4中。
35.图2示出了根据本公开一个实施方式的将串行指令队列形成与并行模块对应的多个并行的程序指令队列,表1示出了所形成的队列的列表。
36.根据本公开的一个实施方式,所述程序指令可以包括输入输出指令和运算指令,并行模块可以包括输入输出模块和运算模块,将所述串行指令队列形成与所述并行模块对应的多个并行的程序指令队列可以包括:在操作s1110,形成与所述输入输出模块对应的输入输出指令队列;以及,在操作s1120,形成与所述运算模块相对应的运算指令队列。在上面的指令中,move指令为输入输出指令,而add和sub指令为运算指令。
[0037][0038]
表1
[0039]
在表1中,分为两个队列,即io指令队列(从模块的角度来看,也可以称为io模块指令队列)和运算指令队列(从模块的角度来看,也可以称为运算模块指令队列)。
[0040]
首先,在步骤1-1,可以将move a1,a1加入到io模块指令队列中,此时io模块指令队列仅包括该指令;而运算模块指令队列为空。
[0041]
接下来,在步骤1-2,可以将move a2,a2添加到io模块指令队列,由此io模块指令队列包括了两条指令move a1,a1和move a2,a2。运算模块指令队列为空。
[0042]
接下来,类似地,在步骤1-3,可以将add a3,a1,a2添加到运算模块指令队列。
[0043]
在步骤1-4,将move a3,a3添加到io模块指令队列。
[0044]
在步骤1-5,将sub a4,a1,a3添加到运算模块指令队列。
[0045]
在步骤1-6,将move a4,a4添加到io模块指令队列。
[0046]
从上面的表1中可以看出,可以将串行指令队列中的io指令添加到io模块指令队列,而将运算指令添加到运算模块指令队列。但是,从表1中也可以看到,某些指令之间存在着相互依赖关系。
[0047]
例如,运算指令add a3,a1,a2与io指令move a1,a1和move a2,a2之间存在依赖关系,必须等待io指令move a1,a1和move a2,a2执行完毕之后才可以执行运算指令add a3,a1,a2,否则运算会发生错误或者无法进行。
[0048]
因此,对于并行指令队列中的多个程序指令而言,可以确定在前程序指令与在后程序指令之间是否存在依赖关系。
[0049]
需要理解的是,操作s110和操作s130之间并不必然存在先后关系,即可以先将串
行指令队列形成与所述并行模块对应的多个并行的程序指令队列,之后再判断每个程序指令之间是否存在依赖关系;或者,可以先执行操作s130,即直接在串行指令队列中确定每个程序指令之间是否存在依赖关系;可选地,在另一个实施方式中,操作s110和操作s130可以并行或者同时地执行。
[0050]
在确定了指令之间的依赖关系之后,可以控制存在依赖关系的在后程序指令等待在前程序指令执行完毕之后再执行。
[0051]
根据本公开的一个实施方式,控制在后程序指令等待在前程序指令执行完毕可以包括:在存在依赖关系的程序指令之间插入同步指令,以使得在后程序指令等待在前和执行指令执行完毕之后再执行。下面以表2为例来进行说明。
[0052]
[0053]
[0054][0055]
表2
[0056]
在表2中,io模块指令队列和运算模块指令队列与表1中相似,区别在于在表2中添加了同步指令队列。在一个示例性实施方式中,该同步指令可以为wait指令。
[0057]
首先,在步骤2-1,可以将move a1,a1加入到io模块指令队列中,此时io模块指令队列仅包括该指令;而运算模块指令队列为空。
[0058]
接下来,在步骤2-2,可以将move a2,a2添加到io模块指令队列,由此io模块指令队列包括了两条指令move a1,a1和move a2,a2。运算模块指令队列为空。
[0059]
在步骤2-3,可以将add a3,a1,a2添加到运算模块指令队列。指令add a3,a1,a2与之前的指令move a1,a1和move a2,a2之间存在依赖关系,指令add a3,a1,a2使用了空间a1和a2中的内容,因此指令在后指令add a3,a1,a2需要等待在前指令move a1,a1和move a2,a2执行完毕再执行。在此情况下,需要在指令add a3,a1,a2插入同步指令,例如wait。
[0060]
需要说明的是,这里所述的“空间”也可以是一个立即数、寄存器或其他存储单元指向的地址空间,用空间仅仅用于表示该符号(例如a1,a1等)处可以为运算所需的数据,而不能被理解或限制为具体或虚拟的空间。
[0061]
需要理解的是,在具有相互依赖关系的指令之间插入同步指令包含多种实施方式。在一个实施方式中,在具有相互依赖关系的输入输出指令和运算指令之间插入至少一个同步指令,其中,输入输出指令为输入输出指令队列中的指令,运算指令为运算指令队列中的指令。例如,可以在add a3,a1,a2与move a1,a1之间插入同步指令,并且在add a3,a1,a2与move a2,a2之间插入同步指令。
[0062]
在另一个实施方式中,可以在相邻的存在依赖关系的程序指令之间插入同步指令。对于本公开的技术方案而言,在串行队列中,由于指令move a2,a2与指令add a3,a1,a2更接近,因此可以仅在add a3,a1,a2与move a2,a2之间插入同步指令。这样的方式有利于减少插入的同步指令的数量,精简指令的操作,从而提升指令的执行效率。表2中以该实施方式举例说明指令的插入方式。
[0063]
在步骤2-4,将move a3,a3添加到io模块指令队列。同样地,由于指令add a3,a1,a2与指令move a3,a3之间存在依赖关系,因此需要在指令move a3,a3之前插入同步指令,换言之,可以在指令add a3,a1,a2与指令move a3,a3之间插入同步指令。
[0064]
在步骤2-5,将sub a4,a1,a3添加到运算模块指令队列。
[0065]
在步骤2-6,将move a4,a4添加到io模块指令队列。由于指令move a4,a4与指令sub a4,a1,a3之间存在依赖关系,因此需要在move a4,a4之前添加同步之前,换言之,可以在指令move a4,a4与指令sub a4,a1,a3之间添加同步指令。
[0066]
通常,对于同一个指令队列中的两个程序指令,即使二者之间存在依赖关系,他们
之间也可以不添加同步指令,因为同一个队列中的程序指令是串行执行的;换言之,根据本公开的一个实施方式,需要在处于不同程序指令队列的、存在依赖关系的程序指令之间插入同步指令。
[0067]
这里所述的不同程序指令队列,可以是指对应于不同并行模块的指令队列,也可以是指对应于不同并行单元的指令队列。
[0068]
根据本公开的一个实施方式,可以将所述同步指令之前的程序指令删除。表3示出了根据本公开的一个实施方式的指令队列图。
[0069]
[0070]
[0071][0072]
表3
[0073]
在表3中,io模块指令队列和运算模块指令队列与表1以及表2中的队列均有所不同。在表1和表2中,并不删除指令队列中的任何指令,而在表3所示的实施方式中,需要删除同步指令之前的所有指令。
[0074]
首先,在步骤3-1,可以将move a1,a1加入到io模块指令队列中,此时io模块指令队列仅包括该指令;而运算模块指令队列为空。
[0075]
接下来,在步骤3-2,可以将move a2,a2添加到io模块指令队列,由此io模块指令队列包括了两条指令move a1,a1和move a2,a2。指令move a1,a1与move a2,a2之间并不存在相互依赖关系,因此这两个指令之间无需插入同步指令。此时,运算模块指令队列为空。
[0076]
接下来,在步骤3-3,可以将add a3,a1,a2添加到运算模块指令队列。指令add a3,a1,a2使用了空间a1和a2,因此指令add a3,a1,a2与move a1,a1和move a2,a2存在依赖关系。而指令空间a1和a2的定值语句move a1,a1和move a2,a2在io模块指令队列中,因此需
要在指令add a3,a1,a2之前插入同步指令,从而等待指令move a1,a1和move a2,a2执行完之后再执行add a3,a1,a2。
[0077]
在步骤3-3中,当指令move a1,a1和move a2,a2执行完之后,可以清除同步指令之前的io模块指令队列和运算模块指令队列中的指令。从而在此情况下,io模块指令队列中为空,而运算模块指令队列中的指令为add a3,a1,a2。
[0078]
在步骤3-4,将move a3,a3添加到io模块指令队列。指令move a3,a3使用了空间a3,因此指令move a3,a3与指令add a3,a1,a2存在依赖关系,因此需要在指令move a3,a3之前插入同步指令,从而等待指令add a3,a1,a2执行完之后再执行move a3,a3。
[0079]
在步骤3-4中,当指令add a3,a1,a2执行完之后,可以清除同步指令之前的io模块指令队列和运算模块指令队列中的指令。从而在此情况下,io模块指令队列中的指令为move a3,a3,而运算模块指令队列中的指令为空。
[0080]
在步骤3-5,将sub a4,a1,a3添加到运算模块指令队列。需要说明的是,空间a1和a3的定值语句已经不在io模块指令队列中了(被删除了),因此此时两个模块队列中指令可以并行执行。
[0081]
在步骤3-6,将move a4,a4添加到io模块指令队列。指令sub a4,a1,a3使用了空间a1,a3中的内容来得到空间a4中的内容,因此指令move a4,a4需要等待sub a4,a1,a3执行完毕。因此,可以在指令move a4,a4之前添加同步指令,从而等待指令sub a4,a1,a3执行完毕之后再执行指令move a4,a4。
[0082]
在步骤3-6中,可以清空io模块指令队列和运算模块指令队列中的指令,从而在此情况下,io模块指令队列中的指令为move a4,a4,而运算模块指令队列中的指令为空。
[0083]
在表3所示的实施方式中,每个同步指令之前的指令会被清除,这使得同步指令之后的其他指令不会与同步指令之前的指令发生冲突,并且缩短了指令队列的队列长度,精简了指令的执行。
[0084]
根据本公开的一个实施方式,本公开的方法进一步包括:生成新的串行指令队列,以便于能够对所述新的串行指令队列并行地执行。
[0085]
当在指令之间插入了同步指令之后,可以在生成新的串行指令队列。以本公开上述的指令队列为例,插入同步指令之后生成的串行指令队列如下:
[0086]
1 move a1,a1
[0087]
2 move a2,a2
[0088]
3 wait
[0089]
4 add a3,a1,a2
[0090]
5 wait
[0091]
6 move a3,a3
[0092]
7 sub a4,a1,a3
[0093]
8 wait
[0094]
9 mov a4,a4
[0095]
在上面的串行指令队列中,在具有相互依赖关系的指令move a2,a2和add a3,a1,a2之间插入了同步指令,例如wait指令;在具有相互依赖关系的指令add a3,a1,a2和move a3,a3之间插入了同步指令wait;以及在具有相互依赖关系的指令sub a4,a1,a3和mov a4,
a4之间插入了同步指令wait。这使得该串行指令队列在被分配到不同的并行模块上时仍然能够保持正常的运行而不会发生指令之间的冲突。
[0096]
上文中的描述以计算模块和io模块并行为例进行了说明,还存在计算模块包括多个并行计算单元的情形,例如
[0097]
1 sub a3,a1,a2;
[0098]
2 sub a4,a5,a6;
[0099]
3 add a7,a3,a4;
[0100]
4 move a7,a7;
[0101]
在上述队列中,假设减法运算需要计算模块中的减法单元来执行,加法运算需要计算模块中的加法单元来执行,二者处于并行的关系,则需要首先确定这并行的指令之间是否存在依赖关系。在上面的指令队列中可以看出,指令3 add a7,a3,a4与指令1 sub a3,a1,a2之间存在依赖关系,指令3 add a7,a3,a4与指令2 sub a4,a5,a6之间也存在依赖关系。由此,当将这样的运算指令映射到并行的运算单元时,也需要在这些指令之间插入同步指令,例如wait指令。就上述的指令队列而言,需要在指令2与指令3之间插入同步指令。
[0102]
同样地,当一个指令队列中存在多个存在依赖关系的输入输出指令,并且要将这些输入输出指令映射到并行的输入输出单元上时,也需要在这些输入输出指令之间插入同步指令。这里将不再详述。
[0103]
对于一个程序而言,上面描述的串行指令队列可以处于同一个基本块(basic block)中;或者该串行指令队列也可以被划分为多个基本块。
[0104]
图3示出了一个包含多个基本块的程序的示意图。
[0105]
如图3所示,该程序可以包括基本块b1、b2、b3和b4,其中基本块b1的输出与基本块b2的输入连接,基本块b2的输出与基本块b3和基本块b4的输入连接,而基本块b3的输出可以返回到基本块b2。需要理解的是,这里所述的“连接”仅仅旨在于表达一种数据的流向关系,而不表明基本块之间具有物理或介质连接。
[0106]
可以根据控制流图(control flow graph,cfg)来确定多个基本块之间的关系。cfg是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向,也能反映一个过程的实时执行过程。
[0107]
基本块分为前驱基本块和后继基本块,二者是个相对的概念,即在控制流图中处于上游的基本块为前驱基本块,而处于下游的基本块为后继基本块。
[0108]
根据基本块之前的前后关系,每个基本块中的程序可以分为输入指令队列和输出指令队列。在本文中,输入指令队列和输出指令队列的命名是为了表明每个基本块与其他基本块之间的输入输出关系,对于单个基本块而言,每个输入指令队列可以包括一部分的io指令队列和运算指令队列;同样地,每个输出指令队列可以包括一部分的io指令队列和运算指令队列。
[0109]
图4示出了根据本公开一个实施方式的在多个基本块环境下根据并行架构来编译串行指令队列的方法流程图。
[0110]
如图4所示,上述方法包括:在操作s410,确定所述多个基本块中的前驱基本块和后继基本块;在操作s420,将前驱基本块中的输出指令队列传播到所述后继基本块的输入
指令队列中,直至所述后继基本块的输入指令队列不再变化为止。
[0111]
下面结合如下示例来详细地描述图3所示的控制流图以及图4所示的方法。
[0112]
图3中bb的rpo顺序是:b1,b2,b4,b3,其中,
[0113]
b1:
[0114]
s1:mov i,0; //标量i=0
[0115]
s2:mov a1,a1[0];
[0116]
s3:mov a2,a2[0];
[0117]
b2:
[0118]
s4:add a3,a1 a2;
[0119]
s5:mov a3[i],a3;
[0120]
s6:beq b4,i,16; //如果i==16,则跳转到b4
[0121]
b3:
[0122]
s7:add i,i,1; //标量i=i 1
[0123]
s8:mov a1,a1[i];
[0124]
s9:mov a2,a2[i];
[0125]
s10:jump b2;
[0126]
b4:
[0127]
s11:return。
[0128]
下面结合表4来详细介绍队列的变化。
[0129]
[0130][0131]
表4
[0132]
如表4所示,在基本块b1中,输入指令队列中的io指令队列为空,运算指令队列为空;而输出指令队列中的io指令队列包括{s2,s3};运算指令队列为空;基本块b1的后继基本块为b2。在此情况下,需要将基本块b1的输出指令队列传递到其后继基本块b2的输入指令队列,因此基本块b2的输入指令队列发生了变化。
[0133]
在基本块b2中,输入指令队列中的io指令队列为{s2,s3},该指令队列{s2,s3}是从基本块b1传递而来的,运算指令队列为空;而基本块b2的输出指令队列中的io指令队列为{s5},运算指令队列为空;基本块b2的后继基本块为b3和b4。因此,基本块b2的输入指令队列发生了变化,在本技术中标记为“changed=true”。在此情况下,需要将基本块b2的输
出指令队列传递到其后继基本块b3和b4的输入指令队列,因此基本块b3和b4的输入指令队列发生了变化。
[0134]
在基本块b4中,其输入指令队列中的io指令队列为{s5},其是从基本块b2传递而来的,运算指令队列为空;而基本块b4的输出指令队列中的io指令队列为{s5},运算指令队列为空;基本块b4的后继基本块为空,因此基本块b4无需将其输出指令队列{s5}向下传递。基本块b4的输入指令队列发生了变化,在本技术中标记为“changed=true”。
[0135]
在基本块b3中,其输入指令队列中的io指令队列为{s5},其是从基本块b2传递而来的,运算指令队列为空;而基本块b3的输出指令队列中的io指令队列为{s8,s9},运算指令队列为空。基本块b3的输入指令队列发生了变化,在本技术中标记为“changed=true”。基本块b3的后继基本块为b2。在此情况下,需要将基本块b3的输出指令队列传递到其后继基本块b2的输入指令队列,因此基本块b2的输入指令队列变化为{s8,s9,s2,s3},在本技术中标记为“changed=true”。
[0136]
需要理解的是,优选地,一旦某一个或多个基本块被标记为“changed=true”,则所有基本块都可以被标记为“changed=true”,因为需要当所有基本块都被标记为“changed=false”时才停止迭代。
[0137]
可替换地,可以根据某次迭代中该基本块中的输入队列实际上是否发生改变来标记为“changed=true”或者“changed=false”,但即使在此情况下,也需要当所有基本块都被标记为“changed=false”时才停止迭代。
[0138]
如表4所示,基本块b1-b4的输入指令队列均发生了变化,因此需要进一步的迭代。
[0139]
表5示出了根据本公开一个实施方式的基本块内指令队列的变化情况。
[0140]
[0141][0142]
表5
[0143]
如表5所示,在基本块b1中,输入指令队列中的io指令队列为空,运算指令队列为空;而输出指令队列中的io指令队列包括{s2,s3};运算指令队列为空。基本块b1的输入指令队列保持不变,所以在本情况下中标记为“changed=false”。基本块b1的后继基本块为b2。在此情况下,需要将基本块b1的输出指令队列传递到其后继基本块b2的输入指令队列,但此时基本块b2的输入执行队列中已经包含了指令{s2,s3},因此基本块b2的输入指令队列不再发生变化。
[0144]
在基本块b2中,输入指令队列中的io指令队列为{s8,s9,s2,s3},运算指令队列为空;而基本块b2的输出指令队列中的io指令队列为{s5},运算指令队列为空;基本块b2的后继基本块为b3和b4。如上文所述,基本块b2的输入指令队列不再发生变化,所以在本情况下中标记为“changed=false”。
[0145]
在此情况下,需要将基本块b2的输出指令队列传递到其后继基本块b3和b4的输入指令队列,但此时基本块b3和b4的输入指令队列中已经包含了从b2传递而来的指令队列,因此基本块b3和b4的输入指令队列不发生变化。在本情况下中标记为“changed=false”。
[0146]
在基本块b4中,其输入指令队列中的io指令队列为{s5},运算指令队列为空;而基本块b4的输出指令队列中的io指令队列为{s5},运算指令队列为空;基本块b4的后继基本块为空,因此基本块b4无需将其输出指令队列{s5}向下传递。如上文所述,基本块b4的输入指令队列不再发生变化,因此在本情况下中标记为“changed=false”。
[0147]
在基本块b3中,其输入指令队列中的io指令队列为{s5},运算指令队列为空;而基本块b3的输出指令队列中的io指令队列为{s8,s9},运算指令队列为空。基本块b3的后继基本块为b2。如上文所述,基本块b3的输入指令队列不再发生变化,因此在本情况下中标记为“changed=false”。
[0148]
需要将基本块b3的输出指令队列传递到其后继基本块b2的输入指令队列。但基本块b2的输入指令队列为{s8,s9,s2,s3},其包含了b3的输出指令队列,因此在本情况下标记为“changed=true”。
[0149]
经过上述迭代之后,各个基本块中的输入队列均不再发生变化,即所有标记“changed”均被标记为“false”。
[0150]
当各个基本块的输入指令队列不再发生变化时,可以如上文中那样在具有相互依赖关系的程序指令之间插入同步指令。
[0151]
仍然以s1-s11所示的程序指令为例来进行说明。当插入同步指令之后,最终的指令序列如下:
[0152]
b1:
[0153]
s1:mov i,0; //标量i=0
[0154]
s2:mov a1,a1[0];
[0155]
s3:mov a2,a2[0];
[0156]
b2:
[0157]
同步;
[0158]
s4:add a3,a1 a2;
[0159]
同步;
[0160]
s5:mov a3[i],a3;
[0161]
s6:beq b4,i,16; //if i==16,jump b4
[0162]
b3:
[0163]
s7:add i,i,1; //标量i=i 1
[0164]
s8:mov a1,a1[i];
[0165]
s9:mov a2,a2[i];
[0166]
s10:jump b2;
[0167]
b4:
[0168]
s11:return; //程序返回
[0169]
在所生成的上述指令队列中,指令s4:add a3,a1 a2与指令s2:mov a1,a1[0]以及s3:mov a2,a2[0]具有依赖关系,指令s4必须等待指令s2和s3执行完毕,因此可以在指令s3
和指令s4之间插入同步指令。
[0170]
更进一步地,指令s5:mov a3[i],a3与指令s4:add a3,a1 a2存在依赖关系,因此可以在指令s5与指令s4之间插入同步指令。
[0171]
更进一步地,如结合表3所讨论的那样,同步指令之前的指令会被删除,因此当执行指令s7时,指令s1已被删除;而当执行指令s8和s9时,指令s2和s3已被删除,指令s8和s9与指令s2和s3之间不存在冲突。
[0172]
根据本公开的一个实施方式,上述的同步指令可以是sync硬件指令,这不同于现有技术中采用的sync-handler方案。
[0173]
美国专利us8352924b2公开了一种用于多核指令集仿真的方法和设备(method and device for multi-core instruction-set simulation),其仿真了多核处理器之间的同步问题。但是,上述美国专利与本公开的技术方案存在如下区别:
[0174]
a)美国专利针对的是处理多核的同步问题,而当前申请所机载的方法是用于单核处理器的,处理的是一个核内多个并行的指令队列。
[0175]
b)美国专利是一种静态加动态的处理方式,而当前专利是一种静态分析。美国专利需要静态分析程序并且加上动态时,从而在sync-halder中处理同步。而本公开仅仅需要在静态时分析依赖关系并插入sync硬件指令,并没有动态行为。
[0176]
c)美国专利是一种模拟器相关的,注重的是同步的功能,而且该功能会导致运行时的性能降低,而本技术的目的是提升运行时指令的性能。
[0177]
d)美国专利是插入sync-handler去处理同步问题,而本技术使用sync硬件指令。sync-handler是一个专门用来处理同步的处理函数,它需要更多的信息,通过分析这些信息从而做出同步动作;而本公开所采用的硬件指令仅执行同步动作,而无需更多的信息。
[0178]
e)美国专利中的sync-pointer指的是有可能的同步点,等到运行时在sync-handle分析依赖处理同步;而本技术是在静态分析出指令的依赖,从而确定能否同步,这与上述美国专利具有本质区别。
[0179]
中国专利cn103003796b也公开了一种线程级推测中的动态数据同步技术,然后该中国专利是一种硬件技术,决定串行指令可以并行执行的时机是在运行时由硬件分析的,而本技术是一种编译时静态软件分析技术,可以在编译时就能决定串行指令能否并行执行。
[0180]
本公开还提供了一种电子设备,包括:一个或多个处理器;以及存储器,所述存储器中存储有计算机程序指令,当所述计算机程序指令由所述一个或多个处理器运行时,使得所述电子设备执行如上所述的方法。
[0181]
本公开还提供一种计算机可读存储介质,包括计算机程序指令,当所述计算机程序指令由一个或多个处理器运行时,执行如上所述的方法。
[0182]
本公开的技术方案可应用于人工智能领域,实现为或者实现在人工智能芯片中。该芯片可以单独存在,也可以包含在计算装置中。
[0183]
本技术提出的优化方案,通过编译器对串行语义语句进行数据依赖分析,在有依赖的语句之间加上同步控制语句使之串行执行以保证数据依赖的正确性。对于没有依赖的语句,生成并行指令,使之可以并行执行。
[0184]
图5示出了一种组合处理装置500,其包括上述的计算装置502,通用互联接口504,
和其他处理装置506。根据本公开的计算装置与其他处理装置进行交互,共同完成用户指定的操作。图5为组合处理装置的示意图。
[0185]
其他处理装置,包括中央处理器cpu、图形处理器gpu、神经网络处理器等通用/专用处理器中的一种或以上的处理器类型。其他处理装置所包括的处理器数量不做限制。其他处理装置作为机器学习运算装置与外部数据和控制的接口,包括数据搬运,完成对本机器学习运算装置的开启、停止等基本控制;其他处理装置也可以和机器学习运算装置协作共同完成运算任务。
[0186]
通用互联接口,用于在计算装置(包括例如机器学习运算装置)与其他处理装置间传输数据和控制指令。该计算装置从其他处理装置中获取所需的输入数据,写入该计算装置片上的存储装置;可以从其他处理装置中获取控制指令,写入计算装置片上的控制缓存;也可以读取计算装置的存储模块中的数据并传输给其他处理装置。
[0187]
可选的,该结构还可以包括存储装置508,存储装置分别与所述计算装置和所述其他处理装置连接。存储装置用于保存在所述计算装置和所述其他处理装置的数据,尤其适用于所需要运算的数据在本计算装置或其他处理装置的内部存储中无法全部保存的数据。
[0188]
该组合处理装置可以作为手机、机器人、无人机、视频监控设备等设备的soc片上系统,有效降低控制部分的核心面积,提高处理速度,降低整体功耗。此情况时,该组合处理装置的通用互联接口与设备的某些部件相连接。某些部件譬如摄像头,显示器,鼠标,键盘,网卡,wifi接口。
[0189]
在一些实施例里,本披露还公开了一种芯片封装结构,其包括了上述芯片。
[0190]
在一些实施例里,本披露还公开了一种板卡,其包括了上述芯片封装结构。参阅图6,其提供了一种示例性的板卡,上述板卡除了包括上述芯片602以外,还可以包括其他的配套部件,该配套部件包括但不限于:存储器件604、接口装置606和控制器件608。
[0191]
所述存储器件与所述芯片封装结构内的芯片通过总线连接,用于存储数据。所述存储器件可以包括多组存储单元610。每一组所述存储单元与所述芯片通过总线连接。可以理解,每一组所述存储单元可以是ddr sdram(英文:double data rate sdram,双倍速率同步动态随机存储器)。
[0192]
ddr不需要提高时钟频率就能加倍提高sdram的速度。ddr允许在时钟脉冲的上升沿和下降沿读出数据。ddr的速度是标准sdram的两倍。在一个实施例中,所述存储装置可以包括4组所述存储单元。每一组所述存储单元可以包括多个ddr4颗粒(芯片)。在一个实施例中,所述芯片内部可以包括4个72位ddr4控制器,上述72位ddr4控制器中64bit用于传输数据,8bit用于ecc校验。在一个实施例中,每一组所述存储单元包括多个并联设置的双倍速率同步动态随机存储器。ddr在一个时钟周期内可以传输两次数据。在所述芯片中设置控制ddr的控制器,用于对每个所述存储单元的数据传输与数据存储的控制。
[0193]
所述接口装置与所述芯片封装结构内的芯片电连接。所述接口装置用于实现所述芯片与外部设备612(例如服务器或计算机)之间的数据传输。例如在一个实施例中,所述接口装置可以为标准pcie接口。比如,待处理的数据由服务器通过标准pcie接口传递至所述芯片,实现数据转移。在另一个实施例中,所述接口装置还可以是其他的接口,本披露并不限制上述其他的接口的具体表现形式,所述接口单元能够实现转接功能即可。另外,所述芯片的计算结果仍由所述接口装置传送回外部设备(例如服务器)。
[0194]
所述控制器件与所述芯片电连接。所述控制器件用于对所述芯片的状态进行监控。具体的,所述芯片与所述控制器件可以通过spi接口电连接。所述控制器件可以包括单片机(micro controller unit,mcu)。如所述芯片可以包括多个处理芯片、多个处理核或多个处理电路,可以带动多个负载。因此,所述芯片可以处于多负载和轻负载等不同的工作状态。通过所述控制装置可以实现对所述芯片中多个处理芯片、多个处理和/或多个处理电路的工作状态的调控。
[0195]
在一些实施例里,本披露还公开了一种电子设备或装置,其包括了上述板卡。
[0196]
电子设备或装置包括数据处理装置、机器人、电脑、打印机、扫描仪、平板电脑、智能终端、手机、行车记录仪、导航仪、传感器、摄像头、服务器、云端服务器、相机、摄像机、投影仪、手表、耳机、移动存储、可穿戴设备、交通工具、家用电器、和/或医疗设备。
[0197]
所述交通工具包括飞机、轮船和/或车辆;所述家用电器包括电视、空调、微波炉、冰箱、电饭煲、加湿器、洗衣机、电灯、燃气灶、油烟机;所述医疗设备包括核磁共振仪、b超仪和/或心电图仪。
[0198]
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本披露并不受所描述的动作顺序的限制,因为依据本披露,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本披露所必须的。
[0199]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0200]
在本披露所提供的几个实施例中,应该理解到,所披露的装置,可通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性、光学、声学、磁性或其它的形式。
[0201]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0202]
另外,在本披露各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。
[0203]
所述集成的单元如果以软件程序模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,当本披露的技术方案可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本披露各个实施例所述方法的全部或部分步骤。而前述的存储器包括:u盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、移动硬盘、磁碟或者光盘等各种可以存储
程序代码的介质。
[0204]
以上对本披露实施例进行了详细介绍,本文中应用了具体个例对本披露的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本披露的方法及其核心思想;同时,对于本领域的一般技术人员,依据本披露的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本披露的限制。
[0205]
通过以下条款,可以对本公开的技术方案有更好的理解:
[0206]
条款1.一种根据并行架构来编译串行指令队列的方法,其中所述串行指令队列包括多个程序指令,所述并行架构包括多个并行模块,用于执行所述程序指令,所述方法包括:
[0207]
将所述串行指令队列形成与所述并行模块对应的多个并行的程序指令队列;
[0208]
确定在前程序指令与在后程序指令之间是否存在依赖关系;
[0209]
响应于在前程序指令与在后程序指令之间存在依赖关系,控制在后程序指令等待在前程序指令执行完毕之后可执行。
[0210]
条款2.根据条款1所述的方法,其中,所述程序指令包括输入输出指令和运算指令,所述并行模块包括输入输出模块和运算模块,将所述串行指令队列形成与所述并行模块对应的多个并行的程序指令队列包括:
[0211]
形成与所述输入输出模块对应的输入输出指令队列;以及
[0212]
形成与所述运算模块相对应的运算指令队列。
[0213]
条款3.根据条款2所述的方法,其中,
[0214]
所述输入输出模块包括多个并行的输入输出单元;和/或
[0215]
所述运算模块包括多个并行的运算单元。
[0216]
条款4.根据条款1-3中任意一项所述的方法,其中,控制在后程序指令等待在前程序指令执行完毕包括:
[0217]
在存在依赖关系的程序指令之间插入同步指令,以使得在后程序指令等待在前和执行指令执行完毕之后再执行。
[0218]
条款5.根据条款4所述的方法,其中,在存在依赖关系的程序指令之间插入同步指令包括:在相邻的存在依赖关系的程序指令之间插入同步指令,优选地,所述同步指令为sync硬件指令。
[0219]
条款6.根据条款4或5所述的方法,其中,在处于不同程序指令队列的、存在依赖关系的程序指令之间插入同步指令。
[0220]
条款7.根据条款4-6中任意一项所述的方法,其中,将所述同步指令之前的程序指令删除。
[0221]
条款8.根据条款1-7中任意一项所述的方法,进一步包括:生成新的串行指令队列,以便于能够对所述新的串行指令队列并行地执行。
[0222]
条款9.根据条款1-8中任意一项所述的方法,其中,
[0223]
所述串行指令队列处于同一个基本块中;或者
[0224]
所述串行指令队列被划分为多个基本块,所述基本块中的至少一个包括输入指令队列和输出指令队列。
[0225]
条款10.根据条款9所述的方法,进一步包括:响应于所述串行指令队列被划分为
多个基本块,
[0226]
确定所述多个基本块中的前驱基本块和后继基本块;
[0227]
将前驱基本块中的输出指令队列传播到所述后继基本块的输入指令队列中,直至所述后继基本块的输入指令队列不再变化为止。
[0228]
条款11.根据条款1-10中任意一项所述的方法,其中,所述方法用于单核处理器。
[0229]
条款12.一种电子设备,包括:
[0230]
一个或多个处理器;以及
[0231]
存储器,所述存储器中存储有计算机可执行指令,当所述计算机可执行指令由所述一个或多个处理器运行时,使得所述电子设备执行如条款1-11中任意一项所述的方法。
[0232]
条款13.一种计算机可读存储介质,包括计算机可执行指令,当所述计算机可执行指令由一个或多个处理器运行时,执行如条款1-11中任意一项所述的方法。
再多了解一些

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

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

相关文献