运算方法、装置及相关产品与流程

文档序号:26139072发布日期:2021-08-03 14:22阅读:58来源:国知局
运算方法、装置及相关产品与流程

本公开涉及信息处理技术领域,尤其涉及一种运算方法、装置及相关产品。



背景技术:

在人工智能技术领域,神经网络算法是最近非常流行的一种机器学习算法,在各种领域中都取得了非常好的效果,比如图像识别,语音识别,自然语言处理等。随着神经网络算法的发展,算法的复杂度也越来越高,为了提高识别度,模型的规模也在逐渐增大。



技术实现要素:

根据本公开的第一方面,提供了一种指令生成方法,所述方法包括:

接收计算图;

统计所述计算图中的调度节点,得到第一调度集合;

将所述第一调度集合中的并行节点合并为并行调度单元,得到包括并行调度单元的第二调度集合,其中,所述并行节点为符合并行执行条件的调度节点;

根据所述第二调度集合,生成指令。

根据本公开的第二方面,提供了一种指令生成装置,包括:

接收单元,用于接收计算图;

统计单元,用于统计所述计算图中的调度节点,得到第一调度集合;

合并单元,用于将所述第一调度集合中的并行节点合并为并行调度单元,得到包括并行调度单元的第二调度集合,其中,所述并行节点为符合并行执行条件的调度节点;

指令生成单元,用于根据所述第二调度集合,生成指令。

根据本公开的第三方面,提供了一种运算装置,包括:

处理器;

用于存储处理器可执行指令的存储器;

其中,所述处理器被配置为执行上述第一方面所述的方法。

根据本公开的第四方面,提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述第一方面所述的方法。

通过将第一调度集合中的并行节点合并为并行调度单元,从而得到包括并行调度单元的第二调度集合,并根据第二调度集合生成指令,根据本公开的各方面实施例的指令生成方法、装置及相关产品,能够生成可以并行执行的并行指令,从而便于对不存在依赖关系的数据段进行并行处理和计算,提升数据处理和计算的效率。

根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。

附图说明

包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本公开的示例性实施例、特征和方面,并且用于解释本公开的原理。

图1示出根据本公开一实施例的指令生成方法的流程图。

图2示出根据本公开一实施例的指令生成方法的流程图。

图3示出根据本公开一实施例的计算图。

图4示出根据本公开一实施例的指令生成方法的流程图。

图5示出根据本公开一应用示例的示意图。

图6示出根据本公开一实施例的指令生成装置的框图。

图7示出根据本公开一实施例的指令生成装置的框图。

具体实施方式

以下将参考附图详细说明本公开的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。

在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。

另外,为了更好的说明本公开,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本公开同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本公开的主旨。

深度学习算法的主体是神经网络,神经网络可以由一系列的基本操作按一定的拓扑结构连接组成,每个基本操作可以包含一个或多个输入、输出神经元,同时,神经元可以在操作之间共享。因此,在一种可能的实现方式中,可以将深度学习算法的执行过程表示为计算图。计算图中可以包括节点和连接节点的边,节点的数量和节点的边的数量均不受限定,根据深度学习算法的具体过程来确定。节点可以用于表示深度学习过程中执行的操作,例如卷积运算操作或批量标准化操作等。节点间的边可以用于表示神经元,可以用于表明节点间数据的走向。对于深度学习来说,经过训练的模型数据,也是深度学习所在神经网络的重要组成部分,例如卷积操作的权值等。将深度学习算法的输入数据输入计算图的起始节点,根据各节点间的边经过计算图中的节点完成运算,计算图可以输出深度学习的最终结果。

在深度学习过程中,由于计算图中的节点可以表示深度学习过程中执行的操作,因此,在一种可能的实现方式中,可以基于计算图中的节点,生成指令。由于计算图可能为有向图,因此计算图中的节点所代表的操作可能存在执行上的先后顺序,因此,在基于计算图生成指令的过程中,可以按照计算图的方向,依次对计算图中的节点生成相应的指令。

然而,由于生成的指令最终由硬件设备所执行,而硬件设备本身的结构和数据存储方式可能存在不同。因此,部分硬件设备在执行指令时,可以采用双缓冲技术,即对于不存在依赖关系的不同数据段之间的计算,可以通过双缓冲的方式,并行执行部分访存或是计算功能。此时如果采用上述公开实施例中提出的指令生成方式,即根据计算图的方向,依次对计算图中的节点生成相应的指令,那么硬件设备将不便于实现并行的访存或是计算,从而大大降低了计算和访存的速度,继而降低了设备的运算和工作效率。

为了提升硬件设备的工作效率,本实施例公开了一种指令生成方法的应用示例,在本示例中,可以在接收了计算图后,在生成指令之前,先对计算图内的节点按照操作执行的先后顺序进行编号,然后将符合并行执行条件的节点合并为并行单元,并将合并后的并行单元看作一个整体,按照其在计算图内的操作执行顺序进行编号。其中,符合并行执行条件的节点所执行的操作,在运算过程中可以通过硬件设备同时进行实现,且相互之间不影响。在将计算图中符合并行执行条件的节点合并为并行单元后,在基于合并后的计算图生成指令时,可以首先对并行单元生成指令,如果存在多个并行单元,此时可以按照并行单元的编号顺序依次对并行单元生成指令。在对并行单元生成指令的过程中,可以根据并行单元内包含的节点生成并行指令,即对同一个并行单元内的不同节点,其指令的执行先后顺序是相同的,可以在同一时间同时执行。在对并行单元生成指令后,可以按照计算图内的编号顺序,依次对剩余的节点生成指令。对于本技术方案来说,由于将可以并行执行操作的节点合并为并行单元,并依据此并行单元生成并行指令,因此,硬件设备在执行操作时,可以同时执行互不干扰的并行操作,从而可以便于执行并行的访存或运算过程,继而大大提升整个硬件设备的计算和访存的速度,继而提升了设备的运算和工作效率。

