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

同步处理器的编译的制作方法

2022-04-02 03:09:32 来源:中国专利 TAG:


1.本说明书涉及同步集成电路加速器的编译器技术。


背景技术:

2.同步集成电路加速器是为了进行高度并行的同步操作而设计的专用集成电路(asic)。并行性是通过将能够同时执行的许多不同的独立处理元素集成来实现的。这样的器件非常适合加速通过神经网络的推理传递,例如,每个独立的处理元素进行具有权重的层输入的不同乘法或加法。
3.为简洁起见,在本说明书中,这样的器件将被称为同步处理器或同步芯片。实际上,可以使用多个硅晶片(例如,使用管芯堆叠或硅中介层)来实现这样的器件。
4.在本说明书中,同步的处理器意味着由独立处理单元进行的操作不进行分支执行,例如,如在命令式程序的if/else语句中那样。相反,操作可以部分或全部提前完全调度。例如,一些同步处理器的操作必须向下调度到单个周期级别,这意味着每个处理元素的每个操作都被分配到执行周期中的特定时隙。
5.这种复杂性使得编程同步处理器极其容易出错。例如,引入单个周期的意外延迟的用户错误可能会导致由此产生的计算结果不正确或未定义,这可能意味着同一程序的多次传递可能会产生不同的结果。


技术实现要素:

