为执行计算规则的计算装置产生指令的设备和方法与流程

文档序号:32584013发布日期:2022-12-17 11:31阅读:46来源:国知局
为执行计算规则的计算装置产生指令的设备和方法与流程

1.本发明基于用于为执行计算规则的计算装置产生指令的设备和方法。


背景技术:

2.leyuan wang、yuwei hu、luis ceze、carlos guestrin和arvind krishnamurthy在2018. tvm: end-to-end optimization stack for deep learning,corr abs/1802.04799 (2018). arxiv: 1802.04799 http://arxiv.org/abs/1802.04799中公开了一种称为tvm的工具,用于选择为专用数学计算而制造的电子电路的指令。这些电子电路称为加速器或硬件加速器并且例如用于人工神经网络中的计算。
3.m. sotoudeh、a. venkat、m. anderson、e. georganas、a. heinecke、j. knigh在isa mapper: a compute and hardware agnostic deep learningcompiler, https://dl.acm.org/doi/10.1145/3310273.3321559中公开了一种在产生指令时处理嵌套循环的可能性。
4.希望提供一种为任何这种硬件加速器和任何计算规则产生指令的有效方式。


技术实现要素:

5.这通过独立权利要求的主题来实现。
6.一种用于为执行计算规则的计算装置产生指令的计算机实现的方法规定,提供具有节点和边的有向第一图,所述第一图为执行计算规则的所述计算装置定义第一指令,其中在所述第一图中搜索具有第一结构的至少一个第一部分,其中根据所述至少一个第一部分确定具有第二结构的第二部分,其中根据所述第一图确定具有节点和边的有向第二图,其中在所述第二图中用所述第二部分替换所述第一部分,其中所述第二图为执行计算规则的所述计算装置定义第二指令,其中为图的至少一部分提供模式,所述图的节点和边通过可由所述计算装置执行的指令定义,其中根据所述第一图或根据所述第二图产生用于所述计算装置的指令,并且其中根据所述模式选择所述第一图或所述第二图来产生用于所述计算装置的指令。所述第一图可以是有向无环连贯图。在所述第一图中找到与搜索模式对应的子图。为这些子图产生新的子图,所述新的子图定义可用于完全确定相同子结果的指令。使用所述新的子图产生第二图。不同的计算装置可以用不同的专用硬件以不同的速度或不同的精度确定不同的子结果。对于特定的硬件,选择这些图之一来用于产生所述指令。所述模式定义了特别适合于特定硬件的指令。由此可以产生特别适合于该硬件的指令。通过有向边可以示出数据依赖关系,在选择图时会考虑所述数据依赖关系。
7.节点可以定义用于执行计算规则的运算或运算元,其中边定义了用于执行计算规则的运算的应用顺序。
8.可以规定,根据所述计算规则提供包括节点的图,所述节点为执行所述计算规则的运算定义迭代器,其中确定所述图中使用所述迭代器的节点和定义所述迭代器的节点之间的路径长度,其中在使用所述迭代器的节点中用包括所述路径长度的说明替换对定义所
述迭代器的节点的引用,并且其中根据包括所述路径长度的节点来确定所述有向第一图。由此,不是定义对在图中定义程序循环或减少维度的节点的引用,而是定义路径的长度。在第一图中可以从定义迭代器的节点开始通过以下方式到达使用迭代器的节点,即针对子节点一直确定其父节点,直到达到路径的长度为止。
9.所述第一结构可以定义第一子图,该第一子图包括多个节点和为至少两个运算元以第一顺序定义至少一个运算的边,其中所述第二结构定义由所述第一子图的节点定义的第二子图,其中第二子图的边为所述至少两个运算元以第二顺序定义至少一个运算,其中所述至少一个运算定义逐元素的运算。
10.所述第一结构可以由定义所述第一图中的路径的第一字符串定义,其中所述第二结构由定义所述第二图中的路径的第二字符串定义。由此可以通过字符串比较来进行模式匹配。
11.所述第一字符串和/或所述第二字符串可以包括所述路径中节点的标注(bezeichnung)的有序列表,所述有序列表定义了所述路径。由此可以在字符串比较中特别容易找到路径。
12.所述第一结构可以定义第一子图,所述第一子图包括多个节点和边,所述节点和边为运算元的至少两个维度定义了所述计算装置的存储器中的第一布置,其中所述第二结构定义由所述第一子图的节点定义的第二子图,其中所述第二子图的边为所述运算元的至少两个维度定义所述存储器中的第二布置。
13.所述第一布置可以定义数据的第一张量,其中所述第二布置定义所述数据的第二张量,其中所述第二张量由转置的第一张量定义。
14.所述第一布置可以包括比所述第二布置更多的维度,其中通过线性化所述第一布置的多个维度来确定所述第二布置。所述第一布置可以具有比所述第二布置更少的维度,其中通过复制所述第一布置的多个维度中的至少一个维度或者通过添加填充有至少一个值、特别是至少一个零的维度来确定所述第二布置。
15.所述数据可以由所述计算规则的输入或由所述计算规则的子结果来定义。
16.所述第一结构可以定义第一子图,所述第一子图包括第一节点,其中没有边从所述第一节点开始,其中所述第一节点在至少两个维度中定义用于所述计算装置的第一存储区域,其中所述第一结构包括第二节点,所述第二节点为所述第一存储区域中的值定义运算,其中在所述第一存储区域的至少一个维度中定义用于所述计算装置的第二存储区域,其中所述第二结构定义第二子图,在所述第二子图中用定义所述第二存储区域的第三节点替换所述第一子图的第一节点,其中所述第二结构为所述第一存储区域的在所述第二存储区域中缺失的至少一个维度定义程序循环,所述程序循环定义用第二运算元在该维度上重复执行所述运算。
17.可以规定,提供多个第一结构,其中针对在所述第一图中找到的第一结构确定多个第二图,其中在所述多个第二图中搜索所述多个第一结构。所述搜索迭代地重复,直到不再找到其他与搜索模式对应的子图为止。
18.可执行指令可以由所述计算装置预给定、确定或接收,其中根据所述可执行指令来确定所述模式。
19.从所述第一图的节点的多个数据结构中优选地确定所述第一图的节点的数据结
构,所述数据结构包括定义要应用于其他节点的运算的数据字段,其中用相同的数据结构确定所述第二图的节点的数据结构,其中将定义要被应用所述运算的节点的数据字段替换为其中定义要被应用所述运算的其他节点的数据字段,其中所述其他节点定义在所述节点的数据结构的其他数据字段中,或者其中所述其他节点定义在另外的节点的数据结构的以下数据字段中,该数据字段被来自所述第一图的所述节点的数据结构的数据字段引用。由此互换了用于计算的指令的顺序。
20.从所述第一图的节点的多个数据结构中优选地确定所述第一图的节点的数据结构,所述数据结构包括定义具有其他节点的列表的数据字段,其中用相同的数据结构确定所述第二图的节点的数据结构,其中将定义所述列表的数据字段替换为以下数据字段,在该数据字段中来自所述列表的第一条目与来自所述列表的第二条目互换。由此在输入节点处不是访问向量、张量或矩阵,而是访问其转置。
21.优选地,确定定义用于确定结果的程序循环的至少一个节点,其中向所述节点分配表征存储器中的存储块的参数,其中根据所述参数确定第一程序循环和第二程序循环,其中所述第一程序循环包括用于确定所述结果的至少一个指令和用于调用所述第二程序循环的指令,使用用于调用所述第二程序循环的指令可确定其子结果。这使得可以对程序循环分段,如果指令小于计算规则的维度的话。
22.一种用于产生为执行计算规则的计算装置产生指令的设备被构造为执行该方法。
23.一种用于为执行计算规则的计算装置产生指令的数据结构针对图的节点包括:用于所述图中所述节点的父节点的第一数据字段,用于所述图中所述节点的子节点的至少一个第二数据字段,以及表征所述计算规则的运算或运算元的至少一个第三数据字段。
24.至少一个第三数据字段可以定义数据用户、用于计算的至少一个维度的大小、算术运算、用于计算的依赖关系或顺序、或值类型。
附图说明
25.进一步的有利实施方式由以下描述和附图得出。在附图中:图1示出了用于为计算装置产生指令的设备,图2示出了第一图,图3示出了第二图,图4示出了用于为计算装置产生指令的方法中的步骤,图5示出了图的第一变换,图6示出了图的第二变换,图7示出了图的第三变换,图8示出了图的第四变换,图9示出了图的第五变换,图10示出了图的第六变换,图11示出了图的第七变换,图12示出了数据结构。
具体实施方式
26.下面,g:=(v, a, s, t)表示有向多重图,即具有多个可以单独标识的有向边的图。
27.v表示节点集合,a表示边集合,s表示向每条边分配节点使得该边从该节点开始的函数,t表示向每条边分配节点使得该边在该节点处结束的函数。
28.树表示在两个节点之间定义恰好一条路径的图。在该示例中,路径表示连接在该示例中有限节点集合的有限边序列,这些节点全都彼此不同。
29.为内核和指令集架构两者检测计算序列和计算层次结构以及为此所需的存储器访问模式的基于图的表示在下面称为中间表示。指令集架构可以是x86指令集架构,即用于x86cpu的指令集架构(instruction set architecture)isa。
30.在该示例中,中间表示是表示人工神经网络运算符中的计算的多重图。
31.图1示出了用于为执行计算规则的计算装置102生成指令的设备。
32.计算装置102包括第一装置104、第二装置106和存储器108。
33.在该示例中,第一装置104包括被构造为执行特定、预给定的指令的电路。第一装置104被构造为对存储器108进行读访问。第一装置104被构造为对存储器108进行写访问。第一装置104被构造为在每次执行特定、预给定的指令时根据相同的输入确定相同的输出。在该示例中,所述输入由来自存储器108的第一存储区域110的值定义。在该示例中,所述输出由来自存储器108的第二存储区域112的值定义。在该示例中,存储器108的第二存储器区域112在执行指令期间未定义。在该示例中,第二存储区域112在执行了该指令之后才被使用或更改。第一数据线路114可以连接第一装置。
34.第一装置104在下面称为硬件加速器。
35.第二装置106被构造为根据计算规则确定用于硬件加速器的指令。第二数据线路116可以连接第二装置。第二装置106可以构造为识别硬件加速器的类型。第二装置106可以被构造为从用户输入的配置中确定硬件加速器的类型。第二装置106可以被构造为通过向硬件加速器查询来询问硬件加速器的类型并且根据硬件加速器的响应来识别所述类型。在这种情况下,硬件加速器可以构造为在获得查询时发送该响应。硬件加速器也可以在没有获得查询的情况下发送所述类型,例如当硬件加速器接通时。
36.第二装置106可以被构造为执行下面描述的方法。该方法还可以在第二装置106之外或在计算装置102之外执行,其中该方法的结果定义了应当由第二装置106产生的指令,以操控硬件加速器来确定根据计算规则计算的结果或确定该结果的子结果。
37.在该示例中,存储器108包括线性地址空间。在该地址空间中可以存储标量或张量。在该示例中,在该地址空间中向一维张量分配连贯的存储区域,其中该张量的各个元素,即这些元素的各个值的存储位置,在第一维度i中是可寻址的。在该示例中,为一个值定义预给定数量的存储单元。在该示例中,将存储在存储器108中的张量的元素的值存储在所述存储器单元中,所述存储单元基于该张量在用于该张量的存储区域中的起始地址从第一维度i中的以下位置开始,该位置由所述元素在该张量中的位置定义。
38.对于两维张量,可以定义第一维度i和第二维度j。各个值的存储位置在该示例中与针对一维张量的描述一样定义在该张量的每个维度中。
39.可以规定,硬件加速器具有不可变的电路,用于计算来自以下一维和/或多维张量
的非详尽列表中的运算之一:逐元素运算,例如加法、乘法、除法、减法、标量积、张量缩减,例如向量缩减。
40.可以为这些运算定义第一维度i的不可变的第一值范围。可以为这些运算定义第二维度j的不可变的第二值范围。第一值范围和/或第二值范围可以由不可变电路的结构或布置来定义。
41.用于计算这种运算的一个或多个指令可以通过模式表示,所述模式可以在图的结构中找到,所述图定义了其中可以使用这些运算之一的计算规则。
42.下面描述的方法使得可以选择能够生成一个或多个指令的图,利用所述指令可以使用硬件加速器计算出根据计算规则的计算的结果。一个或多个指令可以包括将运算元(例如向量、张量或矩阵)加载到第一存储区域110中。一个或多个指令可以包括从第二存储区域112读取根据计算规则的计算的结果或子结果,例如向量、张量或矩阵。一个或多个指令可以包括针对写入、计算和/或读取的顺序。一个或多个指令可以包括针对在存储器108中布置向量、张量或矩阵的顺序。例如,指令可以为定义存储器108中向量、张量或矩阵的转置的值规定存储器108中存储位置的重新排列或存储位置的寻址。
43.在该示例中,计算规则由用于中间表示的图表示。在所述中间表示中,节点具有一个父节点和一个或多个子节点。节点可以具有以下类型之一:张量节点:张量节点定义了张量维度和用于在张量的维度上重复计算至少一个运算的程序循环的布置。例如,张量节点可以在第一维度i或第二维度j中定义重复计算。
44.缩减节点:缩减节点为具有多个维度的输入定义了导致维度缩减的运算。这意味着缩减节点定义了这样一种计算,该计算的输出具有比其输入更少的维度。向缩减节点分配特定的算术运算。
45.这种计算的一个示例是求和,例如在输入处将一个向量的所有元素相加,通过该求和确定了输出处的标量。
46.计算节点:计算节点定义了逐元素的函数。逐元素的函数可以为其输入规定不可变的顺序。这例如是为减法规定的。逐元素的函数可以为其输入规定可变的顺序。这例如是在诸如加法的可交换运算情况下规定的。
47.输入节点:输入节点定义了计算的输入。例如,输入节点定义了标量、向量、张量或矩阵。
48.访问节点:访问节点定义了存储器访问函数,利用该函数访问标量或访问向量、张量或矩阵的维度。
49.图的任何边都不必从访问节点发出。
50.访问节点可以连接到另外的访问节点。由此可以映射更复杂的存储器访问函数,例如两个迭代器或索引的加法i+j。加法运算也可以通过访问节点类型的节点映射。
51.边连接图中的节点。图2中示例性示出的第一图200是有向图,其中有向边具有以下含义:
从输入节点开始并在访问节点结束的边定义了对由访问节点定义的维度的存储器访问,当由输入节点定义的输入用于计算时,该存储器访问是必需的。访问节点例如定义将一个张量的来自该维度的值写入用于输入的第一存储区域110中的指令。
52.从计算节点开始并在其他节点结束的边定义了使用由计算节点预给定的运算来计算子结果,所述运算应用于由所述其他节点定义的运算元。在该示例中,其他节点可以是输入节点、其他计算节点、缩减节点或张量节点。
53.从缩减节点开始并在其他节点结束的边定义了使用由缩减节点预给定的运算来计算子结果,所述运算应用于由所述其他节点定义的运算元。在该示例中,其他节点可以是输入节点、计算节点、其他缩减节点或张量节点。其他节点中的至少一个定义了缩减节点的多维输入。可以规定,其他节点定义来自张量的标量作为计算输出的起始值。
54.从张量节点开始的边可以在计算节点、缩减节点或其他张量节点结束。该边可以是定义用于重复执行计算的程序循环的第一边类型。该计算例如由图的子图定义,该子图的根是第一边类型的边结束处的节点。边可以是第二边类型,其定义了程序循环中重复计算所需的子结果。在这种情况下,所述子图包括至少一个定义了对子结果的引用的节点。该节点在所述子图的结构中的位置定义了使用所述子结果进行计算的顺序。所述引用可以由图中的第三边类型的附加边表示,该第三边类型将该节点直接连接到第二边类型的边结束处的同一节点。程序循环可以由图中的第四边类型的边来表示。
55.在该示例中,将第三边类型的边和第四边类型的边作为属性分配给这些边开始处的节点。第三类型的边可以通过向上移动的说明和通过从该节点开始沿着第二边类型的边的至少一个后续移动的说明来定义。第四类型的边可以通过说明图中从该节点开始向上移动的次数来定义。向上移动表示从节点沿着边向图的根节点方向移动。
56.第一边类型的边、第二边类型的边、第三边类型的边和第四边类型的边在该示例中是有向边。第五边类型的有向边从缩减节点、计算节点或输入节点开始并在其他节点结束。
57.在图2所示的图中,边如下示出:第一边类型的边和第五边类型的边通过箭头示出,第二边类型的边通过点状箭头示出,第三边类型的边通过虚线箭头示出,第四边类型的边由点划线箭头示出。
58.图2中的图示出用于标量s和矩阵q和k的以下计算规则r
ij
的第一表示:在图3中示出了相同计算规则r
ij
的第二表示。
59.在该示例中,张量节点用大写字母表示,其中用于在相应张量节点处重复执行计
算的程序循环的间隔的维度在方括号[]中示出。相应图的根节点通过与结果的维度之一相关联的张量节点定义。输入节点——利用该输入节点访问来自计算规则的矩阵之一——用表示矩阵的相同大写字母表示。在该示例中,向每个输入节点分配了用于相应矩阵的每个维度的访问节点,其中在方括号[]中说明相应的维度。假设维度从零开始,相应维度的大小可以用冒号以及随后的数字在方括号内说明,该数字说明所述大小。定义代数运算的计算节点配备有由所述代数运算定义的数学符号。在该示例中,s与总和的乘积由标有*的计算节点示出。缩减节点用用于缩减的运算表示。如果缩减需要代数运算,则可以将该代数运算作为属性分配给所述缩减节点。在该示例中,缩减节点用表示,因为这是求和。
[0060]
在从图中产生指令时,可以规定对边界条件进行评估。例如,评估由第三边类型的边或第四边类型的边定义的计算顺序并且由产生的指令遵守该计算顺序。边界条件可以定义为属性并分配给节点。可以规定:在存储器108的输入中需要定义的运算元布置的代数运算作为属性分配给定义该运算的节点。评估该属性并且由产生的指令来遵守该属性。
[0061]
在该示例中,定义了具有定义计算规则的结构的模式,所述计算规则可由硬件加速器特别好地计算。所述模式定义了与硬件加速器的特定硬件特别匹配的指令。可以使用下面描述的方法产生特别适合于该硬件的指令。
[0062]
不同的硬件加速器可以包括具有电路的不同硬件,这些电路可以加速地计算特定结构的计算规则。
[0063]
图的节点定义了用于执行计算规则的运算或运算元。边定义了将运算用于执行计算规则的顺序。
[0064]
下面参照图4示出用于产生指令的方法。
[0065]
在步骤200中,提供了图的第一结构,所述第一结构定义了可由硬件加速器执行的至少一个运算。例如,所述第一结构定义了图中节点和边的布置。
[0066]
下面说明提供第一结构的各种可能性。
[0067]
在步骤200中,提供计算规则。
[0068]
然后在步骤202中,提供计算规则的中间表示。
[0069]
然后在步骤204中,提供具有节点和边的有向第一图,该第一图表示计算规则。在该示例中,第一图具有树的属性。
[0070]
在该示例中,从用于中间表示的图中将第一图确定为树,从而只存在一条路径连接第一图中的每对节点。在所述中间表示中,彼此关联的父节点和子节点已经具有该属性。在第一图中向在所述中间表示中定义数据依赖关系的边分配第三边类型。在第一图中向在所述中间表示中定义迭代的边分配第四边类型。
[0071]
第一边类型的边、第二边类型的边和第五边类型的边定义了具有树结构的图,在该图中定义迭代器的节点可以从使用该迭代器的节点通过一条路径到达,该路径可以仅通过第一边类型的有向边、第二边类型的有向边和第五边类型的有向边到达。第三边类型的有向边或第四边类型的有向边通向使用迭代器的节点。第三边类型的边可以通过树中沿着第一边类型、第二边类型和第五边类型的路径来实现。该路径可以存储在输入节点中以用于模式识别。第四边类型的边可以通过在定义迭代器的节点中说明路径长度(例如作为整数)来加以定义。单单通过说明该路径长度就可以覆盖在树中从使用迭代器的节点到定义迭代器的节点的路径。
[0072]
在该示例中,所述路径长度替换了使用迭代器的节点的说明。
[0073]
在该示例中,所述路径长度存储在树的叶子中,即定义迭代器的访问节点中。所述迭代器例如对应于一个维度,在该维度上计算在使用该迭代器的张量节点中定义的张量。所述迭代器例如对应于一个维度,在该维度上计算在使用该迭代器的缩减节点中定义的缩减。
[0074]
在该示例中,针对多个程序循环或引用的数据依赖关系存储在树的相应叶子中。
[0075]
根据所述数据依赖关系定义了一种数据结构,下面将更详细地描述该数据结构,利用该数据结构可以与来自指令集合的多个指令进行模式匹配。
[0076]
在该示例中,为此将指令的根到叶路径定义为标注的字符串。标注包括路径中节点的节点类型或子节点的有序标记列表,根据有向路径的方向对该有序标记列表排序。
[0077]
可以规定,从上面描述的节点类型的定义中借助于用于字符串比较的有限状态机来确定标注。为此例如可以使用根据alfred v. aho和margaret j. corasick,1975,efficient string matching: an aid to bibliographie search,commun. acm 18, 6 (1975年6月), 333-340,https://doi.org/10.1145/360825.360855的aho-corasick算法。
[0078]
第一图定义了用于执行计算规则的计算装置102的第一指令。
[0079]
在步骤206中,在第一图中搜索至少具有第一结构的第一部分。在该示例中,第一结构由第一字符串定义。由此将模式匹配的问题缩减为将第一字符串与表示模式的字符串进行字符串比较的问题。
[0080]
在步骤208中,根据至少一个第一部分确定具有第二结构的第二部分。在该示例中,第二结构由第二字符串定义。在该示例中成对地定义用于替换的结构或模式。
[0081]
在步骤210中,根据第一图确定具有节点和边的有向无环连贯的第二图。在第二图中,第一部分被第二部分替换。
[0082]
第二图定义了用于执行计算规则的计算装置102的第二指令。
[0083]
在步骤212中,为图的至少一部分提供模式,该图的节点和边通过可由计算装置102执行的指令定义。可以规定,预给定、确定或接收可由计算装置执行的指令。在这种情况下,可以根据可执行的指令确定所述模式。在该示例中,所述模式由图的至少一部分表示,如针对中间表示所描述的那样,该图是从可执行指令中确定的并且具有树的结构。所述模式被定义为对应的字符串。模式匹配通过将第一字符串或第二字符串与表示所述模式的字符串进行字符串比较来进行。
[0084]
在步骤214中,根据所述模式选择第一图或第二图来为计算装置102产生指令。
[0085]
第一图和第二图是可以使用模板搜索以确定适于产生用于计算计算规则的指令的图的候选。
[0086]
可能会出现的是,对于所述模式匹配发现针对一个内核的相互冲突的指令。
[0087]
在该示例中通过以下方式来定义冲突,即两个匹配的指令包括针对该模式的图的树中的同一节点。在这种情况下,可以根据向每条指令分配成本函数的全局成本函数来定义优化问题。根据所述全局成本函数在这方面确定优化问题的解,该解定义了搜索候选者以寻找的模式。
[0088]
用于此的算法包括例如选择函数,利用该选择函数从所有可能的匹配模式中选择代表优化问题的解的模式。
[0089]
例如,根据在树的交叉期间在从叶子出发的树的分支上发现的冲突指令的列表选择最佳匹配的指令。
[0090]
通过从树的根开始遍历该树一次来产生所述指令的列表。模式搜索算法发现模式的位置被添加到该列表中。
[0091]
例如,遍历树的顺序是:右到左前序(right-to-left pre oder)。
[0092]
这是一种递归算法,该算法在每个节点中执行以下操作:1)读取当前节点的数据2)然后递归地访问右子树3)然后递归地访问左子树。
[0093]
例如,如果针对全局成本函数的匹配指令的成本函数没有导致相对于下一个可能的匹配指令的改进,则不跟踪分支。对于与当前节点匹配的每条指令,可以确定不与当前节点重叠的下一条指令。
[0094]
如果该指令改进了全局成本函数,则为此确定可从当前节点到达的下一个节点。用于实现该算法的函数可以规定,为不代表可能继续的节点返回空值。
[0095]
在第一图中搜索模式时,可能找到多个模式覆盖第一图中的一个或多个相同节点。也就是说,模式或指令在所述一个或多个节点中彼此重叠。这是不允许的,因为找到的每个模式(即每条指令)都必须单独存在。
[0096]
在找到多个图案的情况下选择一个模式,并且选择下一个模式,使得该下一个模式不与已选择的模式之一重叠。
[0097]
对于第二图或其他候选,过程与针对第一图描述的相同。
[0098]
可以规定将计算规则的程序循环划分为内部程序循环和外部程序循环。可以规定限制内部程序循环的迭代域并由此限制内部程序循环的工作量。可以规定确定至少一个参数,所述参数表征存储器中的存储器块并且将工作负载分配给指令。在该示例中,张量节点描述了这样一种独立元素,该元素在程序流中的布置不会影响结果。在该示例中,向张量节点分配因子,该因子在代码生成期间用于确定匹配的外部程序循环并且为张量节点确定对指令的调用。由此可以在匹配了指令后确定全局非常适合的参数。
[0099]
通过所述因子定义了已存储和在后续计算中使用的子结果。因此为每个子结果产生新的张量节点和与该张量节点匹配的张量。通过所述张量节点,可以响应其中存储所述子结果的张量,并为了以后使用查找该张量。
[0100]
在步骤216中,如果在步骤214中选择了第一图,则根据第一图产生用于计算装置102的指令,或者如果在步骤214中选择了第二图,则根据第二图产生用于计算装置102的指令。
[0101]
由此,找到对应于搜索模式的子图并且产生新的子图,这些新的子图定义了可用于完全确定计算规则的一部分的子结果的指令。
[0102]
不同的计算装置102可以用不同的专用硬件以不同的速度或不同的精度确定不同的子结果。所述模式定义了特定硬件特别匹配的指令。由此可以产生特别适合于该硬件的指令。
[0103]
第一结构可以定义第一子图,该第一子图包括多个节点和边,这些边为至少两个运算元以第一顺序定义了至少一个运算。
[0104]
在这种情况下,第二结构例如定义由第一子图的节点定义的第二子图。第二子图的边为所述至少两个运算元以第二顺序定义了至少一个运算。所述至少一个运算可以是逐元素的算术运算。
[0105]
第一结构可以定义为如图5中左侧所示。第二结构可以定义为如图5中右侧所示。第一结构包括第一节点r[x:10],第一边在该第一节点处开始。第一边在第二节点r[y:20]处结束。第二边在第二节点r[y:20]处开始并在第三节点+处结束。
[0106]
第三节点+定义了一个运算,即加法,其运算元包括第一子图(在该示例中为标量a)和第二子图n(x,y)*act(x,y)。第二节点r[y:20]定义了用于重复执行该运算的第一程序循环。第一节点r[x:10]定义了用于重复执行第一程序循环的第二程序循环。
[0107]
在这种情况下,第二结构包括第一节点r[x:10],第一边在该第一节点处开始并在第二节点r[y:20]处结束。第二边在第二节点r[y:20]处开始并在第三节点+处结束。第三节点+定义的运算的运算元包括第一子图a和第四节点t(x,y)。
[0108]
第四节点t(x,y)替换来自第一结构的第一子图的第二子图n(x,y)*act(x,y)。第二结构包括从第一节点r[x:10]开始并在第五节点t[x:10]处结束的第三边。第二结构包括从第五节点t[x:10]开始并在第六节点t[y:20]处结束的第四边。第六节点t[y:20]定义了第三程序循环,用于重复执行第二子图n(x,y)*act(x,y)的运算。第五节点t[x:10]定义了第四程序循环,用于重复执行第三程序循环。开始于第四节点t(x,y)并结束于第五节点t[x:10]的第五边定义了在第二程序循环之前执行第四程序循环的顺序。由此产生了定义计算规则的一部分的子图,利用这些子图可以完全确定计算规则的一部分的子结果。附加边定义了执行的顺序,从而可以遵守子结果和在计算规则中使用子结果之间的数据依赖关系。
[0109]
第一结构可以定义为如图6中左侧所示。第二结构可以定义为如图6中右侧所示。第一结构可以包括第一节点r[x:10],第一边开始于所述第一节点并结束于第二节点r[y:20]。第二边开始于第二节点r[y:20]并结束于第三节点t[y:20]。第三边开始于第三节点t[y:20]并结束于第四节点t[z:30]。第四节点t[z:30]定义了第一程序循环,用于重复执行计算规则的由子图定义的部分,第三节点t[y:20]定义了第二程序循环,用于重复执行第一程序循环。第二节点r[y:20]定义了第三程序循环,用于重复执行第二程序循环。第一节点r[x:10]定义了第四程序循环,用于重复执行第三程序循环。
[0110]
第四边开始于第二节点r[y:20]并结束于第五节点。第五边开始于第五节点并结束于第六节点t(x,y,z)。第六节点t(x,y,z)定义了可通过计算计算规则的由子图定义的部分来确定的子结果。第五节点定义了使用所述子结果的运算。第六边开始于第六节点t(x,y,z)并结束于第三节点t[y:20]。第六边定义了在第三程序循环中第一次执行第二运算之前执行用于确定子结果的第二程序循环的顺序。
[0111]
在这种情况下,第二结构包括第一节点r[x:10]、第二节点r[y:20]和第五节点。第一边开始于第一节点r[x:10]并且结束于第二节点r[y:20]。第四边开始于第二节点r[y:20]并结束于第五节点。第六节点t(x,y,z)被子图替换。
[0112]
第一结构可以定义第一子图,该第一子图包括多个节点和边,这些节点和边为运算元的至少两个维度定义了计算装置102的存储器中的第一布置。在这种情况下,第二结构可以定义由第一子图的节点定义的第二子图,其中第二子图的边为所述运算元的至少两个
维度定义所述存储器中的第二布置。
[0113]
在一个方面,第一布置可以定义数据的第一张量n,其中第二布置定义所述数据的第二张量n
t
。第二张量n
t
通过转置的第一张量n来定义。相关联的输入节点n在图7中左侧针对第一张量n示出并且在右侧针对第二张量n
t
示出。在第二布置中,相对于第一布置访问节点互换了。
[0114]
在另一方面,第一布置可以定义数据的第一张量r,其中第二布置定义所述数据的第二张量r
t
。第二张量r
t
通过转置的第一张量r来定义。相关联张量节点r[x:10]和r[y:20]的第一布置在图8的左侧针对第一张量r示出。第二布置在图8的右侧针对第二张量r
t
示出。在这种情况下,程序循环互换地布置。
[0115]
第一布置可以具有比第二布置更多的维度。例如通过线性化第一布置的多个维度来确定第二布置。
[0116]
第一布置可以具有比第二布置更少的维度。在这种情况下,第二布置可以通过复制第一布置的多个维度中的至少一个维度或通过添加填充有至少一个值、特别是填充有至少一个零的维度来确定。
[0117]
图9示出了两个最外部张量节点的融合。第一结构可以包括多个节点和边,这些节点和边为运算元的至少两个维度x、y定义了计算装置102的存储器中的第一布置。
[0118]
第一结构可以定义为如图9中左侧所示。第二结构可以定义为如图9中右侧所示。第一结构包括第一节点r[x:10],第一边类型的第一边开始于该第一节点。第一边结束于第二节点r[y:20]。第一边类型的第二边开始于第二节点r[y:20]并结束于第三节点+。
[0119]
第三节点+定义了第一运算,在该示例中为加法,所述第一运算的运算元包括第一子图(在该示例中为标量a)和第二子图,所述第二子图包括定义子结果的第四节点t(x,y)。
[0120]
第二节点r[y:20]定义了用于重复执行第一运算的第一程序循环。第一节点r[x:10]定义了用于重复执行第一程序循环的第二程序循环。
[0121]
第二边类型的第三边开始于第一节点r[x:10]并结束于第五节点t[x:10]。第一边类型的第四边开始于第五节点t[x:10]并结束于第六节点t[y:20]。
[0122]
第一边类型的第五边开始于第六节点t[y:20]并结束于第七节点*。第七节点*定义了第二运算,在该示例中为第八节点n(x,y)和第九节点act(x,y)的乘法。
[0123]
第六节点t[y:20]定义了用于重复执行第二运算的第三程序循环。第五节点t[x:10]定义了用于重复执行第三程序循环的第四程序循环。
[0124]
第三边类型的第六边开始于第四节点t(x,y)并结束于第五节点t[x:10]。
[0125]
在这种情况下,第二结构包括第一节点r[x:10]、第二节点r[y:20]、第三节点+、第一子图和第二子图,如针对第一结构所述,其中在第二子图中第四节点t(x,y)被第六节点t[y:20]替换。第七节点*、第八节点n(x,y)和第九节点act(x,y)布置为与针对第一结构所述的相同。
[0126]
由此融合了第二程序循环和第四程序循环。由此实现了子结果的更快重复使用。
[0127]
图10示出了将用于确定子结果的计算运算插入到先前使用该子结果的子图中。
[0128]
第一结构可以包括多个节点和边,这些节点和边为运算元的至少两个维度x、y定义了计算装置102的存储器中的第一布置。
[0129]
第一结构可以定义为如图10中左侧所示。第二结构可以定义为如图10中右侧所
示。第一结构包括第一节点r[x:10],第一边类型的第一边开始于该第一节点。第一边结束于第二节点r[y:20]。第一边类型的第二边开始于第二节点r[y:20]并结束于第三节点+。
[0130]
第三节点+定义了第一运算,在该示例中为加法,该第一运算的运算元包括第一子图(在该示例中为标量a)和第二子图,所述第二子图包括定义子结果的第四节点t(x,y)。
[0131]
第二节点r[y:20]定义了用于重复执行第一运算的第一程序循环。第一节点r[x:10]定义了用于重复执行第一程序循环的第二程序循环。
[0132]
第二边类型的第三边开始于第二节点r[y:20]并结束于第五节点t[y:20]。第一边类型的第四边开始于第五节点t[y:20]并结束于第六节点*。第六节点*定义了第二运算,在该示例中为第七节点n(x,y)和第八节点act(x,y)的乘法。
[0133]
第五节点t[y:20]定义了用于重复执行第二运算的第三程序循环。
[0134]
第三边类型的第六边开始于第四节点t(x,y)并结束于第四节点t[y:20]。
[0135]
在这种情况下,第二结构包括第一节点r[x:10]、第二节点r[y:20]、第三节点+、第一子图和第二子图,如针对第一结构所述,其中在第二子图中第四节点t(x,y)被第五节点t[y:20]替换。第六节点*、第七节点n(x,y)和第八节点act(x,y)布置为与针对第一结构所描述的相同。
[0136]
图11示出了从一个子图到另一个子图的缩减分解。由此产生了新的中间结果,该中间结果首先被确定,然后进入缩减。
[0137]
第一结构可以定义为如图11中左侧所示。第二结构可以定义为如图11中右侧所示。第一结构可以包括第一节点r[x:10],第一边开始于所述第一节点并结束于第二节点r[y:20]。第二边开始于第二节点r[y:20]并结束于第三节点。第三边开始于第三节点并结束于第四节点*。第四节点*定义了第一运算,在该示例中为根据至少三个维度第五节点n(x,z)和第六节点act(z,y)的乘法。在该示例中,为第五节点n(x,z)定义了第一维度x和第二维度y,并且为第六节点act(z,y)定义了第二维度和第三维度y。第三节点定义了第二运算和用于重复执行第一运算的第一程序循环。通过重复执行第一程序循环,缩减了至少三个维度中的一个,在该示例中为第二维度z。第四边开始于第三节点并结束于第七节点0,该第七节点定义了用于缩减的起始值。第一节点定义了第二程序循环,用于重复执行针对第一维度x的第二运算。因此不需要在第三维度y上重复执行。
[0138]
在该示例中,第二结构定义了第一节点r[x:10],第一边开始于所述第一节点并结束于第二节点r[y:20]。第二边开始于第二节点r[y:20]并结束于第三节点。在第二结构中,第四节点*被第八节点t(x,y,z)替换,该第八节点定义了子结果。第三节点定义了第一程序循环和针对第八节点t(x,y,z)的第二运算,即子结果,以及第七节点,即用于缩减的起始值。
[0139]
第二结构包括开始于第一节点r[x:10]并结束于第九节点t[y:20]的第五边。第六边开始于第九节点t[y:20]并结束于第十节点t[y:20]。第七边开始于第十节点t[y:20]并结束于第十一节点t[z:30]。第八边开始于第十一节点t[z:30]并结束于第四节点*。第四节点*定义了第一运算,在该示例中为根据至少三个维度的第五节点n(x,y,z)和第六节点act(z,y)的乘法。在该示例中,与第一结构不同,为第五节点n(x,y,z)定义了第一维度x、第二维度z和第三维度y。第九节点t[y:20]、第十节点t[y:20]和第十一节点t[z:30]定义了第三程序循环,用于重复执行第一运算。由此确定了相同的子结果。第三边类型的第九边开始于
第八节点t(x,y,z)并结束于第九节点t[y:20]。由此代表了第二结构中的新数据依赖性。第四边类型的第十边开始于第八节点t(x,y,z)并结束于第三节点。由此代表了第二结构中的新程序循环。
[0140]
在该示例中,运算元和运算的数据由计算规则的输入或由计算规则的子结果定义。
[0141]
第一结构可以定义包括第一节点n的第一子图,没有边开始于该第一节点。第一节点可以在至少两个维度[i]、[j]中为计算装置102定义第一存储区域。第一结构包括第二节点,该第二节点为第一存储区域中的值定义了运算。在这种情况下,该方法可以规定在第一存储区域的至少一个维度[j]中定义计算装置102的第二存储区域。在这种情况下,第二结构定义了第二子图,在所述第二子图中第一子图的第一节点被定义了第二存储区域的第三节点n替换。在这种情况下,第二结构为第一存储区域的在第二存储区域中缺失的至少一个维度定义了程序循环,该程序循环定义了在该维度上使用第二运算元重复执行运算。
[0142]
可以规定提供多个第一结构,其中为在第一图中找到的第一结构确定多个第二图。可以规定在多个第二图中搜索多个第一结构。可以迭代地重复该搜索,直到不再找到与搜索模式对应的另外的子图。
[0143]
第一图和得到的多个第二图定义了可用模板搜索以确定适用于产生用于计算计算规则的指令的图的候选。这可以在连接硬件加速器时或者当在使用计算装置102计算之前输入先前未知的计算规则时进行。由此可以在计算装置102的运行期间产生用于任何硬件加速器和任何计算规则的正确指令。
[0144]
该计算装置102可以用可以独立于计算装置本身制造的任何硬件加速器运行。
[0145]
在人工神经网络的情况下,计算规则可以定义或包括定义所述人工神经网络的内核。
[0146]
可以规定,为了自动产生图而提供数据结构,该数据结构是为了节点而根据该节点的节点类型如下定义的。在该示例中,所述节点类型是由张量节点、缩减节点、计算节点、输入节点、访问节点构成的组中的一个。示例性的数据结构在图12中示出。
[0147]
下面,父节点表示边开始于的节点,并且该边结束于其数据结构包括定义所述父节点的数据字段的节点。下面,子节点表示边开始于的节点,该边的数据结构包括定义所述子节点的数据字段。如果不存在父节点或子节点,则这在该示例中由对应数据字段中的空条目来定义。
[0148]
节点类型张量节点由数据结构900定义,该数据结构900包括用于父节点的数据字段902、用于可通过第一边类型的边到达的子节点的数据字段904、用于可通过第二边类型的边到达的子节点的数据字段906、用于数据用户的数据字段908和用于张量的至少一个维度的大小的数据字段910。
[0149]
用于父节点的数据字段902可以定义其他张量节点,或者包含空条目。
[0150]
用于可通过第一边类型的边到达的子节点的数据字段904可以定义由张量节点、缩减节点、计算节点、输入节点构成的组的节点。
[0151]
用于可通过第二边类型的边到达的子节点的数据字段906可以定义其他张量节点。
[0152]
用于数据用户的数据字段908可以定义条目或包含空条目。
[0153]
用于大小的数据字段910可以定义间隔。在该示例中,间隔包括针对维度上限、针对维度下限和针对重复执行程序循环的步长的条目。所述上限、所述下限和所述步长可以是整数值。
[0154]
节点类型缩减节点由数据结构912定义,该数据结构912包括用于父节点的数据字段902、用于可通过第一边类型的边到达的子节点的数据字段904、用于可通过第二边类型的边到达的子节点的数据字段906和用于缩减的至少一个维度的大小的数据字段914。
[0155]
用于父节点的数据字段902可以定义由张量节点、缩减节点、计算节点构成的组中的节点。
[0156]
用于可通过第一边类型的边到达的子节点的数据字段904可以定义输入节点。
[0157]
用于可通过第二边类型的边到达的子节点的数据字段906可以定义来自由缩减节点、计算节点、输入节点构成的组中的节点。
[0158]
用于大小的数据字段914可以定义间隔。在该示例中,间隔包括针对维度上限、针对维度下限和针对重复执行缩减计算的步长的条目。所述上限、所述下限和所述步长可以是整数值。
[0159]
节点类型计算节点由数据结构916定义,该数据结构916包括用于父节点的数据字段902、用于可通过第一边类型的边到达的子节点的数据字段904、用于可通过第二边类型的边到达的子节点的数据字段906和用于运算的数据字段918。
[0160]
用于父节点的数据字段902可以定义由张量节点、缩减节点、计算节点构成的组中的节点。
[0161]
用于可通过第一边类型的边到达的子节点的数据字段904可以定义由缩减节点、计算节点、输入节点构成的组中的节点。
[0162]
用于可通过第二边类型的边到达的子节点的数据字段906可以定义由缩减节点、计算节点、输入节点构成的组中的节点。
[0163]
用于运算的数据字段918可以定义算术运算,例如加法+、减法-、乘法*、除法:或其他一元和二元运算,例如正弦、余弦、正切、最大值(max)、最小值(min)、指数函数或移位(bitshift)。
[0164]
节点类型输入节点由数据结构920定义,该数据结构920包括用于父节点的数据字段902、用于由于第三边类型的边而产生的依赖性或顺序的数据字段922以及用于一个或多个子节点的数据字段924。
[0165]
用于父节点的数据字段902可以定义由张量节点、缩减节点、计算节点构成的组中的节点。
[0166]
用于由于第三边类型的边而产生的依赖性的数据字段922可以定义该边所通向的张量节点或包含空条目。
[0167]
用于一个或多个子节点的数据字段924可以包括具有一个或多个访问节点的列表。
[0168]
节点类型访问节点由数据结构926定义,该数据结构926包括用于父节点的数据字段902、用于值类型的数据字段928和用于一个或多个子节点的数据字段924。
[0169]
用于父节点的数据字段902可以定义由输入节点或访问节点构成的组中的节点。
[0170]
用于值类型的数据字段928可以定义由访问节点从存储器引用的数据的类型。所
述类型可以是迭代器、运算或标量常量。
[0171]
用于子节点的数据字段924可以包括具有一个或多个访问节点的列表或空条目。
[0172]
访问节点可以定义存储器108中的向量、张量或矩阵的维度之一。对多个维度的访问可以由访问节点链来定义,其中链中的第一访问节点定义第一维度并且链中的最后一个访问节点定义最高维度。在此,在输入节点中将第一维度的访问节点定义为子节点。第一维度的访问节点将第二维度的访问节点定义为子节点。这一直持续到访问节点定义了最高维度的最后一个访问节点为止。最后一个访问节点为子节点定义了空条目。
[0173]
模式搜索的说明可以通过在alfred v. aho和margaret j. corasick,1975,efficient string matching: an aid to bibliographie search,commun. acm 18, 6 (1975年6月), 333-340, https://doi.org/10.1145/360825.360855中描述的过程来确定。
[0174]
模式识别可以通过在christoph m. hoffmann和michael j. o’donnell. 1982. pattern matching in trees. j. acm 29, 1 (1982年1月),68-95, https://doi.org/10.1145/322290.322295中描述的搜索过程来进行。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1