图1示出根据本公开一实施例的指令生成方法的流程图。该指令生成方法可以由终端设备或其它处理设备执行,其中,终端设备可以为用户设备(userequipment,ue)、移动设备、用户终端、终端、蜂窝电话、无绳电话、个人数字处理(personaldigitalassistant,pda)、手持设备、计算设备、车载设备、可穿戴设备等。在一些可能的实现方式中,该运算方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。如图所示,该方法可以包括:

步骤s11,接收计算图。

步骤s12,统计计算图中的调度节点,得到第一调度集合。

步骤s13,将第一调度集合中的并行节点合并为并行调度单元,得到包括并行调度单元的第二调度集合,其中,并行节点为符合并行执行条件的调度节点。

步骤s14,根据第二调度集合,生成指令。

上述步骤中,在一种可能的实现方式中,计算图中的调度节点可以代表计算图内的一个操作节点;在一种可能的实现方式中,计算图中的调度节点也可以代表计算图内某些可以顺序执行的多个操作节点所构成的操作节点集,该操作节点集中具体包含的操作节点数量和内容均不受限定,可以根据实际情况灵活决定。在一个示例中,在有向图中,部分可以顺序执行的多个操作节点所构成的操作节点集可以当成一个调度节点进行调度,可以顺序执行的多个操作节点可以是计算粒度很低的架构,其生成的指令也可以为一段连续的计算指令,可以利用顺序容器来保存,在一个示例中,这段指令可能是由标量构成的。比如,在一个示例中,计算图内可以通过多个相连的执行矩阵计算的操作节点,执行一个卷积操作,此时这多个相连的执行矩阵计算的操作节点,可以共同看作一个调度节点,此时可以基于此调度节点生成指令,即可以用矩阵粒度的指令来实现一个卷积操作,因为这些矩阵操作都是在矩阵运算单元上执行的,因此可以顺序执行,这种情况下,一个卷积的指令会被装在顺序容器中,而顺序容器就可以作为一个卷积算子的操作节点一样被硬件进行执行和调度。

由于调度节点可以是计算图内的某个操作节点,也可以是计算图中的操作节点集,因此,统计计算图中调度节点得到的第一调度集合,其包含的调度节点数量可以与计算图内包含的操作节点数量一致,也可以不一致。

并行节点可以为符合并行执行条件的调度节点,具体并行执行条件的条件内容不受限定,任何使得硬件可以同时实现两个调度节点对应操作的条件,均可以作为并行执行条件。其中,在一种可能的实现方式中,并行节点为符合并行执行条件的调度节点可以包括:

不同的并行节点对应的操作被执行时,执行操作的资源不一致。

由于硬件设备在执行调度节点对应的操作时需要消耗硬件资源,如占用运算器等,因此,在一种可能的实现方式中,可以通过判断两个调度节点在执行操作时的资源是否一致,来判断调度节点是否符合并行条件,此时,在一个示例中,可以通过判断不同的调度节点所对应的操作被执行时,其执行操作的资源是否一致,来判断这些调度节点是否为并行节点。

由于调度节点可以是计算图中的一个操作节点,也可以是顺序执行的多个操作节点所构成的操作节点集,而并行节点可以为符合并行执行条件的调度节点。因此,在一种可能的实现方式中,并行节点可以是计算图中符合并行执行条件的n个操作节点,n的数量不受限定,可以根据实际情况灵活确定;在一个示例中,并行节点可以为计算图中符合并行执行条件的2个操作节点,分别记为操作节点a和操作节点b,其中,操作节点a和操作节点b所对应的操作,可以通过硬件设备同时执行且互不影响;在一个示例中,并行节点也可以为计算图中符合并行执行条件的5个操作节点,分别记为操作节点a、操作节点b、操作节点c、操作节点d和操作节点e,其中,操作节点a到操作节点e所分别对应的5种操作,可以通过硬件设备同时执行且互不影响。在一种可能的实现方式中,并行节点也可以是计算图中符合并行执行条件的n个由可以顺序执行的多个操作节点所构成的操作节点集,n的数量同样不受限定,可以根据实际情况灵活确定,同时,每个操作节点集中包含的操作节点数量也不受限制,同样根据实际情况灵活决定;在一个示例中,并行节点可以为计算图中符合并行执行的2个操作节点集,分别记为操作节点集a和操作节点集b,其中,操作节点集a可以由2个可以顺序执行的操作节点1和操作节点2构成,操作节点集b可以由3个可以顺序执行的操作节点3、操作节点4和操作节点5构成,操作节点集a执行操作时,可以按顺序执行操作节点1和操作节点2所对应的操作,操作节点集b执行操作时,可以按顺序分别执行操作节点3、操作节点4和操作节点5所对应的操作,在本公开实施例中,由于操作节点集a和操作节点集b符合并行执行条件,因此硬件设备可以同时实现操作节点集a和操作节点集b的操作,且操作节点集a和操作节点集b在执行操作时,相互之间不产生影响;在一个示例中,并行节点可以为计算图中符合并行执行的3个操作节点集,分别记为操作节点集a、操作节点集b和操作节点集c,其中,操作节点集a可以由2个可以顺序执行的操作节点1和操作节点2构成,操作节点集b可以由3个可以顺序执行的操作节点3、操作节点4和操作节点5构成,操作节点集c可以由5个可以顺序执行的操作节点6、操作节点7、操作节点8、操作节点9和操作节点10构成,操作节点集a执行操作时,可以按顺序执行操作节点1和操作节点2所对应的操作,操作节点集b执行操作时,可以按顺序分别执行操作节点3、操作节点4和操作节点5所对应的操作,操作节点集c执行操作时,可以按顺序分别执行操作节点6至操作节点10所对应的操作;在本公开实施例中,由于操作节点集a、操作节点集b和操作节点集c符合并行执行条件,因此硬件设备可以同时实现操作节点集a、操作节点集b和操作节点集c的操作,且操作节点集a、操作节点集b和操作节点集c在执行操作时,相互之间不产生影响。在一种可能的实现方式中,并行节点也可以同时包含计算图中符合并行执行条件的n1个操作节点和n2个操作节点集,n1和n2的数量同样不受限定,可以根据实际情况灵活确定,同时,每个操作节点集中包含的操作节点数量也不受限制,同样根据实际情况灵活决定;在一个示例中,并行节点可以为计算图中符合并行执行的1个操作节点和1个操作节点集,分别记为操作节点a和操作节点集b,其中,操作节点集b可以由2个可以顺序执行的操作节点1和操作节点2构成,操作节点集b执行操作时,可以按顺序执行操作节点1和操作节点2所对应的操作,在本公开实施例中,由于操作节点a和操作节点集b符合并行执行条件,因此硬件设备可以同时实现操作节点a和操作节点集b的操作,即硬件设备可以同时执行操作节点a的操作以及操作节点1至操作节点2的操作,且操作节点a和操作节点集b在执行操作时,相互之间不产生影响;在一个示例中,并行节点可以为计算图中符合并行执行的2个操作节点和1个操作节点集,分别记为操作节点a、操作节点b和操作节点集c,其中,操作节点集c可以由3个可以顺序执行的操作节点1、操作节点2和操作节点3构成,操作节点集c执行操作时,可以按顺序分别执行操作节点1、操作节点2和操作节点3所对应的操作;在本公开实施例中,由于操作节点a、操作节点b和操作节点集c符合并行执行条件,因此硬件设备可以同时实现操作节点a、操作节点b和操作节点集c的操作,且操作节点a、操作节点b和操作节点集c在执行操作时,相互之间不产生影响。