6.本说明书描述了用于编译为同步处理器所编写的程序的技术。下面描述的技术涉及对在处理器上操纵数据流的数据指令进行调度。下面描述的技术还涉及自动生成和调度由处理器的控制硬件执行的配置更新指令。
7.可以实施本说明书中描述的主题的特定实施例以实现以下优点中的一个或多个。系统可以从延迟不敏感输入程序为同步处理器自动生成完全调度的中间表示。这大大减少了同步处理器编程中的人工错误。另外,延迟不敏感程序可以重复用于不同的硬件配置而无需重写。中间表示允许充分调度配置更新指令,并为编译器提供在不存在可能的输出程序时引发错误的能力。
8.本说明书的主题的一个或多个实施例的细节在附图和以下描述中阐述。本主题的其他特征、方面和优点将从描述、附图和权利要求中变得显而易见。
附图说明
9.图1是用于生成输入程序的中间表示的示例过程的流程图。
10.图2是示例程序的图形表示。
11.图3是用于为中间表示发出配置更新指令的示例过程的流程图。
12.图4是图示在同步处理器的给定约束下对配置更新指令进行调度的图。
13.图5是图示专用逻辑电路的示例的示意图。
14.图6图示了瓦片(tile)的示例。
15.各个附图中相同的附图标记和名称指示相同的元素。
具体实施方式
16.图1是用于生成输入程序的中间表示的示例过程的流程图。为方便起见,该过程将被描述为由位于一个或多个位置并根据本说明书适当编程的一台或多台计算机的系统进行。
17.该系统接收指定要由同步处理器的组件进行的操作的程序(110)。一般来说,程序的每条语句都可以指定一个或多个输入变量、输出变量和操作。该程序不需要指定有关何时执行操作的延迟或时序信息。取而代之的是,系统然后可以使用变量名称以便确定在同步处理器上执行程序的时序约束。
18.表1列出了示例程序,其将从ram读取的两个值相乘,将结果与从ram读取的第三个值相加,然后将结果写入ram。
[0019][0020]
表1
[0021]
箭头语法,例如("《-name-《"),标识被提供来自右侧的片上参数,并将它们的片上结果分配给左侧的名称(name)的子程序。在同步处理器的情况下,箭头语法可用于指代处理器上的特定硬件组件。在此示例中,“addr”被用作整个复合程序的输入,如第1行的"proc addr-》..."声明的那样。在这种情况下,“addr”标识在三个读取操作中的每一个中从哪个处理器组件的ram读取。例如,由“addr”表示的ram可以计算和存储部分和,以供程序的下一阶段使用。
[0022]
值得注意的是,示例程序对延迟不敏感,这意味着它没有指定有关组件延迟的任何信息,也没有指定执行每个操作所需的时序。这意味着,与传统程序不同,表1中的程序不需要按顺序执行语句。事实上,根据同步处理器的特性,预期语句通常将以不同的顺序或并行地执行。
[0023]
该系统获得针对同步处理器的组件中的每一个的相应时钟延迟值(120)。该系统可以维护在(1)程序中的关键字或函数所识别的每个操作和(2)表示每个操作在同步处理器上占用的时钟周期数的相应时钟延迟值之间的映射,例如表。这种布置允许为不同的底层硬件设计编译相同的延迟不敏感程序。这是有利的,因为如果底层硬件的设计改变了一
些组件延迟值,仍然可以为新的硬件设计编译相同的程序。
[0024]
该系统生成用于执行程序的时钟时序约束(130)。时钟时序约束指定相对于其他操作特定操作何时必须发生。通常,读取值必须在使用该值之前至少一个时钟周期发生。例如,需要两个输入的乘法操作具有这样的约束:必须在乘法操作开始之前至少一个时钟周期读取两个输入。因此,例如,表1的第5行的乘法操作必须在第3行和第4行的每个读取操作之后至少一个时钟周期开始。此外,连续的操作不应在时间上重叠。系统可以通过使用程序中的变量名称来生成约束,以确定哪些操作必须在其他操作之后发生。
[0025]
图2是示例程序的图形表示200。图形表示200对应于表1中列出的示例程序。图形表示200具有节点,每个节点对应于程序中的操作之一。因此,该图具有代表第2行的读取命令的读取节点205、代表第3行的读取命令的读取节点210、代表第4行的读取命令的读取节点215、代表第5行的乘法命令的乘法节点220、代表第6行的加法命令的加法节点225以及代表第7行的写入命令的写入节点230。
[0026]
为了生成时钟时序约束,系统可以遍历程序,或者等效地遍历图形表示中的边,以基于变量名称来确定依赖。然后系统可以为发现的操作之间的依赖计算所需的时钟延迟值。例如,如果第4行的乘法操作占用4个周期,则系统可以生成这样的约束:第5行的加法操作既依赖于乘法操作的输出,也不应在乘法操作开始后的4个周期前开始。
[0027]
再举一个例子,第6行的加法操作依赖于在第2行读取的变量x。因此,第6行的操作和第2行的操作之间存在依赖。
[0028]
如图2所示,两个读取节点205和210具有1个周期的延迟。读取节点215具有2个周期的延迟。乘法节点220具有4个周期的延迟,加法节点225具有3个周期的延迟,而写入节点230具有1个周期的延迟。
[0029]
如图1所示,系统生成该程序的中间表示,其将相应时钟周期值分配给多个操作中的每个操作(140)。中间表示在某种意义上是中间的,因为它是比用户程序低级的代码,但通常不会低到可以由同步处理器直接执行。
[0030]
系统可以通过从程序中的任一任意操作开始来生成中间表示,然后遍历依赖和延迟。例如,系统可以在读取节点210处开始,并分配读取操作在任意开始周期数(例如,周期0)执行。
[0031]
然后系统可以使用在节点210和节点220之间的依赖以及节点210的1个周期延迟来分配后续乘法操作在周期1执行。
[0032]
然后系统可以检查乘法节点220的另一个依赖,即读取节点215。读取节点215表示从具有与用于读取节点210的ram不同的特性的扩容ram读取。因此,延迟是不同的——2个周期而不是1个周期。系统因此分配读取节点215的读取操作在乘法操作220的乘法操作之前两个周期执行。
[0033]
这导致负周期值-1。然而,中间表示中的值仅代表相对的周期时间,因此,负值是允许的,有时甚至是预期的或不可避免的。
[0034]
然后系统可以检查对应于加法操作的加法节点225的依赖。乘法节点220和加法节点225之间的延迟是4个周期,因此系统分配加法操作在乘法操作之后4个周期执行,例如在周期5执行。
[0035]
然后系统可以检查加法节点225的另一个依赖,即读取节点205。由于读取节点205
的1个周期延迟,因此系统可以分配读取操作在加法节点225之前一个周期执行。因此,系统为读取操作分配了周期值4。
[0036]
最后,系统检查加法节点225的依赖,在本示例中,该依赖是对应于写入操作的写节点230。由于加法节点225的3个周期的延迟,因此系统将周期值8分配给写入操作。
[0037]
因此,中间表示将相应的周期时间值与程序中的每个操作相关联。系统可以使用任何适当的数据结构来存储中间表示。例如,系统可以存储(1)周期时间值和(2)指令标识符、图中的节点、指令文本或操作的一些其他表示之间的映射。
[0038]
处理图2所示的图产生的示例中间表示的值在表2中示出:
[0039][0040][0041]
表2
[0042]
与原始输入程序不同,表2中的语句确实指定了将由同步处理器执行的操作的时间顺序。这种操作顺序很可能在实际硬件上成功,因为所有调度延迟信息都已自动向下生成到周期级。
[0043]
在一些情况下,对于输入程序不存在正确的中间表示。在这样的情况下,系统可能会引发指示程序无法正确编译的错误。例如,当输入程序中的依赖形成循环时,这种情况就可能存在。当硬件无法足够快地生成值以使其在需要时可用时,也会发生这种情况。
[0044]
作为另一个示例,具有从同一中间值导出的多个输入的任何类型的操作都可能是形式错误的。如果在周期0产生值"a",在3个周期后从"a"计算得到值"b",在2个周期后从值"a"计算得到值"c",并且程序试图将"b"和"c"相乘在一起而不解决延迟差异,则没有正确的方法来调度这些操作。相反,用户可能必须添加代码以将"c"传送到下一个周期,例如通过使用ram或延时寄存器。
[0045]
尽管中间表示为要由同步处理器进行的操作指定了周期级调度,但编译器可以发出附加指令以便在同步处理器的组件上实际执行程序。特别地,编译器可能需要生成配置更新指令,所述配置更新指令指定同步处理器的处理组件之间的数据路径的变化。当指令具有多面循环语义时尤其如此,这意味着每个指令序列可能会被执行多次。因此,例如,程序语义可以指定特定的读取操作应在10次连续迭代中从特定寄存器中读取,然后在接下来的10次迭代中从不同的特定寄存器中读取。
[0046]
为了从一种配置切换到另一种配置,处理器可以发出配置更新指令,所述配置更新指令改变处理器组件之间的数据路径中多路复用器上的输入。
[0047]
图3是用于为中间表示发出配置更新指令的示例过程的流程图。为方便起见,该过程将被描述为由位于一个或多个位置并根据本说明书适当编程的一台或多台计算机的系统进行。
[0048]
系统处理中间表示以生成每个操作的相应更新窗口(310)。系统对中间表示中的指令进行处理,并为每个需要配置更新的指令生成相应的更新窗口,该更新窗口表示需要执行对应的配置更新指令的时间范围。在一些实施方式中,在没有接收到配置更新指令的情况下,处理器将在下次执行操作时使用相同的配置。
[0049]
系统获得同步处理器的一个或多个配置约束(320)。同步处理器的控制硬件的自然配置约束之一是在单个周期上可以执行多少条配置更新指令。例如,一些同步处理器可能只支持同时执行1、2、4或8条配置更新指令。
[0050]
其他配置约束可以包括可以在哪些周期上执行配置指令。例如,在一些实施方式中,配置更新指令只能在每第n个周期上执行一次,例如,其中n是2、4或8。
[0051]
其他配置约束可以包括指定处理器的每个电源域可以执行多少次配置更新的电源域约束。
[0052]
系统根据更新窗口和配置约束生成和调度配置更新指令(330)。每条配置更新指令可以更改指令在不同循环迭代时的行为方式。例如,配置更新指令可以改变寄存器读取操作的寄存器。作为另一示例,配置更新指令可以改变同步处理器的数据路径中的多路复用器的自变量。这可能导致下游操作在后续循环迭代时使用不同的自变量。通常,每条配置更新指令被调度以在从处理中间表示生成的更新窗口之一内发生。系统可以使用任何适当的约束求解流程来在可用更新窗口内调度所有需要的配置更新指令。现在将描述示例约束求解示例。
[0053]
图4是图示给定同步处理器的约束的情况下调度配置更新指令的图。图4具有水平时间轴,沿该水平时间轴图示了配置窗口和更新窗口。这是编译器在如上所述处理程序的中间表示之后可以生成的信息。
[0054]
配置窗口表示特定指令将由具有特定配置的处理器执行的时间范围。更新窗口表示对于特定指令而言配置不重要或被忽略的时间范围。
[0055]
因此,regfile0read指令452被示为具有第一更新窗口412和配置窗口415,在配置窗口415中,指令452将使用名为c1的配置来执行。在配置窗口415期间,处理器将使用配置c1重复地每个周期执行一次指令452。
[0056]
类似地,regfile1read指令454被示为具有第二更新窗口422和配置窗口425,在配置窗口425中,指令454将使用名为c2的配置来执行。在配置窗口415期间,处理器将使用配置c2重复地每个周期执行一次指令452。值得注意的是,第二更新窗口422比第一更新窗口412长得多,这意味着对于regfile1read指令454发出配置更新指令有更大的灵活性。
[0057]
乘法指令456被示为具有第一配置窗口432和第二配置窗口434。在这些配置窗口中的每一个期间,处理器可以执行乘法操作的多个周期,而不是重复对于如上所述的寄存器读取指令的情况而进行的操作。乘法指令具有更新窗口435。例如,更新窗口435可以改变数据路径以便改变乘法操作的操作数。
[0058]
加法指令458也被示为具有在其期间将进行多个周期的加法操作的两个配置窗口442和444以及在其期间可以改变加法指令的一个或多个操作数的两个更新窗口443和445。
[0059]
编译器可以使用更新窗口来确定满足处理器约束的配置更新指令的调度。对于这个示例,假设约束是处理器只能在周期x、周期y和周期z上执行配置更新指令。此外,处理器具有附加约束,即在单个周期上只能执行两个配置更新指令。
[0060]
周期x与三个更新窗口重叠。周期y与一个更新窗口重叠。周期z也与三个更新窗口重叠。因此,编译器可以从周期x和周期z上的三个重叠的更新窗口中选择至多两个。
[0061]
编译器可以选择任何适当的约束求解流程来确定如何调度五次配置更新。例如,编译器可以从最受约束的更新窗口开始,并朝着最不受约束的更新窗口工作。如果找不到解决方案,编译器可以引发程序无法在处理器上执行的错误。
[0062]
如图4所示,最受约束的更新窗口是仅与周期x、周期y或周期z中的单个周期重叠的更新窗口。有四个这样的窗口仅与单个周期重叠:uw 412、uw 435、uw 443和uw 445。
[0063]
因此,编译器可以在这些更新窗口期间调度相应的配置更新指令。换言之,编译器可以在周期x期间调度cu0 401和cu3 404,并且可以在周期z期间调度cu2 403和cu4 404。
[0064]
然后,编译器可以根据对剩余更新窗口的考虑消除已经有两个配置更新的任何周期。因此,编译器可以根据进一步的考虑去除周期x和周期z,因为这两个周期都被配置更新指令完全占用。
[0065]
唯一剩下的未分配的更新窗口是uw422,它仍然与周期y重叠。因此,编译器可以在周期y期间调度cu1 402,并且该过程可以结束,因为所有配置更新指令都已成功调度。
[0066]
然而,考虑第二更新窗口422等于第一更新窗口412的情况。在这种情况下,调度问题可能将没有解决方案,因为将为周期x调度至少三个配置更新指令。在此情况下,编译器可能会引发无法成功调度配置更新的错误。
[0067]
图5是图示专用逻辑电路,特别是asic 500的示例的示意图。asic 500包括多个同步处理器,为简洁起见,这些同步处理器将被称为瓦片(tile)。例如,asic 500包括瓦片502,其中瓦片502中的一个或多个包括被配置为进行同步计算(举例来说,例如乘法操作和加法操作)的专用电路。特别地,每个瓦片502可以包括计算单元阵列,其中每个单元被配置为进行数学操作(参见例如图6中所示的并且在本文中描述的示例性瓦片200)。在一些实施方式中,瓦片502以网格图案排列,其中瓦片502沿着第一维度501(例如,行)及沿着第二维度503(例如,列)排列。例如,在图5所示的示例中,瓦片502被分成四个不同的部分(510a、510b、510c、510d),每个部分包含288个瓦片,这些瓦片排列成由纵向18个瓦片和横向16个瓦片组成的网格。在一些实施方式中,图5中所示的asic 500可以被理解为包括被细分/排列成单独的瓦片的单个脉动单元阵列,其中每个瓦片包括单元的子集/子阵列、本地存储器和总线线路(参见例如图6)。
[0068]
asic 500还包括矢量处理单元504。矢量处理单元504包括被配置为接收来自瓦片502的输出并且基于从瓦片502接收的输出计算矢量计算输出值的电路。例如,在一些实施方式中,矢量处理单元504包括被配置为对从瓦片502接收的输出进行累加操作的电路(例如,乘法电路、加法器电路、移位器和/或存储器)。可替代地或附加地,矢量处理单元504包括被配置为将非线性函数应用于瓦片502的输出的电路。可替代地或附加地,矢量处理单元504生成归一化值、池化值或两者。矢量处理单元的矢量计算输出可以存储在一个或多个瓦片中。例如,矢量计算输出可以存储在与瓦片502唯一相关联的存储器中。可替代地或附加地,矢量处理单元504的矢量计算输出可以被传送到asic 500外部的电路,例如,作为计算
的输出。在一些实施方式中,矢量处理单元504被分段,使得每个段包括被配置为接收来自瓦片502的相应集合的输出并且基于接收到的输出计算矢量计算输出的电路。例如,在图5所示的示例中,矢量处理单元504包括横跨第一维度501的两行,每行包括布置成32列的32个段506。如本文所解释的,每个段506包括被配置为基于来自瓦片502的对应列的输出(例如,累加和)来进行矢量计算的电路(例如,乘法电路、加法器电路、移位器和/或存储器)。矢量处理单元504可以定位在瓦片502的网格的中间,如图5所示。矢量处理单元504的其他位置布置也是可能的。
[0069]
asic 500还包括通信接口508(例如,接口508a、508b)。通信接口508包括一组或多组串行器/解串器(serdes)接口和通用输入/输出(gpio)接口。serdes接口被配置为接收指令(例如,用于操作下文描述的可控总线线路的指令)和/或用于asic 500的输入数据,并将数据从asic 500输出到外部电路。例如,serdes接口可以被配置为在通信接口508中包含的一组serdes接口上以32gbps、56gbps的速率或任何合适的数据速率传输指令和/或输入数据。gpio接口被配置为为调试和/或引导提供接口。例如,asic 500可以在其开启时运行引导程序。如果程序故障,管理员可以使用gpio接口来调试故障的根源。
[0070]
asic 500进一步包括多条可控总线线路(参见例如图6),所述多条可控总线线路被配置为在通信接口508、矢量处理单元504和多个瓦片502之间传送数据。可控总线线路包括例如沿着网格的第一维度501(例如,行)和网格的第二维度503(例如,列)两者延伸的导线。沿着第一维度501延伸的可控总线线路的第一子集可以被配置为沿第一方向(例如,向图5的右侧)传输数据。沿着第一维度501延伸的可控总线线路的第二子集可以被配置为沿第二方向(例如,向图5的左侧)传输数据。沿着第二维度503延伸的可控总线线路的第一子集可以被配置为沿第三方向(例如,向图5的顶部)传输数据。沿着第二维度503延伸的可控总线线路的第二子集可以被配置为沿第四方向(例如,向图5的底部)传输数据。
[0071]
每条可控总线线路包括多个传送器元件,例如触发器,这些传送器元件用于根据时钟信号沿线路传送数据。通过可控总线线路传输数据可以包括在每个时钟周期将数据从可控总线线路的第一传送器元件转移到可控总线线路的第二相邻传送器元件。在一些实施方式中,数据在时钟周期的上升沿或下降沿通过可控总线线路传送。例如,在第一时钟周期在可控总线线路的第一传送器元件(例如,触发器)上存在的数据可以在第二个时钟周期被传送到可控总线线路的第二传送器元件(例如,触发器)。在一些实施方式中,传送器元件可以以彼此固定的距离周期性地间隔开。例如,在一些情况下,每个可控总线线路包括多个传送器元件,其中每个传送器元件定位在对应的瓦片502内或附近。
[0072]
每个可控总线线路还包括多个多路复用器和/或解复用器。可控总线线路的多路复用器/解复用器被配置为在总线线路和asic芯片500的组件之间传输数据。例如,可控总线线路的多路复用器/解复用器可以被配置为向和/或从瓦片502、向和/或从矢量处理单元504、或者向和/或从通信接口508传输数据。在瓦片502、矢量处理单元504和通信接口之间传输数据可以包括基于要发生的期望的数据传输向多路复用器发送控制信号。控制信号可以存储在直接耦合到多路复用器和/或解复用器的寄存器中。然后,控制信号的值可以确定,例如,什么数据从源(例如,瓦片502内或矢量处理单元504的存储器)传输到可控总线线路,或者,可替代地,什么数据从可控总线线路传输到接收点(例如,瓦片502或矢量处理单元504内的存储器)。
[0073]
可控总线线路被配置为在局部级别上进行控制,使得每个瓦片、矢量处理单元和/或通信接口包括其自己的一组控制元件,用于操纵穿过该瓦片、矢量处理单元和/或通信接口的可控总线线路。例如,每个瓦片、1d矢量处理单元和通信接口可以包括一组对应的传送器元件、多路复用器和/或解复用器,用于控制向以及从该瓦片、1d矢量处理单元和通信接口传输数据。
[0074]
为了最小化与asic芯片500的操作相关联的延迟,瓦片502和矢量处理单元504可以被定位成减少数据在各种组件之间行进的距离。在特定的实施方式中,瓦片502和通信接口508都可以被分成多个部分,其中瓦片部分和通信接口部分都被布置成使得数据在瓦片和通信接口之间行进的最大距离减小。例如,在一些实施方式中,第一组瓦片502可以布置在通信接口508的第一侧的第一部分中,并且第二组瓦片502可以布置在通信接口的第二侧的第二部分中。结果,与所有瓦片502被布置在通信接口一侧的单个部分中的配置相比,从通信接口到最远瓦片的距离可以减半。
[0075]
可替代地,瓦片可以布置在不同数量的部分中,例如四个部分。例如,在图5所示的示例中,asic 500的多个瓦片502被布置在多个部分510(510a、510b、510c、510d)中。每个部分510包括以网格图案布置的类似数量的瓦片502(例如,每个部分510可以包括布置成16行和16列的256个瓦片)。通信接口508也被分为多个部分:布置在瓦片502的部分510的任一侧的第一通信接口508a和第二通信接口508b。第一通信接口508a可以通过可控总线线路耦合到asic芯片500左侧的两个瓦片部分510a、510c。第二通信接口508b可以通过可控总线线路耦合到asic芯片500右侧的两个瓦片部分510b、510d。结果,与其中只有单个通信接口可用的布置相比,数据行进到通信接口508和/或从通信接口508行进的最大距离(以及因此与数据传播相关联的延迟)可以减半。瓦片502和通信接口508的其他耦合布置也可能减少数据延迟。瓦片502和通信接口508的耦合布置可以通过向可控总线线路的传送器元件和多路复用器提供控制信号来编程。
[0076]
在一些实施方式中,一个或多个瓦片502被配置为启动关于可控总线线路和/或asic 500内的其他瓦片的读取和写入操作(在本文中称为“控制瓦片”)。asic 500中的剩余瓦片可以被配置为基于输入数据进行计算(例如,以计算层推断)。在一些实施方式中,控制瓦片包括与asic 500内的其他瓦片相同的组件和配置。控制瓦片可以添加为asic 500的一个或多个额外瓦片、一个或多个额外行、或一个或多个额外列。例如,对于瓦片502的对称网格(其中每个瓦片502被配置为对输入数据进行计算),可以包括一个或多个附加的控制瓦片行来处理对输入数据进行计算的瓦片502的读取和写入操作。例如,每个部分510包括18行瓦片,其中最后两行瓦片可以包括控制瓦片。在一些实施方式中,提供单独的控制瓦片增加了用于进行计算的其他瓦片中可用的存储器的量。然而,如本文所述的专用于提供控制的单独瓦片不是必需的,并且在一些情况下,不提供单独的控制瓦片。相反,每个瓦片可以在其本地存储器中存储用于启动该瓦片的读取和写入操作的指令。
[0077]
此外,虽然图5中示出的每个部分510包括布置成18行
×
16列的瓦片,但瓦片502的数量和它们在部分中的布置可以不同。例如,在一些情况下,部分510可以包括相等数量的行和列。
[0078]
此外,尽管在图5中被示为分成四个部分,但瓦片502也可以被分成其他不同的分组。例如,在一些实施方式中,瓦片502被分组成两个不同的部分,例如矢量处理单元504上
方的第一部分(例如,更靠近图5所示的页面顶部)和矢量处理单元504下方的第二部分(例如,更靠近图5所示的页面底部)。在这样的布置中,每个部分可以包含例如576个瓦片,这些瓦片布置成由纵向(沿方向503)18个瓦片和横向(沿方向501)32个瓦片组成的网格。部分可以包含其他总数的瓦片,并且可以布置在不同大小的阵列中。在一些情况下,部分之间的划分由asic 500的硬件特征来描绘。例如,如图5所示,部分510a、510b可以通过矢量处理单元504与部分510c、510d分开。
[0079]
还可以通过将矢量处理单元504相对于瓦片部分510居中定位来减少延迟。在一些实施方式中,瓦片502的第一半布置在矢量处理单元504的第一侧,而瓦片502的第二半布置在矢量处理单元504的第二侧。
[0080]
例如,在图5所示的asic芯片500中,矢量处理单元504包括两个部分(例如,两行),每个部分包括与瓦片502的列数匹配的多个段506。每个段506可以被定位和配置为从瓦片部分510内的瓦片502的对应列接收输出,例如累加和。在图5所示的示例中,位于矢量处理单元504的第一侧(例如,在矢量处理单元504上方)的瓦片部分510a、510b可以通过可控总线线路耦合到段506的顶部行。位于矢量处理单元504的第二侧(例如,在矢量处理单元504下方)的瓦片部分510c、510d可以通过可控总线线路耦合到段506的底部行。此外,在处理单元504上方的第一半内的每个瓦片502可以位于与在处理单元504下方的第二半内的相应瓦片502距矢量处理单元504相同距离处,使得两半之间的总延迟没有差异。例如,第一部分510a中的行i中的瓦片502(其中变量i对应于行位置)可以位于与在瓦片的第二部分(例如,部分510c)中的行m-1-i中的瓦片502(其中m表示每个部分中的总行数,并且假设这两个部分中的行沿相同方向递增)距矢量处理单元504相同距离处。
[0081]
与矢量处理单元504位于所有瓦片502的远端(例如,底部)的布置相比,以这种方式配置瓦片部分510可以将数据行进到矢量处理单元504和/或从矢量处理单元504行进的距离(以及因此与数据传播相关联的延迟)减半。例如,与从部分510a通过一列瓦片502接收累加和相关联的延迟可以是与从部分510a和510c通过一列瓦片502接收累加和相关联的延迟的一半。瓦片502和矢量处理单元504的耦合布置可以通过向可控总线线路的传送器元件和多路复用器提供控制信号来编程。
[0082]
在asic芯片500的操作期间,激活输入可以在瓦片之间移位。例如,激活输入可以沿着第一维度501移位。另外,来自由瓦片502进行的计算的输出(例如,由瓦片502内的计算阵列进行的计算的输出)可以沿着第二维度503在瓦片之间移位。
[0083]
在一些实施方式中,可控总线线路可以物理硬连线以使数据跳过瓦片502,从而减少与asic芯片500的操作相关联的延迟。例如,由第一瓦片502进行的计算的输出可以沿着网格的第二维度503移位到与第一瓦片502相距至少一个瓦片的第二瓦片502,从而跳过其间的瓦片。在另一个示例中,来自第一瓦片502的激活输入可以沿着网格的第一维度501移位到与第一瓦片502相距至少一个瓦片的第二瓦片502,从而跳过其间的瓦片。通过在移位激活输入或输出数据时跳过至少一个瓦片,可以减少整体数据通路长度,从而更快地传输数据(例如,不需要利用时钟周期在跳过的瓦片处存储数据),并减少延迟。
[0084]
在示例实施方式中,部分510a的每列内的每个瓦片502可以通过可控总线线路被配置为将输出数据沿第二维度503向矢量处理单元504传递。每列内的瓦片502可被进一步配置为通过跳过下一个相邻的瓦片(例如,通过瓦片之间的可控总线线路的物理硬连线)将
数据向矢量处理单元504传递。也就是说,第一部分510a中位置(i,j)=(0,0)处的瓦片502(其中变量i对应于行位置并且变量j对应于列位置)可以被硬连线以将输出数据传递到位置(i,j)=(2,0)处的瓦片502;类似地,第一部分510a中位置(i,j)=(2,0)处的瓦片502可以被硬连线以将输出数据传递到位置(i,j)=(4,0)处的瓦片502,等等。没有被跳过的最后一个瓦片(例如,位于位置(i,j)=(16,0)处的瓦片502)将输出数据传递到矢量处理单元504。对于具有18行瓦片的部分510,例如如图5所示的示例,瓦片跳过确保部分510内的所有瓦片距矢量处理单元504至多9个“瓦片跳”,从而通过将数据通路长度和所得数据延迟减半来提高asic芯片500的性能。
[0085]
在另一示例实施方式中,部分510a、510c的每行内和部分510b、510d的每行内的每个瓦片502可以通过可控总线线路被配置为沿第一维度501传递激活输入。例如,部分510a、510b、510c、510d内的一些瓦片可以被配置为将激活输入向网格500的中心传递或向通信接口508传递。每行内的瓦片502可以进一步被配置为跳过相邻瓦片,例如,通过硬接线瓦片之间的可控总线线路。例如,第一部分510a中位置(i,j)=(0,0)处的瓦片502(其中变量i对应于行位置并且变量j对应于列位置)可以被配置为将激活输入传递到位置(i,j)=(0,2)处的瓦片502;类似地,第一部分510a中位置(i,j)=(0,2)处的瓦片502可以被配置为将激活输入传递到位置(i,j)=(0,4)处的瓦片502,等等。在一些情况下,没有被跳过的最后一个瓦片(例如,位于位置(i,j)=(0,14)处的瓦片502)不会将激活输入传递到另一个瓦片。
[0086]
类似地,被跳过的瓦片可以在相反的方向上传递激活输入。例如,第一部分510a中位置(i,j)=(0,15)处的瓦片502(其中变量i对应于行位置并且变量j对应于列位置)可以被配置为将激活输入传递给位置(i,j)=(0,13)处的瓦片502;类似地,第一部分510a中位置(i,j)=(0,13)处的瓦片502可以被配置为将激活输入传递给位置(i,j)=(0,11)处的瓦片502,等等。在一些情况下,没有被跳过的最后一个瓦片(例如,位于位置(i,j)=(0,1)处的瓦片502)不会将激活输入传递到另一个瓦片。通过跳过瓦片,在一些实施方式中,通过将数据通路长度和所得数据延迟减半来提高asic芯片500的性能是可能的。
[0087]
如本文所解释的,在一些实施方式中,瓦片502中的一个或多个专用于存储控制信息。也就是说,专用于存储控制信息的瓦片502不参与对诸如权重输入和激活输入之类的输入数据进行计算。控制信息可以包括例如用于在asic芯片500的操作期间配置可控总线线路使得数据可以在asic芯片500中移动的控制数据。控制数据可以以用于控制可控总线线路的传送器元件和多路复用器的控制信号的形式提供给可控总线线路。控制数据指定可控总线线路的特定传送器元件是否将数据传递到可控总线线路的下一个传送器元件,以便根据预定调度在瓦片之间传输数据。控制数据附加地指定数据是从总线线路传输还是被传输到总线线路。例如,控制数据可以包括引导多路复用器将数据从总线线路传输到瓦片内的存储器和/或其他电路的控制信号。在另一个示例中,控制数据可以包括引导多路复用器将数据从瓦片内的存储器和/或电路传输到总线线路的控制信号。在另一示例中,控制数据可以包括引导多路复用器在总线线路和通信接口508之间和/或在总线线路和矢量处理单元504之间传输数据的控制信号。可替代地,如本文所公开的,不使用专用控制瓦片。相反,在这样的情况下,每个瓦片的本地存储器存储该特定瓦片的控制信息。
[0088]
图6图示了用于在asic芯片500中使用的瓦片600的示例。每个瓦片600包括本地存储器602和耦合到存储器602的计算阵列604。本地存储器602包括位置靠近计算阵列604的
物理存储器。计算阵列604包括多个单元606。计算阵列604的每个单元606包括被配置为基于到单元606的数据输入(例如激活输入和权重输入)来进行计算(例如,乘法和累加操作)的电路。每个单元可以在时钟信号的一个周期上进行计算(例如,乘法和累加操作)。计算阵列604可以具有比列更多的行、比行更多的列或相等数量的列和行。例如,在图6所示的示例中,计算阵列604包括布置成8行和8列的64个单元。其他的计算阵列大小也是可能的,例如具有16个单元、32个单元、128个单元或256个单元等的计算阵列。每个瓦片可以包括相同数量的单元和/或相同大小的计算阵列。对于asic芯片可以并行进行的操作总数于是取决于芯片内具有相同大小的计算阵列的瓦片的总数。例如,对于图5所示的asic芯片500,它包含大约1150个瓦片,这意味着每个周期可以并行进行大约72,000次计算。可以使用的时钟速度的示例包括但不限于225mhz、500mhz、750mhz、1ghz、1.25ghz、1.5ghz、1.75ghz或2ghz。如图5所示,每个个体瓦片的计算阵列604是较大的瓦片脉动阵列的子集。
[0089]
瓦片600中包含的存储器602可以包括例如随机存取存储器(ram),如sram。可以使用其他存储器来代替。每个存储器602可以被配置为存储与图5所示的asic芯片的n个瓦片502相关联的总存储器的(1/n)。存储器602可以以单芯片或多芯片的形式提供。例如,图6中所示的存储器602以四个单端口sram的形式提供,其中每个单端口sram都耦合到计算阵列604。可替代地,存储器602可以以两个单端口sram或八个单端口sram等配置的形式提供。在纠错编码之后,存储器的联合容量可以是但不限于例如16kb、32kb、64kb或128kb。通过在本地向计算阵列提供物理存储器602,在一些实施方式中,asic 500的布线密度可以大大降低。在存储器集中在asic 500内的替代配置中,与本文所述的本地提供相反,可能需要用于存储器带宽的每一位的导线。覆盖asic 500的每个瓦片所需的导线总数将远远超过asic 100内的可用空间。相比之下,在为每个瓦片提供专用存储器的情况下,跨越asic 500区域所需的总数量可以大幅度减少。
[0090]
瓦片600还包括可控总线线路。可控总线线路可以被分类成多个不同的组。例如,可控总线线路可以包括第一组通用可控总线线路610,其被配置为沿每个基本方向在瓦片之间传输数据。也就是说,第一组可控总线线路610可以包括:总线线路610a,其被配置为沿着瓦片网格的第一维度501朝第一方向(在图6中称为“东”)传输数据;总线线路610b,其被配置为沿着瓦片网格的第一维度101朝第二方向(在图6中称为“西”)传输数据,其中第二方向与第一方向相反;总线线路610c,其被配置为沿着瓦片网格的第二维度103朝第三方向(在图6中称为“北”)传输数据;以及总线线路610d,其被配置为沿着瓦片网格的第二维度103朝第四方向(在图6中称为“南”)传输数据,其中第四方向与第三方向相反。通用总线线路610可以被配置为携带控制数据、激活输入数据、来自和/或去往通信接口的数据、来自和/或去往矢量处理单元的数据以及将被瓦片600存储和/或使用的数据(例如,权重输入)。瓦片600可以包括一个或多个用于控制可控总线线路的控制元件621(例如,触发器和多路复用器),从而将数据向和/或从瓦片600和/或从存储器602路由。
[0091]
可控总线线路还可以包括第二组可控总线线路,在本文中称为计算阵列部分和总线线路620。计算阵列部分和总线线路620可以被配置为携带由计算阵列604进行的计算所输出的数据。例如,总线线路620可以被配置为携带从计算阵列604中的行获得的部分和数据,如图6所示。在这种情况下,总线线路620的数量将与阵列604中的行数匹配。例如,对于8x8计算阵列,将有8条部分和总线线路620,每条耦合到计算阵列604中的对应行的输出。计
算阵列输出总线线路620可以进一步被配置为耦合到asic芯片内的另一瓦片,例如,作为到asic芯片内另一瓦片的计算阵列的输入。例如,瓦片600的阵列部分和总线线路620可以被配置为接收位于距瓦片600至少一个瓦片的第二瓦片的计算阵列的输入(例如,部分和620a)。计算阵列604的输出然后被加到部分和线路620以产生新的部分和620b,新的部分和620b可以从瓦片600输出。部分和620b然后可以被传递到另一个瓦片,或者可替代地,传递到矢量处理单元。例如,每条总线线路620可以耦合到矢量处理单元的对应段(例如图5中的段506)。
[0092]
如关于图5所解释的,可控总线线路可以包括诸如传送器元件(例如触发器)之类的电路,其被配置为允许沿着总线线路传送数据。在一些实施方式中,对于每个瓦片而言,每条可控总线线路包括对应的传送器元件。如关于图5进一步解释的,可控总线线路可以包括诸如多路复用器之类的电路,其被配置为允许数据在asic芯片的不同瓦片、矢量处理单元和通信接口之间传输。多路复用器可以位于有数据的源或宿的任何地方。例如,在一些实施方式中,如图6所示,控制电路621(例如多路复用器)可以位于可控总线线路的交叉点处(例如,在通用总线线路610a和610d的交叉点处、在通用总线线路610a和610c的交叉点处、在通用总线线路610b和610d的交叉点处和/或在通用总线线路610b和610c的交叉点处)。总线线路交叉点处的多路复用器可以被配置为在交叉点处的总线线路之间传输数据。因此,通过多路复用器的适当操作,可以有可能改变数据在可控总线线路上的行进方向。例如,在通用总线线路610a上沿着第一维度101行进的数据可以被传送到通用总线线路610d,使得数据反而沿着第二维度103行进。在一些实施方式中,多路复用器可以位于瓦片600的存储器602附近,以便可以向和/或从存储器602传输数据。
[0093]
本说明书中描述的主题和功能操作的实施例可以在数字电子电路中、在有形体现的计算机软件或固件中、在计算机硬件中(包括在本说明书中公开的结构和它们的结构等效物)或者它们中的一种或多种的组合中实现。本说明书中描述的主题的实施例可以实现为一个或多个计算机程序,即,编码在有形的非暂时性存储介质上、用于由数据处理装置执行或控制数据处理装置的操作的计算机程序指令的一个或多个模块。计算机存储介质可以是机器可读存储设备、机器可读存储基板、随机或串行存取存储器设备或者它们中的一种或多种的组合。可替代地或附加地,程序指令可以编码在人工生成的传播信号(例如机器生成的电、光或电磁信号)上,该信号被生成以编码信息以传输到合适的接收器装置,从而由数据处理装置执行。
[0094]
术语“数据处理装置”指的是数据处理硬件并且涵盖用于处理数据的所有种类的装置、设备和机器,包括例如可编程处理器、计算机或多个处理器或计算机。该装置还可以是或进一步包括专用逻辑电路,例如fpga(现场可编程门阵列)或asic(专用集成电路)。除了硬件之外,该装置可以可选地包括为计算机程序创建执行环境的代码,例如,构成处理器固件、协议栈、数据库管理系统、操作系统或它们中的一种或多种的组合的代码。
[0095]
也可以称为或描述为程序、软件、软件应用、小程序、模块、软件模块、脚本或代码的计算机程序可以以任何形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)编写,并且它可以以任何形式(包括作为独立程序或作为模块、组件、子例程或其他适合在计算环境中使用的单元)部署。程序可以但不必对应于文件系统中的文件。程序可以存储在包含其他程序或数据的文件的一部分中(例如,存储在标记语言文档中的一个或多个脚
本中)、存储在专用于所讨论程序的单个文件中或者存储在多个协调文件中(例如,存储一个或多个模块、子程序或部分代码的文件中)。计算机程序可以被部署成在一台计算机或位于一个站点或分布在多个站点并通过数据通信网络互连的多台计算机上执行。
[0096]
对于被配置为进行特定操作或动作的一台或多台计算机的系统而言,意味着该系统已在其上安装了软件、固件、硬件或它们的组合,这些软件、固件、硬件或它们的组合在操作中导致该系统进行操作或动作。对于被配置为进行特定操作或动作的一个或多个程序而言,意味着所述一个或多个程序包括指令,这些指令当由数据处理装置执行时使该装置进行操作或动作。
[0097]
如本说明书中所使用的,“引擎”或“软件引擎”是指提供与输入不同的输出的由软件实现的输入/输出系统。引擎可以是编码的功能块,例如库、平台、软件开发工具包(“sdk”)或对象。每个引擎可以在任何适当类型的计算设备上实现,所述计算设备诸如服务器、移动电话、平板计算机、笔记本计算机、音乐播放器、电子书阅读器、膝上型或台式计算机、pda、智能电话或其他固定或便携式设备,所述计算设备包括一个或多个处理器和计算机可读介质。此外,引擎中的两个或更多个可以在同一个计算设备上或在不同的计算设备上实现。
[0098]
本说明书中描述的过程和逻辑流程可以由一台或多台可编程计算机进行,所述计算机执行一个或多个计算机程序以通过对输入数据进行操作并产生输出来执行功能。过程和逻辑流也可以由专用逻辑电路(例如fpga或asic)或由专用逻辑电路和一个或多个编程计算机的组合来进行。
[0099]
适合执行计算机程序的计算机可以基于通用或专用微处理器或两者,或任何其他类型的中央处理单元。通常,中央处理单元将从只读存储器或随机存取存储器或两者接收指令和数据。计算机的基本元件是用于进行或执行指令的中央处理单元以及用于存储指令和数据的一个或多个存储器设备。中央处理单元和存储器可以由专用逻辑电路补充或结合在专用逻辑电路中。通常,计算机还将包括或可操作地耦合以从一个或多个用于存储数据的大容量存储设备(例如,磁、磁光盘或光盘)接收数据或向其传输数据或两者。然而,计算机不需要有这样的设备。此外,计算机可以嵌入到另一个设备中,例如移动电话、个人数字助理(pda)、移动音频或视频播放器、游戏控制台、全球定位系统(gps)接收器或诸如通用串行总线(usb)闪存驱动器之类的便携式存储设备,等等。
[0100]
适合用于存储计算机程序指令和数据的计算机可读介质包括所有形式的非易失性存储器、介质和存储设备,举例来说,包括:半导体存储设备,例如eprom、eeprom和闪存设备;磁盘,例如内部硬盘或可移动盘;磁光盘;以及cd-rom和dvd-rom磁盘。
[0101]
为了提供与用户的交互,本说明书中描述的主题的实施例可以在计算机上实现,该计算机具有:显示设备,例如crt(阴极射线管)或lcd(液晶显示器)监视器,用于将信息显示给用户;以及键盘和定点设备,例如鼠标、轨迹球或存在敏感显示器或用户可以通过其向计算机提供输入的其他表面。也可以使用其他种类的设备来提供与用户的交互;例如,提供给用户的反馈可以是任何形式的感官反馈,例如视觉反馈、听觉反馈或触觉反馈;以及可以以任何形式接收来自用户的输入,包括声音输入、语音输入或触觉输入。此外,计算机可以通过向用户使用的设备发送文档和从其接收文档来与用户交互;例如,通过响应于从网络浏览器收到的请求而将网页发送到用户设备上的网络浏览器。而且,计算机可以通过向个
人设备(例如智能手机)发送文本消息或其他形式的消息、运行消息应用并接收来自用户作为回应的响应消息来与用户交互。
[0102]
本说明书中描述的主题的实施例可以在计算系统中实现,该计算系统包括后端组件(例如,作为数据服务器)或者包括中间件组件(例如,应用服务器)或者包括前端组件(例如,具有图形用户界面的客户端计算机、网络浏览器或用户可以通过其与本说明书中描述的主题的实施方式进行交互的app),或者一个或多个这样的后端组件、中间件组件或前端组件的任何组合。系统的组件可以通过任何形式或媒介的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(lan)和广域网(wan),例如因特网。
[0103]
实施例1是一种方法,包括:
[0104]
接收程序的中间表示,所述中间表示指定要由同步处理器的多个相应组件进行的多个操作,其中所述中间表示向所述多个操作中的每个操作分配相应的时钟周期值,在所述时钟周期值处,所述操作被调度由所述同步处理器执行;
[0105]
处理所述中间表示以针对所述中间表示中需要硬件配置更新的每个操作生成相应的更新窗口,其中所述更新窗口指定在期间能够执行配置更新指令以实现所述硬件配置更新的时间范围;
[0106]
获得所述同步处理器的一个或多个配置约束;以及
[0107]
生成和调度配置更新指令,每条配置更新指令在所述更新窗口中的一个更新窗口期间并根据所述同步处理器的配置约束发生。
[0108]
实施例2是实施例1所述的方法,其中所述配置约束包括所述同步处理器能够在单个周期上执行的配置更新指令的最大数量。
[0109]
实施例3是实施例2所述的方法,其中所述配置约束包括在其上能够执行配置更新指令的有限数量的周期。
[0110]
实施例4是实施例1-3中任一项所述的方法,其中从所述更新窗口和所述配置约束生成和调度配置更新指令包括在将配置更新指令分派给其他更新窗口之前将配置更新指令分派给最大约束的更新窗口。
[0111]
实施例5是实施例1-4中任一项所述的方法,其中所述配置更新指令中的一条或多条改变读取操作的寄存器。
[0112]
实施例6是实施例1-5中任一项所述的方法,其中所述配置更新指令中的一条或多条改变所述同步处理器的数据路径中的多路复用器自变量。
[0113]
实施例7是根据实施例1-6中任一项所述的方法,其中所述同步处理器被配置为如果尚未发布配置更新指令,则以相同的配置执行每个操作。
[0114]
实施例8是前述实施例中任一项所述的方法,进一步包括利用所述同步处理器进行所述操作并根据所述配置更新指令更新所述同步处理器的配置。
[0115]
实施例9是一种方法,包括:
[0116]
接收指定要由同步处理器的多个相应组件进行的多个操作的程序;
[0117]
对于所述多个组件中的每个组件,获得针对所述程序的要由所述组件进行的每个相应操作的相应时钟延迟值;
[0118]
基于针对所述程序的每个相应操作的所述相应时钟延迟值,生成用于执行所述程序的时钟时序约束;以及
[0119]
基于所述时钟时序约束生成所述程序的中间表示,所述中间表示将相应的时钟周期值分配给所述多个操作中的每个操作。
[0120]
实施例10是实施例9所述的方法,其中所述操作进一步包括:
[0121]
处理所述中间表示以针对所述中间表示中需要硬件配置更新的每个操作生成相应的更新窗口,其中所述更新窗口指定在期间能够执行配置更新指令以实现所述硬件配置更新的时间范围;
[0122]
获得所述同步处理器的一个或多个配置约束;
[0123]
生成和调度配置更新指令,每条配置更新指令在所述更新窗口中的一个更新窗口期间并根据所述同步处理器的配置约束发生。
[0124]
实施例11是实施例10所述的方法,其中所述配置约束包括所述同步处理器能够在单个周期上执行的配置更新指令的最大数量。
[0125]
实施例12是实施例11所述的方法,其中所述配置约束包括在其上能够执行配置更新指令的有限数量的周期。
[0126]
实施例13是实施例10所述的方法,其中从所述更新窗口和所述配置约束生成和调度配置更新指令包括在将配置更新指令分派给其他更新窗口之前将配置更新指令分派给最大约束的更新窗口。
[0127]
实施例14是实施例9-13中任一项所述的方法,其中所述程序是延迟不敏感的。
[0128]
实施例15是实施例14所述的方法,其中所述程序未指定操作的顺序或所述操作之间的时序。
[0129]
实施例16是实施例15所述的方法,其中所述程序未指定所述同步处理器的组件的延迟信息。
[0130]
实施例17是实施例9-16中任一项所述的方法,其中所述程序的中间表示能够将负时钟周期值分配给所述多个操作中的每个操作。
[0131]
实施例18是实施例9-17中任一项所述的方法,其中所述操作进一步包括根据输入程序中的变量生成操作之间的依赖信息。
[0132]
实施例19是一种系统,包括一台或多台计算机和一个或多个存储指令的存储设备,当由所述一台或多台计算机执行时,所述指令可操作以使所述一台或多台计算机执行前述实施例中任一项所述的方法。
[0133]
实施例20是一种用计算机程序编码的计算机存储介质,所述程序包括指令,当由数据处理装置执行时,所述指令可操作以使所述数据处理装置进行实施例1至18中任一项所述的方法。
[0134]
虽然本说明书包含许多具体的实施方式细节,但这些不应被解释为对任何发明的范围或可要求保护的范围的限制,而是对可能特定于特定发明的特定实施例的特征的描述。在本说明书中在单独实施例的上下文中描述的某些特征也可以在单个实施例中组合实施。相反,在单个实施例的上下文中描述的各种特征也可以在多个实施例中单独或以任何合适的子组合来实施。此外,尽管特征可以在上面描述为在某些组合中起作用,甚至最初被要求如此保护,但在一些情况下,来自要求保护的组合的一个或多个特征可以从组合中删除,并且要求保护的组合可以针对子组合或子组合的变型。
[0135]
类似地,虽然在附图中以特定顺序描绘了操作,但这不应被理解为要求这些操作
以所示的特定顺序或按顺序进行,或者所有所示的操作都被进行以获得期望的结果。在某些情况下,多任务和并行处理可能是有利的。此外,上述实施例中各个系统模块和组件的分离不应被理解为在所有实施例中都需要这样的分离,并且应当理解的是,所描述的程序组件和系统通常可以集成在单个软件产品中或打包到多个软件产品中。
[0136]
已经描述了本主题的特定实施例。其他实施例在随附的权利要求的范围内。例如,权利要求中记载的动作可以以不同的顺序进行,但仍能达到期望的结果。作为一个示例,附图中描绘的过程不一定需要所示的特定顺序或相继次序来实现期望的结果。在某些情况下,多任务和并行处理可能是有利的。
再多了解一些

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

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

相关文献