通过将第一调度集合中符合并行执行条件的调度节点合并为并行调度单元,从而得到包括并行调度单元的第二调度集合,并根据第二调度集合生成指令,根据本公开的各方面实施例的指令生成方法、装置及相关产品,能够生成可以并行执行的并行指令,从而便于对不存在依赖关系的数据段进行并行处理和计算,提升数据处理和计算的效率。

上述公开实施例中,步骤s11的实现方式不受限定,任何可以接收计算图的方式均可以作为步骤s11的实施方式,在此不再列举。步骤s12的实现方式同样不受限定,上述公开实施例中已经提出,调度节点可以是计算图中的单独操作节点,也可以是计算图中可以顺序执行的操作节点所构成的操作节点集,因此,随着调度节点形式的不同,步骤s12的实现方式同样可以随之适应性地发生变化。图2示出根据本公开一实施例的指令生成方法的流程图,如图所示,在一种可能的实现方式中,步骤s12可以包括:

步骤s121,统计计算图中的调度节点,其中,调度节点为符合调度条件的操作节点。

步骤s122,根据所有调度节点,得到第一调度集合。

上述公开实施例中已经提出,调度节点可以对应计算图中的一个操作节点或多个操作节点,因此,在一种可能的实现方式中,可以通过判断计算图中的操作节点是否符合调度条件,来完成对计算图中调度节点的统计。

调度条件的具体条件内容可以根据实际情况进行设定,在一种可能的实现方式中,调度节点为符合调度条件的操作节点可以包括:

调度节点对应的操作被执行时,执行操作的资源处于空闲状态,且调度节点的所有依赖操作节点均已生成指令;其中,依赖操作节点对应的输出数据,与调度节点对应的输入数据相关。

通过上述公开实施例可以看出,在一种可能的实现方式中,确定计算图中的某个或某几个操作节点是否可以作为调度节点,其需要满足的调度条件主要包括两个方面:其一为调度节点中包含的所有操作节点,其执行操作时需要的所有资源均为可用的。具体如何判断该调度节点中需要的所有资源是否可用,可以通过检查资源表的方式进行完成。在一种可能的实现方式中,资源表可以用于追踪在指令生成过程中资源的使用情况,在一个示例中,所有的硬件资源可以通过抽象方式进行定义,因此,每当选择了一个调度节点去执行相应的操作时,硬件资源可能会相应的发生变化,在一个示例中,在某一调度节点对应的操作被执行时,硬件资源中可能存在某一运算器被占用的情况,因此,可以将硬件资源通过抽象方式进行定义后,整合为资源表,这样可以通过检查资源表的方式,来检查调度节点在被执行时需要的所有资源是否均处于可用状态,如果通过检查资源表确定该调度节点在被执行时需要的所有资源均处于可用状态,则可以认为该调度节点符合调度条件的一个方面。

在一种可能的实现方式中,确定计算图中的某个或某几个操作节点是否可以作为调度节点,其需要满足的调度条件的另一方面可以为:调度节点不存在未完成的依赖节点。在一种可能的实现方式中,依赖节点对应的输出数据,与调度节点对应的输入数据相关,在一个示例中,在调度节点的依赖节点对应的操作被执行完成时,其得到的输出数据可以是调度节点对应的操作被执行时所需要的输入数据,或是调度节点对应的操作被执行时所需要的输入数据的前期准备数据。调度节点的依赖节点的种类和数量均不受限定,可以根据计算图的实际情况进行确定。图3示出根据本公开一实施例的计算图,如图所示,在一个示例中,对于由单一操作节点构成的调度节点来说,其依赖节点可以为与该调度节点的输入端连接或间接连接的操作节点,举例来说,对于图中的conv-0节点,当loadinput0节点和loadsynapse0两个节点对应的操作被执行后,conv-0节点对应的操作才可以执行,因此loadinput0节点与loadsynapse0可以作为conv-0节点的依赖节点,除此之外,从图中还可以看出,由于loadinput0节点对应的操作被执行时需要allocinput0节点对应的操作被执行完成,因此,allocinput0节点可以作为conv-0节点的依赖节点,也同时可以作为conv-0节点的依赖节点,同理,allocsynapse0节点可以同时作为loadsynapse0节点与conv-0节点的依赖节点。同时,conv-0节点又可以同时作为vadd-0节点、relinput0节点和relsynapse0节点的依赖节点。在一个示例中,如果调度节点由多个操作节点共同构成,则其依赖节点可以为与该调度节点的所有操作节点的输入端连接或间接连接的操作节点,如图3所示,在一个示例中,如果将loadinput0节点和conv-0节点二者共同看作一个调度节点,则由于loadinput0节点的输入与allocinput0节点相关,conv-0节点的输入与loadsynapse0节点和allocsynapse0节点相关,因此,allocinput0节点、allocsynapse0节点和loadsynapse0节点均可以作为loadinput0节点和conv-0节点二者共同构成的调度节点的依赖节点;在一个示例中,如果将conv-0节点和vadd-0节点二者共同看作一个调度节点,由于vadd-0节点的输入与conv-0节点相关,即与调度节点本身包含的操作节点相关,因此,此时vadd-0的依赖节点可以不作为该调度节点的依赖节点,而只将conv-0节点的依赖节点作为该调度节点的依赖节点,因此,由conv-0节点和vadd-0节点共同构成的调度节点,其依赖节点分别为allocinput0节点、allocsynapse0节点、loadinput0节点和loadsynapse0。

因此,在调度节点中满足上述两个条件时,其可以作为被统计的调度节点,继而通过步骤s122得到相应的第一调度集合。

步骤s122的实现方式同样不受限定,任何可以将所有统计的调度节点整合得到第一调度集合的方式,均可以作为步骤s122的实现方式。在一种可能的实现方式中,步骤s122可以包括:

按照计算图的方向,对调度节点进行标号,得到对应标号顺序的调度节点所构成的第一调度集合。

对于有向计算图来说,其图中的每个操作节点对应的操作被执行时,存在着与计算图的方向对应的执行顺序,因此,在一种可能的实现方式中,可以按照计算图的方向,对计算图中统计出的调度节点进行标号,从而构成对应标号顺序的调度节点所构成的第一调度集合,这样可以根据调度节点的标号,来确定调度节点对应操作的执行顺序,继而可以确定后续生成的指令的顺序。按照计算图的方向,对调度节点进行标号的方式不受限定,在一个示例中,可以按照计算图的方向,按照从小到大的顺序,对调度节点进行标号,继而得到第一调度集合,举例来说,该第一调度集合的形式可以为s=u1,u2,...un,其中,u1,u2,...un代表该第一调度集合包含的n个节点,n的数量不受限定,可以根据实际情况灵活确定,由于集合s内的调度节点为按照计算图的方向,按从小到大的顺序进行的标号,因此在第一调度集合s中,标号越小则可以表明该调度节点越早被收入到第一调度集合中,即该调度节点对应的操作越早被执行,即u1对应的操作被执行的顺序,不晚于u2对应的操作被执行的顺序。在一个示例中,也可以按照计算图的方向,按照从大到小的顺序,对调度节点进行标号,继而得到第一调度集合,举例来说,该第一调度集合的形式可以为s=u1,u2,...un,其中,u1,u2,...un代表该第一调度集合包含的n个节点,n的数量不受限定,可以根据实际情况灵活确定,由于集合s内的调度节点为按照计算图的方向,按从大到小的顺序进行的标号,因此在第一调度集合s中,标号越小则可以表明该调度节点越晚被收入到第一调度集合中,即该调度节点对应的操作越晚被执行,即u1对应的操作被执行的顺序,不早于u2对应的操作被执行的顺序。

在得到了第一调度集合后,可以通过步骤s13,将第一调度集合内的并行节点合并为并行调度单元,从而得到包括并行调度单元的第二调度集合。步骤s13的实现方式不受限定,图4示出根据本公开一实施例的指令生成方法的流程图,如图所示,在一种可能的实现方式中,步骤s13可以包括:

步骤s131,将第一调度集合中的并行节点合并为并行调度单元。

步骤s132,按照计算图的方向,对第一调度集合中的调度节点和并行调度单元进行标号,得到对应标号顺序的调度节点和并行调度单元所构成的第二调度集合。

步骤s131的实现方式不受限定,即将第一调度集合中的并行节点合并为并行调度单元的方式不受限定,任何可以将第一调度集合中的并行节点作为一个整体的调度单元进行调度的合并方式,均可以作为步骤s131的实现方式。在一种可能的实现方式中,可以通过将并行节点统计在同一集合中,并将此集合作为第一调度集合的子集合的方式,作为步骤s131的实现方式。上述公开实施例中已经提出,并行节点为符合并行执行条件的调度节点,在一种可能的实现方式中,符合并行执行条件的调度节点可以包括:不同的并行节点对应的操作被执行时,执行操作的资源不一致。由于可以执行操作的资源数量不受限制,同时操作的种类也不受限制,因此,可以同时执行的并行节点的数量,可以根据实际灵活确定,在此不受限制,因此,在本公开实施例中,一个并行调度单元内包含的并行节点数量不受限定。同时,在一种可能的实现方式中,第一调度集合可以仅包含一个并行调度单元,即第一调度集合内包含的并行节点,它们对应的操作仅可以在同一时间顺序被执行;在一种可能的实现方式中,第一调度集合也可以包含多个并行调度单元,即第一调度集合内包含的并行节点,它们对应的操作被执行时,一部分可以作为一个并行调度单元在某一段时间顺序被同时执行,另一部分可以作为另一个并行调度单元在另外一段时间顺序被同时执行,不同的并行调度单元对应的操作,不可以并行执行,具体包含几个并行调度单元,可以根据第一调度集合中包含的调度节点的实际情况来确定,在此不受限定。因此,步骤s131被执行时,在一种可能的实现方式中,可以通过遍历第一调度集合,确定第一调度集合中所有并行调度单元的数量和包含的并行节点的实际情况,在一种可能的实现方式中,也可以先对第一调度集合中包含的一部分并行节点合并为一个并行调度单元,然后执行后续的指令生成操作,然后再对第一调度集合中包含的另一部分并行节点合并为新的并行调度单元,然后再执行后续的指令生成操作,不断重复直至调度集合中不存在可以合并的并行节点。

在得到了第一调度集合中的并行调度单元后,可以通过步骤s132,对第一调度集合中的调度节点和并行调度单元进行标号,得到第二调度集合。步骤s132的具体实现方式不受限定,即如何按照计算图的方向来对并行节点和并行调度单元进行标号的方式不受限定,在一个示例中,可以按照计算图的方向,按照从小到大的顺序,对调度节点和并行调度单元进行标号,继而得到第二调度集合;在一个示例中,也可以按照计算图的方向,按照从大到小的顺序,对调度节点和并行调度单元进行标号,继而得到第二调度集合;在一个示例中,也可以根据第一调度集合本身的标号,结合计算图的方向,对调度节点和并行调度单元进行标号,举例来说,第一调度集合的形式可以为s=u1,u2,...un,其中,u1,u2,...un代表该第一调度集合包含的n个节点,n的数量不受限定,可以根据实际情况灵活确定,对于该集合s来说,可能存在调度节点ui和uj为并行节点,二者可以被合并,此时可以根据二者被合并后,对应的操作在计算图中被执行的顺序,确定该合并后得到的并行调度单元在第二调度集合内的标号k,同时相应地按原有的标号顺序更改其他调度节点的标号,从而得到合并后的第二调度集合s’=u1,u2,...[ui,uj]k,…um,其中,为调度节点和调度节点合并后的并行单元,第二调度集合包含的调度节点和调度单元的总数量,从原来的n变为m,n和m的具体数值可以根据实际情况确定,在此不做具体数值上的限制。

通过将第一调度集合中的并行节点合并为并行调度单元,按照计算图的方向,对第一调度集合中的调度节点和并行调度单元进行标号,得到对应标号顺序的调度节点和并行调度单元所构成的第二调度集合;这一过程可以有效地将计算图中可以并行执行的操作作为一个整体,从而在后续生成指令时,可以直接根据并行调度单元生成并行指令,而无需在指令后再确认哪些指令可以并行执行,提升了指令生成过程的整体速度和效率,也为提高运算速度和效率打好基础。

在得到了第二调度集合后,可以通过步骤s14,根据第二调度集合,生成指令,通过上述公开实施例可以看出,指令生成的方式不唯一,可以是在所有的并行调度单元均生成后再统一生成指令,也可以是在每一次合并得到并行调度单元后就生成并行指令,然后再去遍历调度节点,确定新的并行调度单元并再次生成指令,因此,步骤s14的实现方式不受具体限定,可以根据实际情况灵活决定,在一种可能的实现方式中,步骤s14可以包括:

重复执行以下操作,直到在第二调度集合内,不包含能够生成指令的调度节点和并行调度单元;其中,执行以下操作,包括:

在第二调度集合内包含能够生成指令的并行调度单元时,生成与并行调度单元对应的指令。

在第二调度集合内包含能够生成指令的调度节点且不包含能够生成指令的并行调度单元时,生成与调度节点对应的指令。

通过上述公开实施例可以看出,在一种可能的实现方式中,根据第二调度集合生成指令的过程可以是在第二调度集合内包含并行调度单元时,优先选择并行调度单元生成对应的并行指令,然后再生成与剩余调度节点对应的指令。

具体如何确定第二调度集合内包含的并行调度单元和调度节点的情况,可以根据实际情况灵活选择,在一种可能的实现方式中,可以根据第二调度集合内包含的调度节点和并行调度单元的标号情况,确定第二调度集合的具体状态。在一个示例中,根据上述公开实施例可知,第二调度集合包含的调度节点和调度单元的总数量可以为m,因此可以根据m的数值,来进行指令生成,在一个示例中,根据m的数值,通过步骤s14生成指令的具体过程可以为:

当m=0时,可以表明当前计算图的翻译已经结束,即计算图中的所有操作节点对应的指令均已生成,此时可以表明步骤s14已结束,即指令生成过程已完成。

当m=1时,可以表明当前第二调度集合中只包含唯一的可以生成指令的对象,这一对象可以是调度节点,也可以是并行调度单元,无论该对象具体是哪一形式,此时均可以选择此唯一对象生成指令,更新资源表,在此唯一对象生成指令后,m的值从1变为0,此时可以更新第二调度集合,返回m=0的情况。

当m>1时,可以表明当前调度集合中包含多个可以生成指令的对象,在这多个可以生成指令的对象中,如果包含并行调度单元,则可以根据标号顺序选择并行调度单元生成指令,在本公开实施例中可以选择标号最小的并行调度单元来生成并行指令;如果不包含并行调度单元,则可以根据标号顺序选择调度节点生成指令,在本公开实施例中可以选择标号最小的调度节点来生成指令,直至达到m的值变为1,此时可以返回m=1的情况。

通过在第二调度集合内包含能够生成指令的并行调度单元时,生成与并行调度单元对应的指令,在第二调度集合内包含能够生成指令的并行调度节点且不包含能够生成指令的并行调度单元时,生成与调度节点对应的指令,通过这一过程,可以在指令生成过程中,优先生成并行指令,从而使得硬件在根据指令执行操作时,可以优先利用并行空间进行运算和处理,从而提升硬件设备的整体运算速度和效率。

上述公开实施例中,根据第二调度单元生成与并行调度单元对应的指令,其具体的生成过程可以根据第二调度单元的实际情况和硬件设备的运算能力等灵活确定,并不局限于下述公开实施例。在一种可能的实现方式中,在第二调度集合内包含能够生成指令的并行调度单元时,生成与并行调度单元对应的指令,可以包括:

在第二调度集合内包含能够生成指令的并行调度单元时,根据并行调度单元的标号顺序,生成与并行调度单元对应的并行指令。

上述公开实施例中已经提出,在通过将并行节点合并为并行调度单元,从而生成第二调度单元的过程中,可以按照计算图的方向,对第一调度集合中的调度节点和并行调度单元进行标号,得到第二调度集合,因此,通过上述公开实施例可以看出,第二调度集合内并行调度单元的标号可以表明该并行调度单元所对应指令的执行顺序,在一种可能的实现方式中,第二调度集合中可能只包含一个并行调度单元,此时可以不考虑并行调度单元的标号,即该并行调度单元对应指令的执行顺序,而直接根据该并行调度单元生成并行指令;在一种可能的实现方式中,第二调度集合中可能包含多个并行调度单元,此时为了保障指令执行的顺序性,可以根据并行调度单元的标号顺序,来确定并行调度单元对应并行指令的执行顺序,从而依次生成与并行调度单元对应的并行指令。由于并行调度单元的标号顺序与其对应指令的执行顺序之间的对应关系不唯一,因此,具体如何根据并行调度单元的标号顺序,生成与并行调度单元对应的并行指令,其生成方式同样不受限定,在一个示例中,第二调度集合的标号顺序可以是按照计算图的方向,以从小到大的顺序,对调度节点和并行调度单元进行标号,因此,此时并行调度单元的标号越小,可以表明该并行调度单元越早被收入到第二调度集合中,即该并行调度单元对应指令的执行顺序越早,因此可以按照并行调度单元的标号从小到大的顺序,依次生成与每个并行调度单元对应的并行指令;在一个示例中,第二调度集合的标号顺序可以是按照计算图的方向,以从大到小的顺序,对调度节点和并行调度单元进行标号,因此,此时并行调度单元的标号越小,可以表明该并行调度单元越晚被收入到第二调度集合中,即该并行调度单元对应指令的执行顺序越晚,因此可以按照并行调度单元的标号从大到小的顺序,依次生成与每个并行调度单元对应的并行指令。

生成与并行调度单元对应的并行指令,其具体的实现方式不受限制,可以根据实际情况灵活选择,在一种可能的实现方式中,生成与并行调度单元对应的并行指令的实现方式可以是,根据并行调度单元中包含的并行节点,生成与每一个并行节点分别对应的指令,同时确保同一个并行调度单元生成的所有指令,其在执行时均具有相同的执行顺序。

通过在第二调度集合内包含能够生成指令的并行调度单元时,根据并行调度单元的标号顺序,生成与并行调度单元对应的并行指令,可以确保在第二调度集合包含多个并行调度单元时,可以根据计算图对应的执行顺序,有序地生成并行指令,提高指令生成的效率。

上述公开实施例中,在第二调度单元不包含能够生成指令的并行调度单元时,根据第二调度单元生成与调度节点对应的指令,其具体的生成过程可以根据第二调度单元的实际情况和硬件设备的运算能力等灵活确定,并不局限于下述公开实施例。在一种可能的实现方式中,在第二调度集合内包含能够生成指令的调度节点且不包含能够生成指令的并行调度单元时,生成与调度节点对应的指令,可以包括:

在第二调度集合内包含能够生成指令的调度节点且不包含能够生成指令的并行调度单元时,根据调度节点的标号顺序,生成与调度节点对应的指令。

上述公开实施例中已经提出,在通过将并行节点合并为并行调度单元,从而生成第二调度单元的过程中,可以按照计算图的方向,对第一调度集合中的调度节点和并行调度单元进行标号,得到第二调度集合,因此,通过上述公开实施例可以看出,第二调度集合内调度节点的标号可以表明该调度节点所对应指令的执行顺序,在一种可能的实现方式中,第二调度集合中可能只包含一个调度节点,此时可以不考虑调度节点的标号,即该调度节点对应指令的执行顺序,而直接根据该调度节点生成并行指令;在一种可能的实现方式中,第二调度集合中可能包含多个调度节点,此时为了保障指令执行的顺序性,可以根据调度节点的标号顺序,来确定调度节点对应指令的执行顺序,从而依次生成与调度节点对应的指令。由于调度节点的标号顺序与其对应指令的执行顺序之间的对应关系不唯一,因此,具体如何根据调度节点的标号顺序,生成与调度节点对应的指令,其生成方式同样不受限定,在一个示例中,第二调度集合的标号顺序可以是按照计算图的方向,以从小到大的顺序,对调度节点和并行调度单元进行标号,因此,此时调度节点的标号越小,可以表明该调度节点越早被收入到第二调度集合中,即该调度节点对应指令的执行顺序越早,因此可以按照调度节点的标号从小到大的顺序,依次生成与每个调度节点对应的指令;在一个示例中,第二调度集合的标号顺序可以是按照计算图的方向,以从大到小的顺序,对调度节点和并行调度单元进行标号,因此,此时调度节点的标号越小,可以表明该调度节点越晚被收入到第二调度集合中,即该调度节点对应指令的执行顺序越晚,因此可以按照调度节点的标号从大到小的顺序,依次生成与每个调度节点对应的并行指令。

生成与调度节点对应的指令,其具体的实现方式不受限制,可以根据实际情况灵活选择,在一个示例中,调度节点可以只对应计算图中的一个操作节点,因此此时根据该调度节点生成对应指令时,可以只生成与该操作节点对应的执行指令;在一个示例中,调度节点可以包含计算图中多个顺序执行的操作节点,因此此时根据该调度节点生成对应指令时,可以生成的是与该多个顺序执行的操作节点所对应的一串顺序指令。

通过在第二调度集合内包含能够生成指令的调度节点且不包含能够生成指令的并行调度单元时,根据调度节点的标号顺序,生成与调度节点对应的指令,可以确保在第二调度集合包含多个剩余的调度节点时,可以根据计算图对应的执行顺序,有序地生成顺序指令,提高指令生成的效率。

应用示例

在本公开应用示例中,可以针对用低级算子实现的高级算子进行指令生成,这些算子会首先被展开成循环的形式,然后对其进行相应的优化调度,最后生成指令。在本公开应用示例中,调度过程可以采用双缓冲(doublebuffering)技术进行优化。因为深度学习算法具有计算和访存密集的特点,进行了分段后,不同数据段的计算之间不存在依赖关系,因此可以使用双缓冲技术,来增加访存和计算的并行。没有双缓冲的指令生成比较简单,可以直接看作是对循环的展开。在展开循环时,有两种方式,对于支持条件跳转的架构可以采用跳转指令实现循环,对于不支持条件跳转的架构,由于此时分段的数值都已经确定,可以直接将循环展开,在展开过程中替换循环的变量。

为了实现双缓冲技术,在本公开应用示例中提出一了种基于图的方法,可以将每两次迭代合成一次,对数据依赖图进行拓扑排序,从而确定指令的执行顺序。其主要过程可以包括:

双缓冲技术可以将一块内存分成两个部分使用,然后对两个循环之间的访存和计算操作并行执行。我们通过将相邻的两次循环合并起来来实现。图5示出根据本公开一应用示例的示意图,如图所示,在本公开应用示例中,可以根据用户标识的原语得到需要进行双缓冲优化的循环(对应图5中的源代码orginalcode)。将迭代展开后可以将两次迭代合并成一次迭代,修改语句的地址(变量名)(对应图5中的循环体dublicatedloopbody),两个输入都被分配在输入缓存上,在本公开应用示例中可以为input1和input2。当input1被用来计算的时候,input2就可以加载。

之后,我们将循环体的代码翻译成一个有向图,用来表示数据之间的依赖。两次迭代会被分别翻译成两个独立的图(对应图5中的数据流图dataflowgraph)。由于这两个有向图是从同一段代码中生成,它们的拓扑结构是相同的,差别只是在地址和迭代数上。生成了计算图之后,可以根据这两个图生成指令,为了使根据计算图生成的指令可以有效应用于采用双缓冲技术的硬件设备中,在本公开应用示例中,提出了一种指令生成方法。

本公开应用示例中提出的指令生成方法,在实现时可以用到的三个不同的数据结构,其具体定义包括:

焦点窗口,焦点窗口可以指向当前正在生成的有向图,在本公开应用示例中,窗口的大小可以为2,用来装下两次迭代的大小,这两次迭代可能会同时用到片上资源,因此需要同时进行分配。当一次迭代中的指令都被分配出去之后,窗口可以自动向后滑动一次迭代。如图5所示,迭代0和迭代1都在窗口中,当有向图0中的最后的一个节点(releasesynapse0)被释放之后,有向图0中的节点都被释放,窗口可以向后滑动一次迭代,也就是将有向图2放到窗口中。通过使用焦点窗口,可以节省保存多个有向图的空间,而且由于本公开应用示例中有向图的结构都是一样的,因此在本公开应用示例中,可以不需要重复的构建删除有向图,而是可以直接重用有向图结构。

顺序容器,在本公开应用示例中,顺序容器可以是指令调度优化中的原子结构,可以看成是一块顺序的代码段。在调度中,一个顺序容器中的指令会被顺序的生成。在有向图中,顺序节点可以当成一个调度节点进行调度。计算粒度很低的架构,可以利用顺序容器来保存一段计算指令,这段指令可能是由标量构成的。比如,用矩阵粒度的指令来实现一个卷积操作,因为这些矩阵操作都是在矩阵运算单元上执行的,因此需要顺序执行。这种情况下,一个卷积的语句会被装在顺序容器中,而顺序容器就可以作为一个卷积算子的调度节点进行调度。

并行容器,并行容器可以用来存放可以并行执行的语句或者顺序容器。并行容器中的所有内容都会被并行的翻译。

资源表,资源表可以用来追踪指令生成过程中的资源使用情况的。由于本公开应用示例中所有的硬件资源都是通过抽象的方式定义,因此,每当选择了一个原子操作后,资源会相应的发生变化,比如某一运算器的会被占用,因此在调度过程中可以通过资源的使用情况寻找可以并行执行的指令。

基于上述的数据结构,在本公开应用示例中,可以描述具体的将有向图翻译成指令序列的过程,这一过程可以为:

找到可用的调度节点。这一过程中,可以构造一个调度集合,在本公开应用示例中该调度集合可以为s=u1,u2,...un,该调度集合s可以由可用的调度节点构成。在本公开应用示例中,一个可用的调度节点需要满足两个条件:一是这个调度节点所需要的所有资源都是可用的,确定该调度节点所需的所有资源是否可用,可以通过检查资源表完成。二是这个调度节点没有未完成的依赖节点。比如,如图5所示,当loadinput0,loadsynapse0执行之后,conv-0就准备好了,因此conv-0满足没有未完成的依赖节点这一条件,而这个时候运算单元是可用的,即conv-0节点同时满足所有资源可用这一条件,因此,此时conv-0节点为可用的调度节点。

找到可以并行执行的调度节点。从构建的调度集合中,可以继续辨认出那些可以并行执行的指令所对应的调度节点,然后将它们融合成并行调度单元。具体的实现方式可以是通过检查资源表,找到两个可以同时执行的运算单元,则可以通过这两个运算单元执行的操作所对应的调度节点,可以融合为并行调度单元。比如,conv和load使用的资源完全不同,因此可以并行执行。如图5所示,conv1和loadinput2是可以并行执行的,它们会被放入并行容器中,作为一个并行调度单元。这种情况下,原始的集合s会被转化成集合s′=u1,u2,...[ui,uj]k,...um,其中ui和uj会被合并成一个并行调度单元。调度节点和并行调度单元的总数量会从n变成m。

选择一个调度单元。这一过程中,可以选择出一个调度节点或是并行调度单元,将其推入到指令序列中,从而生成指令。对于集合s′,这个情况下可以存在三种状态:

m=0,表示当前的计算图翻译已经结束,可以直接结束步骤。

m=1,表示只有一种可以选择的调度对象(调度节点或是并行调度单元),因此可以选择这唯一的调度对象,更新资源表,然后跳转回m=0的状态,更新集合。

m>1,此时如果存在并行调度单元,则可以选择序号最小的并行调度单元(本公开应用示例中序号越小表明越早被收入集合);否则,选择序号最小的调度节点,在集合中的调度对象中只剩余一个可以生成指令时,跳转回m=1的状态。

图6示出根据本公开一实施例的指令生成装置的框图,如图所示,该装置20包括:接收单元21,用于接收计算图;统计单元22,用于统计计算图中的调度节点,得到第一调度集合;合并单元23,用于将第一调度集合中的并行节点合并为并行调度单元,得到包括并行调度单元的第二调度集合,其中,并行节点为符合并行执行条件的调度节点;指令生成单元24,用于根据第二调度集合,生成指令。

在一种可能的实现方式中,统计单元用于:统计计算图中的调度节点,其中,调度节点为符合调度条件的操作节点;根据所有调度节点,得到第一调度集合。

在一种可能的实现方式中,调度节点为符合调度条件的操作节点,包括:调度节点对应的操作被执行时,执行操作的资源处于空闲状态,且调度节点的所有依赖操作节点均已生成指令;其中,依赖操作节点对应的输出数据,与调度节点对应的输入数据相关。

在一种可能的实现方式中,统计单元进一步用于:按照计算图的方向,对调度节点进行标号,得到对应标号顺序的调度节点所构成的第一调度集合。

在一种可能的实现方式中,合并单元用于:将第一调度集合中的并行节点合并为并行调度单元;按照计算图的方向,对第一调度集合中的调度节点和并行调度单元进行标号,得到对应标号顺序的调度节点和并行调度单元所构成的第二调度集合。

在一种可能的实现方式中,并行节点为符合并行执行条件的调度节点包括:不同的并行节点对应的操作被执行时,执行操作的资源不一致。

在一种可能的实现方式中,指令生成单元用于:重复执行以下操作,直到在第二调度集合内,不包含能够生成指令的调度节点和并行调度单元;其中,执行以下操作,包括:在第二调度集合内包含能够生成指令的并行调度单元时,生成与并行调度单元对应的指令;在第二调度集合内包含能够生成指令的调度节点且不包含能够生成指令的并行调度单元时,生成与调度节点对应的指令。

在一种可能的实现方式中,指令生成单元进一步用于:在第二调度集合内包含能够生成指令的并行调度单元时,根据并行调度单元的标号顺序,生成与并行调度单元对应的并行指令。

在一种可能的实现方式中,指令生成单元进一步用于:在第二调度集合内包含能够生成指令的调度节点且不包含能够生成指令的并行调度单元时,根据调度节点的标号顺序,生成与调度节点对应的指令。

图7是根据一示例性实施例示出的一种指令生成装置1300的框图。例如,装置1300可以被提供为一服务器。参照图7,装置1300包括处理组件1322,其进一步包括一个或多个处理器,以及由存储器1332所代表的存储器资源,用于存储可由处理组件1322的执行的指令,例如应用程序。存储器1332中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件1322被配置为执行指令,以执行上述方法。

装置1300还可以包括一个电源组件1326被配置为执行装置1300的电源管理,一个有线或无线网络接口1350被配置为将装置1300连接到网络,和一个输入输出(i/o)接口1358。装置1300可以操作基于存储在存储器1332的操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或类似。

在示例性实施例中,还提供了一种非易失性计算机可读存储介质,例如包括计算机程序指令的存储器1332,上述计算机程序指令可由装置1300的处理组件1322执行以完成上述方法。

本公开可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本公开的各个方面的计算机可读程序指令。

计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如smalltalk、c++等,以及常规的过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。

这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1