用于在神经网络中处理数据的静态生成的经编译表示

文档序号:169817 发布日期:2021-10-29 浏览:19次 >En<

阅读说明:本技术 用于在神经网络中处理数据的静态生成的经编译表示 (Statically generated compiled representation for processing data in a neural network ) 是由 李修宇 杨建� 于 2020-04-28 设计创作,主要内容包括:一种电子装置,包括:存储器,其存储输入矩阵A和B;高速缓存存储器;以及处理器。所述处理器生成经编译表示,所述经编译表示包括用于在通过神经网络处理输入数据实例时从输入矩阵A获取数据的值,所述值包括输入矩阵A中针对多个线程中的每个线程的基址和相对偏移,所述相对偏移是将由所述线程处理的输入矩阵A的元素之间的距离。然后,所述处理器在所述本地高速缓存存储器中存储包括针对每个线程的所述基址和所述相对偏移的所述经编译表示。(An electronic device, comprising: a memory storing input matrices a and B; a cache memory; and a processor. The processor generates a compiled representation comprising values for obtaining data from an input matrix a when processing an input data instance over the neural network, the values comprising a base address for each of a plurality of threads in the input matrix a and a relative offset, the relative offset being a distance between elements of the input matrix a to be processed by the thread. The processor then stores the compiled representation including the base address and the relative offset for each thread in the local cache memory.)

具体实施方式

呈现以下描述以使本领域的任何技术人员能够制造和使用所描述的实施例,并且在特定应用及其要求的上下文中提供以下描述。对所描述的实施例的各种修改对于本领域技术人员来说将是明显的,并且可以将本文定义的一般原理应用于其他实施例和应用。因此,所描述的实施例不限于所示的实施例,而是将被赋予与本文公开的原理和特征一致的最宽范围。

术语

在以下描述中,使用各种术语来描述实施例。以下是这些术语中的一些的简化且一般描述。注意,这些术语可能具有重要的附加方面,为了清楚和简洁起见,本文没有列举所述附加方面,且因此该描述并不旨在限制这些术语。

功能块:功能块是指一个或多个互相关的电路元件(诸如集成电路元件/电路、分立电路元件/电路等)的组、集合和/或集。电路元件是“互相关的”,因为电路元件共享至少一种性质。例如,互相关的电路元件可以包括在特定的集成电路芯片、衬底、电路板或其一部分中、制造在其上或以其他方式耦合到其上,可以涉及给定功能(计算或处理功能、存储器功能等)的执行,可以由公共控制元件和/或公共时钟控制等。功能块可以包括具有任意数量的电路元件的电路,从单个电路元件(例如,单个集成电路逻辑门或分立电路元件)到数百万或数十亿的电路元件(例如,集成电路存储器)。

线程:线程是抽象实体,其表示或识别程序代码或“内核”的部分的执行,用于在处理子系统(例如,中央处理单元或图形处理单元)中的处理硬件上执行任务。处理硬件可以包括多个(并且可能是大量)支持的线程中的每个线程的单独电路(例如,寄存器、标志等),并且因此可以存储并跟踪每个线程的相应操作状态。在一些实施例中,多个支持的线程中的一个或多个同时处于活动状态,并因此执行了相应的程序代码。其余线程处于不活动状态,且因此排队、等待处理硬件资源的可用性、数据从存储器返回等。在一些实施例中,将诸如通过神经网络处理数据实例的计算作业进行划分,并且将计算作业的部分分配给来自多个线程中的各个线程进行处理。例如,可以使用多个线程来执行各个矩阵运算,诸如用于通过神经网络处理输入数据实例的多维输入矩阵的矩阵数学运算。

通用矩阵乘法运算

在所描述的实施例中,当通过神经网络处理输入数据实例时,通用矩阵乘法(GEMM)运算用于计算值。一般地,GEMM运算是根据诸如众所周知的基本线性代数子程序(BLAS)规范等规范来实现的,并且包括(或用于)矩阵-矩阵运算,诸如乘法、融合乘加(FMA)等。在一些实施例中,用于GEMM子例程的程序代码被包括在诸如数学库的库中,并且因此可以被操作系统、应用程序和由电子装置中的处理子系统执行的其他软件例程调用。

在一些实施例中,用于GEMM运算的子例程被配置成接受输入矩阵的特定格式和/或维数。例如,在一些实施例中,GEMM运算使用——并且可能需要——输入矩阵的指定二维输入格式。例如,BLAS规范中GEMM的一个众所周知的版本DGEMM的格式为C:=α*op(A)*op(B)+β*C,其中α和β是标量,而A、B和C是矩阵,op(A)是M乘K矩阵,op(B)是K乘N矩阵,且C是M乘N矩阵,其中K、M和N是整数。

在所描述的实施例中,可以将GEMM运算分解或分成多个单独的子运算,用于在多线程处理子系统上执行。在这些实施例中,处理子系统所支持的线程集中的一些或所有线程负责执行整个GEMM运算的一个或多个子运算。例如,如果将GEMM运算用作融合乘加(fused multiply add,FMA)的一部分,在FMA中将两个矩阵的元素相乘在一起且然后将乘法的结果求和以生成FMA的最终结果,则可以将每个单独的线程用于执行GEMM的乘法运算和FMA的加法运算中的一项或多项。

神经网络

如上所述,神经网络是一种计算结构,其包括内部元件(例如,节点、定向边、特征处理元件等),使用输入数据实例或在输入数据实例上训练内部元件以执行指定任务。在所描述的实施例中,作为通过神经网络处理输入数据实例的操作的一部分,线程执行GEMM运算以计算指定值。例如,在一些实施例中,处理子系统中的处理线程使用来自第一输入矩阵的输入数据值和来自第二输入矩阵的权重值作为GEMM运算的输入用于计算完全连接的神经网络中节点的内部值。作为另一示例,在一些实施例中,线程使用来自输入矩阵的值作为GEMM运算的输入用于卷积神经网络的特征处理元件中的卷积计算。如下面更详细描述的,当在神经网络中处理输入数据实例时,使用经编译表示将更高维的输入矩阵转译或转换成可以在二维GEMM运算中使用的格式。

综述

在所描述的实施例中,电子装置包括处理子系统(例如,图形处理单元或中央处理单元)、存储器(例如,“主”存储器)和用于处理子系统的本地高速缓存存储器。处理子系统使用处理子系统所支持的多个线程来执行用于通过神经网络处理输入数据实例的操作。作为通过神经网络处理输入数据实例的操作的一部分,线程执行通用矩阵乘法(GEMM)运算以计算指定值。

如上所述,GEMM运算可以使用——并且可能需要——二维输入。然而,当在神经网络中处理输入数据实例时,所描述的实施例可以在更高维的输入矩阵(即,三维或更多维)上进行操作。例如,在一些实施例中,输入矩阵以众所周知的四维NCHW(其中N=批次,C=通道,H=高度,W=宽度)或CNHW格式、五维NCHWVector格式等组织。因为输入矩阵中的数据是根据给定的高维格式存储在存储器中的,所以在可以将数据用于GEMM运算之前,确定将由每个线程处理的数据所在的存储器中的地址。换句话说,更高维的格式将被转换或转译为GEMM运算使用的二维格式。对于此操作,所描述的实施例生成用于GEMM运算的两个输入矩阵之一(本文称为输入矩阵A)中的数据的“经编译表示”,其用于确定输入矩阵A中的数据在存储器中的位置。一般地,经编译表示是一条记录(即列表、索引等),该记录包括将用于在每个线程的基础上识别存储器中存储输入矩阵A中的元素的位置的信息。因此,可以将经编译表示用于从存储器中获取输入矩阵A的数据,以由线程中的每个在GEMM运算中进行处理。

在一些实施例中,经编译表示中的信息与用于GEMM运算的第二输入矩阵具有指定关系,其在本文称为输入矩阵B。一般地,当通过神经网络处理输入数据实例时,在GEMM运算中一起处理了来自输入矩阵A的值(例如输入数据)和来自输入矩阵B的值(例如权重或卷积过滤器值)。经编译表示和输入矩阵B之间的指定关系使得位于距经编译表示的基址相应偏移处的经编译表示中的每个位置都包括用于确定输入矩阵A中对应位置的地址的信息,同时相应元素位于距输入矩阵B的基址相同的偏移中。换句话说,如果经编译表示中的位置X包括用于确定将在GEMM运算中使用的输入矩阵A中的值在存储器中的地址的信息,则输入矩阵B中的匹配值将位于距输入矩阵B的基址X偏移处。因此,经编译引用可以不包括关于输入矩阵B的信息(并且处理器将以其它方式被配置成辨识和使用指定关系),或者可以包括关于输入矩阵B的简单信息,诸如输入矩阵B在存储器中的基址或位置。

在所描述的实施例中,“静态地”生成经编译表示,且因此事先准备好经编译表示用于在GEMM运算期间确定存储器位置的地址。如本文所用,静态地意味着在当使用GEMM运算处理输入数据实例时之前的某个时间并且可能是在处理输入数据实例之前的相对较长的时间处生成经编译表示。在一些实施例中,单独生成并存储静态地生成的经编译表示以准备用于随后通过神经网络处理输入数据实例。

在一些实施例中,经编译表示包括两种类型的信息,其被组合使用以确定输入矩阵A中的元素在存储器中的位置。两种类型的信息是:(1)每线程基址和(2)相对偏移。每个基址是输入矩阵A中的存储器地址,其用作相应线程的起始点或初始地址。每个线程都有单独且不同的基址且因此经编译表示包括针对每个线程的相应基址的列表。相对偏移是存储器偏移(例如,元素的数量、元素的标识符、字节等),其与基址相结合地使用以确定每个线程将处理的输入矩阵A中的元素的存储器的位置。例如,如果第一线程和第二线程的基址为A1和A2,且相对偏移为X、Y和Z,则第一线程将处理的存储器元素的位置为A1+X、A1+Y和A1+Z,且第二线程将处理的存储器元素的位置是A2+X、A2+Y和A2+Z。

在一些实施例中,使用与输入矩阵A、输出矩阵(本文称为输出矩阵C)、神经网络的性质和/或其他值相关联的值集来生成经编译表示。例如,在一些实施例中,计算用于输入矩阵A的每个线程的基址包括根据该线程的线程标识符、输入矩阵A和/或输出矩阵C的维数、输入矩阵A和/或输出矩阵C的元素的性质以及神经网络性质中的一些或全部来计算该基址。作为另一示例,在一些实施例中,计算输入矩阵A的相对偏移包括根据输入矩阵A和/或输出矩阵C的维数、输入矩阵A和/或输出矩阵C的元素的性质以及神经网络性质中的一些或全部来计算相对偏移。用于计算基址和相对偏移的一些示例表达式描述如下。

在一些实施例中,通过神经网络处理输入数据实例包括使用经编译表示以从输入矩阵A获取输入数据,以及单独地从输入矩阵B获取对应数据。对于该操作,处理子系统获取用于输入矩阵A的每个线程的基址。然后,在输入矩阵A的元素有待处理时,处理子系统使用来自经编译表示的相对偏移来获取每个线程的值以供在GEMM运算中处理。更具体地,对于下一个线程,处理子系统从存储器中由来自经编译表示的对应相对偏移调整的该下一个线程的基址识别的位置处的输入矩阵A的元素中读取第一值。然后,处理子系统从与输入矩阵A的元素相关联的存储器位置处(即,在输入矩阵B中对应于由对应相对偏移调整的下一个线程的基址的位置处)的输入矩阵B的元素中读取第二值。然后,处理子系统将第一值和第二值用作线程的GEMM运算的输入。接下来,处理子系统将GEMM运算的结果存储在存储器中的输出矩阵C中。

在一些实施例中,组织经编译表示使得以促进本地高速缓存中的高速缓存行中的数据的重新使用的方式从输入矩阵A和/或输入矩阵B获取数据。在这些实施例中,可以一起(例如,在顺序存储器读取操作中)从存储器中获取两个或更多个线程顺序(即,在相邻的顺序GEMM运算期间)使用的数据值,并将数据值存储在单个高速缓存行的各个部分中。以这种方式,数据在高速缓存中可用于所有两个或更多个线程,并且可以通过不要求将多个高速缓存行加载到高速缓存存储器以履行两个或更多个线程的数据需求来帮助避免从高速缓存中驱逐有用的数据。

通过使用静态地生成的经编译表示来从输入矩阵A获取数据,所描述的实施例可以避免在执行GEMM运算期间计算地址信息,这可以显着加速GEMM运算。经编译表示的使用也可以意味着针对输入矩阵的不同格式和布置可以将相同的内核(或其他程序代码)用于执行GEMM运算。内核中可以使用简化的、优化的和通用的程序代码,这可以加速内核(以及因此GEMM运算)。所描述的实施例也可以更有效地使用高速缓存存储器中的空间/高速缓存行,这可以提高高速缓存存储器的性能。在通过神经网络处理输入数据实例时提高GEMM运算和高速缓存存储器的性能可以提高电子装置的整体性能,这导致增加的用户满意度。

电子装置

图3呈现了示出根据一些实施例的电子装置300的框图。电子装置300包括处理器302和存储器304。一般地,处理器302和存储器子系统304是以硬件(即,使用各种电路、电路元件和装置)实现的功能块。例如,处理器302和存储器304可以完全在一个或多个半导体芯片上实现,包括在一个或多个单独的半导体芯片上实现,可以与分立电路元件相结合地使用半导体芯片来实现,可以仅使用分立电路元件来实现,等等。处理器302和存储器304在训练期间或在执行与神经网络相关联的任务(例如,分类等)时执行与通过神经网络处理输入(或训练)数据实例相关联的操作。例如,处理器302和/或存储器304执行用于静态地生成输入矩阵的经编译表示的操作,以用于为确定输入矩阵中的数据的位置以供后续GEMM运算。

处理器302是在电子装置300中执行计算、存储器访问和其他操作的功能块。处理器302包括处理子系统306和高速缓存存储器308。处理子系统306包括执行通用计算、控制和/或其他操作的一个或多个功能块,诸如中央处理单元(CPU)核、图形处理单元(GPU)核、神经网络处理器/加速器、嵌入式处理器和/或专用集成电路(ASIC)。图4呈现了示出根据一些实施例的处理子系统306的框图。一般地,在图4中,处理子系统306被示为包括可能在通用GPU中找到的相同的内部功能块中的一些。尽管在处理子系统306中示出了特定布置和数量的元件,但是在一些实施例中,在处理子系统306中使用不同数量和/或布置的处理子系统。例如,在一些实施例中,在处理子系统306中的内部功能块类似于可能在CPU中找到的那些。作为另一个示例,在一些实施例中,处理子系统306中的内部功能块包括与在CPU和通用GPU两者中都可以找到的功能块类似的功能块的组合。

如在图4中可看到,处理子系统306包括多个计算单元400,每个计算单元(仅在最顶层的计算单元400中示出)包括多个流处理器402和寄存器文件404(为了清楚起见,仅标记了流处理器402中的三个)。每个流处理器402是包括将用于执行一个或多个处理线程(或更简单地,“线程”)的处理操作的处理电路(例如,浮点或整数算术逻辑单元、逻辑电路等)的功能块。在一些实施例中,每个计算单元400支持多个线程,例如25个、50个或另一数量的线程,并且每个计算单元400中的流处理器402可以用于(例如,按需、按时间片、按循环访问模式等)处理多个不同线程的操作。寄存器文件404是包括用于存储用于流处理器402的信息和数据的存储器电路的功能块。在一些实施例中,寄存器文件404包括用于存储用于各个线程中每个的信息和数据的存储器电路的单独副本。前端406是执行用于进行以下各项的操作的功能块:调度在流处理器402中执行的线程;从电子装置300中的其他实体接收命令、请求、消息等和对其进行解码/解译;与电子装置300中的其他实体进行通信等。高速缓存存储器408是包括存储器电路的功能块,所述存储器电路用于存储用于计算单元400的指令、信息和/或数据的本地副本(例如,从高速缓存存储器308、存储器304和/或另一个源获取的指令、信息和/或数据的副本)。高速缓存存储器408是较高速存储器,其中存储指令、信息和/或数据(例如,用于计算操作的操作数、来自操作的结果、指令、配置值和/或其他信息)的副本,以便能够比访问高速缓存存储器308或存储器304中的数据更快地访问指令、信息和/或数据。在一些实施例中,高速缓存存储器408位于计算单元400中的访问高速缓存存储器408中的数据的副本的处理电路附近,并且经由高速接口连接到处理电路,从而实现所存储的数据的快速访问。在一些实施例中,使用高速缓存存储器408存储将如本文所述使用的输入矩阵的经编译表示。存储器接口(MEM INT)410是包括用于访问(例如,读取、写入、无效等)高速缓存存储器308、存储器304和高速缓存存储器408中的指令、信息和数据的电路的功能块。

高速缓存存储器308是执行用于存储指令、信息和数据的副本以供处理子系统306和电子装置300中的可能其他实体访问的操作的功能块。高速缓存存储器308是其中存储数据的副本以便实现比访问存储器304中的数据更快地访问数据的较高速存储器。在一些实施例中,高速缓存存储器308位于处理子系统306中的访问高速缓存存储器308中的数据的副本的处理电路附近,并且经由高速接口连接到处理电路,从而使得能够快速访问所存储的数据。在一些实施例中,高速缓存存储器308包括用于存储数据的易失性存储器电路诸如静态随机存取存储器(SRAM)电路。

存储器304是执行电子装置300中的存储器(例如,“主”存储器)的操作的功能块。存储器304包括用于存储指令、信息和数据以供电子装置300中的功能块访问的存储器电路,以及用于处理存储器电路中的数据的访问的控制电路。存储器304中的存储器电路包括易失性存储器电路诸如第四代双倍数据速率同步动态随机存取存储器(DDR4SDRAM)、静态随机存取存储器(SRAM)和/或其他类型的存储器电路。在一些实施例中,从存储器304获取数据的副本,并将其存储在高速缓存存储器308和高速缓存存储器408中,以使得能够更快地访问数据的副本。

电子装置300被示为包括特定数量和布置的元件(例如,功能块和装置诸如处理器302、存储器304等)。然而,出于说明性目的,简化电子装置300。在一些实施例中,电子装置300中存在不同数量或布置的元件。例如,电子装置300可以包括电源子系统、人机界面系统等。作为另一个示例,在一些实施例中,电子装置300包括大容量存储装置,诸如磁盘驱动器或更高容量的集成电路存储器,其用作电子装置300中的数据的非易失性存储装置,并且从其获取指令、信息和数据的副本以存储在存储器304、高速缓存存储器308和/或高速缓存存储器408中。一般地,电子装置300包括足够的元件以执行本文描述的操作。

电子装置300可以是或可以包括在使用输入矩阵执行神经网络处理的任何电子装置中。例如,电子装置300可以是或可以包括在电子装置中,诸如台式计算机、膝上型计算机、可穿戴电子装置、平板计算机、智能电话、服务器、人工智能设备、虚拟或增强现实装备、网络器械、玩具、视听装备、家用电器、控制器、车辆等和/或其组合。

经编译表示

在所描述的实施例中,处理子系统(例如,处理子系统306)针对将用于通过神经网络处理输入数据实例的输入矩阵生成经编译表示。经编译表示是引用,即列表、索引等,其可以由处理子系统用来确定更高维输入矩阵(即,三维或更多维)中的元素在存储器(例如,存储器304)中的位置/地址,为了方便起见,该更高维输入矩阵被称为输入矩阵A,其将被用作GEMM运算的输入。换句话说,经编译表示用作从更高维输入矩阵A到用于GEMM运算(即,用于矩阵-矩阵乘法运算等)的二维输入矩阵的转换或映射。

图5呈现了示出根据一些实施例的经编译表示500的框图。经编译表示500包括多个基址502。每个基址是或包括输入矩阵A中的存储器中的位置的地址(或其他标识符),该地址用作各个不同线程的基址。使用每个线程的基址作为存储器中的起始点,用于确定输入矩阵A中的元素的地址或位置,从所述地址或位置中获取值以供该线程在GEMM运算中处理。对于图5中的示例,处理子系统支持N个线程,且因此经编译表示500包括N个单独的基址502。经编译表示500也包括多个相对偏移504。每个相对偏移504是位移或偏移值,该位移或偏移值将与基址一起用于确定输入矩阵A中的元素的地址或位置,从所述地址或位置中获取值。

图6呈现了示出根据一些实施例的存储器中的输入矩阵A和输入矩阵B的框图。如在图6中可看到,输入矩阵A和B中的每个都包括多个元素600(为清楚起见仅标记了其中一个),每个元素600存储值,该值将用于GEMM运算中用于通过神经网络处理输入数据实例。例如,输入矩阵A的元素600可以存储用于节点、特征提取元件或神经网络的某一其他部分的输入数据值,并且输入矩阵B的元素600可以存储权重值、过滤器值或其他将被用作GEMM运算的输入的值。例如,输入数据可以包括来自将分类的图像中的像素的值、来自将分类的声音的音频样本、将在特征提取元件中过滤的图像部分等。输入矩阵A和B根据诸如NCHW等格式存储在存储器中,且因此其中用于输入数据实例(或其组)的元素和值被组织以满足格式的规范。

使用图5中的经编译表示,使用thread_0的基址加上相对偏移来确定将由第一线程(即,Thread_0或T0)在GEMM运算中处理的输入矩阵A中的元素。例如,如图6所示,线程0将处理的第一元素(即其中的值)是输入矩阵A中最左边的元素,示为T0+RO0(即基址thread_0加上相对偏移[0])。因此,当通过神经网络处理输入数据实例时,thread_0首先获取输入矩阵A的最左边元素中的值,并在GEMM运算中处理该值。注意,“最左边”元素的选择仅用于图6中的示例,在一些实施例中,thread_0从输入矩阵A中的不同位置开始,这取决于输入矩阵A中的数据的格式、线程或其他线程的身份等。继续该示例,线程0将处理的第二元素是示为T0_RO1的元素,它是基址thread_0加上相对偏移[1],以及线程0将处理的第三元素是示为T0_RO2的元素,它是基址thread_0加上相对偏移[2]。以这种方式,利用经编译表示500,对于每个线程,所描述的实施例从该线程的基址开始以相对偏移的顺序前进通过输入矩阵A,获取数据并处理该数据以用于GEMM运算。

在一些实施例中,布置经编译表示500,以使得将在GEMM运算中处理的输入矩阵B中的元素(即其中的值)与来自输入矩阵A的元素一起具有指定关系。一般地,指定关系使得从输入矩阵B中的元素获取值需要最少的计算,例如,递增或以其他方式增加输入矩阵B的元素指针。对于图6中的示例,元素由线程在输入矩阵B中从输入矩阵B的基址开始以顺序或线性方式访问。输入矩阵B的基址不是如在经编译表示500中的每线程地址,而是输入矩阵B本身的存储器中的基址。在这些实施例中,因此,并且如图6所示,输入矩阵B的与输入矩阵A中的元素T0+RO0一起被获取以进行处理的元素是元素B0,输入矩阵B的与输入矩阵A中的元素T0+RO1一起被获取以进行处理的元素是元素B1,并且输入矩阵B的与输入矩阵A中的元素T0+RO2一起被获取以进行处理的元素是元素B2。因此,在图6的示例中,当处理子系统通过经编译表示500前进来确定输入矩阵A中的元素的地址时,处理子系统简单地递增输入矩阵B的元素指针,以从输入矩阵B中的对应元素获取值。

在一些实施例中,将经编译表示500存储在高速缓存存储器506中,高速缓存存储器506是用于处理子系统的本地高速缓存存储器(例如,处理子系统306中的高速缓存存储器408等)。因为将经编译表示500存储在高速缓存存储器506中,所以可(比从例如存储器304)更快速地获取和使用基址502和相对偏移504用于确定元素在存储器中的地址。

用于生成经编译表示的过程

在所描述的实施例中,当通过神经网络处理输入数据实例时,处理子系统(例如,处理子系统306)生成输入矩阵的经编译表示,其包括将用于在存储器中定位输入矩阵的元素以用于GEMM运算的信息。图7呈现了示出根据一些实施例的用于生成经编译表示的过程的流程图。注意,图7所示的操作被呈现为由一些实施例执行的操作的一般示例。由其他实施例执行的操作包括不同的操作、以不同的顺序执行的操作和/或由不同的实体或功能块执行的操作。例如,使用具有特征处理元件、过滤器等的卷积神经网络来描述图7,但是可以对其他类型的神经网络(诸如完全连接的神经网络等)执行适当调整的操作。

对于图7中的操作,假设输入矩阵A存储在存储器(例如,存储器304)中,并且因此可用于经编译表示的静态生成。也假设输入矩阵A具有多个元素(例如,元素600),其中存储了将用于通过神经网络处理输入数据实例的数据。例如,输入矩阵A中的元素可以存储数据,诸如图像中的像素或像素区域的值,以便在对图像进行分类的神经网络中进行处理。进一步假设,输入矩阵A中的数据以两个以上的维数进行组织,诸如以众所周知的四维NCHW(其中,N=批次,C=通道,H=高度,W=宽度)或CNHW格式、五维NCHWVector格式等等进行组织。

图8呈现了根据一些实施例的描述在用于描述图7和图9至图10中的操作的表达式中使用的因子或值的关键字。一般地,因子或值是神经网络或输入数据实例(或其组)的性质或特性、用于通过神经网络处理输入数据实例的输入矩阵、以及当通过神经网络处理输入数据实例时将生成的输出矩阵。如在图8中可看到,因子或值包括:WI–输入矩阵A的宽度;HI–输入矩阵A的高度;R–特征处理元件中使用的过滤器的宽度;S–特征处理元件中使用的过滤器的高度;SU–特征处理元件中使用的过滤器U跨距;SV–特征处理元件中使用的过滤器V跨距;DU–特征处理元件中使用的过滤器U膨胀;DV–特征处理元件中使用的过滤器V膨胀;WO–输出矩阵C的宽度;HO–输出矩阵C的高度;INC–输入通道;和ONC–输出通道。如上所述,这些因子和值被用于具有特征处理元件的神经网络诸如卷积神经网络,但是针对图7至图10描述的原理对于其他类型的神经网络的经编译表示的生成是相似的。

当处理子系统计算存储在存储器中的输入矩阵A中的相应基址以与多个线程中的每个线程相关联时,图7中的操作开始(步骤700)。对于该操作,处理子系统计算每个线程的基址(例如,基址502),该基址随后被用于确定输入矩阵A中元素的起始点,从该起始点获取值以供该线程处理。图9呈现了根据一些实施例的经编译表示的基址计算的伪代码示例。如在图9中可看到,当计算基址时,处理子系统计算中间值PIX和IBS作为每个线程的线程标识符(TID)以及针对图8所述的因子和值的组合的相应函数。然后,处理子系统使用PIX和IBS以及针对图8所述的因子和值的组合来计算每个线程的基址(BASE_ADDR_A[TID])。注意,图9中的表达式中的SIZEOF(ELEM_TYPE)是输入矩阵A中的元素的大小(例如,以字节为单位等)。此外,尽管图9被呈现为一般示例,但是在一些实施例中,执行不同的操作和/或不同的操作顺序来计算基址。

在一些实施例中,处理子系统也在经编译表示中存储第二输入矩阵即输入矩阵B的基址。如上所述,在这些实施例中的一些中,经编译表示不包括输入矩阵B的每线程基址信息,且因此基址只是存储器中的一个位置(例如,地址、指针等),从该位置开始将按顺序找到输入矩阵B的元素。然而,在一些实施例中,输入矩阵B的基址是变量、指针或与经编译表示分开管理的其他值。

然后,处理子系统计算线程的相对偏移,该相对偏移是将由线程处理的输入矩阵A的元素之间的距离(步骤702)。对于该操作,处理子系统计算相对偏移(例如,相对偏移504)集,随后将其与每个线程的基址相结合地使用以确定该线程将处理的输入矩阵A中的元素。图10呈现了根据一些实施例的经编译表示的相对偏移计算的伪代码示例。如在图10中可看到,当计算相对偏移时,处理子系统使用计数器C、V和U来计算相对偏移(RELO)中的每个,计数器C、V和U基于针对图8所述的某些因子和值而受到限制。注意,图10中的表达式中的SIZEOF(ELEM_TYPE)是输入矩阵A中的元素的大小。此外,尽管图10被呈现为一般示例,但是在一些实施例中,执行不同的操作和/或不同的操作顺序来计算相对偏移。

在一些实施例中,组织经编译表示使得以促进本地高速缓存中的高速缓存行中的数据的重新使用的方式从输入矩阵A和/或输入矩阵B获取数据。在这些实施例中,可以一起(例如,在顺序存储器读取操作中)从存储器中获取两个或更多个线程顺序(即,在相邻的顺序GEMM运算期间)或在时间上彼此相邻使用的数据值,并将数据值存储在单个高速缓存行的各个部分中。以这种方式,数据在高速缓存中可用于所有两个或更多个线程,并且可以通过不要求将多个高速缓存行加载到高速缓存存储器以履行两个或更多个线程的数据需求来帮助避免从高速缓存中驱逐有用的数据。

然后,处理子系统将输入矩阵A的经编译表示存储到本地高速缓存存储器(例如,高速缓存存储器308或高速缓存存储器408)中,经编译表示包括基址和相对偏移(步骤704)。对于该操作,在一些实施例中,处理子系统以诸如图5所示的格式或布置将经编译表示存储到高速缓存存储器中。一般地,处理子系统将经编译表示存储到高速缓存存储器中以用于通过神经网络对输入数据实例的未来处理。在一些实施例中,与在高速缓存存储器中存储经编译表示一起或者作为其替代,处理子系统将经编译表示存储在非易失性存储器中或者(例如,经由通信网络等)将经编译表示传送到另一电子装置以用于由此存储。在这些实施例中,事先准备好经编译表示以供未来通过神经网络处理输入数据实例时使用-可能包括通过单独/不同电子装置中的处理子系统。

在所描述的实施例中,“静态地”生成经编译表示,且因此事先准备好经编译表示用于在GEMM运算期间确定存储器位置的地址。如本文所用,静态地意味着在当使用GEMM运算处理输入数据实例时之前的某个时间并且可能是在处理输入数据实例之前的相对较长的时间(例如,小时、天等)处生成经编译表示。例如,在通过神经网络处理数据本身之前,可以为输入矩阵生成经编译表示作为数据准备步骤的一部分。换句话说,可以单独地生成并存储静态地生成的经编译表示(例如,存储在本地高速缓存存储器中、在存储器中等)以为随后通过神经网络处理输入数据实例做准备。可以将经编译表示的静态生成与动态或实时计算输入矩阵A和/或B中的元素的存储器地址形成对比。

在所描述的实施例中,经编译表示被配置成使得例如在内核(或程序代码的其他布置)中用于执行GEMM运算的程序代码对于输入矩阵中的数据的维数和/或格式是通用的。因此,内核仅需要执行本文描述的简单地址计算(例如,基址加相对偏移)用于使用经编译表示。通过使用具有经编译表示的通用内核,可以使用输入矩阵的许多维数和/或格式而无需多个内核和/或内核中的程序代码来处理输入矩阵的不同维数和/或格式。在一些实施例中,可以开发使用经编译表示的单个内核。在这些实施例中的一些中,如本文所述的用于静态地生成经编译表示的程序代码处理输入矩阵的各种维数和/或格式。

尽管如图9至图10所呈现的基址和相对偏移的特定计算被描述为示例,但是在一些实施例中,使用了不同的计算。例如,使用不同的计算针对不同维数和/或格式的输入数据、针对不同类型的神经网络等生成基址和/或相对偏移。一般地,在所描述的实施例中,当生成输入矩阵的经编译表示时,计算具有本文描述的性质的基址和相对偏移。

使用经编译表示的过程

在所描述的实施例中,当通过神经网络处理输入数据实例时,处理子系统使用经编译表示从输入矩阵获取将用于GEMM运算的数据。图11呈现了示出根据一些实施例的用于使用经编译表示的过程的流程图。注意,图11所示的操作被呈现为由一些实施例执行的操作的一般示例。由其他实施例执行的操作包括不同的操作、以不同的顺序执行的操作和/或由不同的实体或功能块执行的操作。例如,使用具有特征处理元件、过滤器等的卷积神经网络来描述图11,但是可以对其他类型的神经网络(诸如完全连接的神经网络等)执行适当调整的操作。

对于图11中的操作,假设经编译表示被存储在用于处理子系统的本地高速缓存存储器(例如,高速缓存存储器308或高速缓存存储器408)中并且因此可用于定位输入矩阵A的元素用于GEMM运算。换句话说,在一些实施例中,经编译表示先前是使用图7中描述的过程静态地生成的,并存储在高速缓存存储器中(在图11中使用之前可能有相对长的时间)。此外,假设输入矩阵A和B都存储在存储器(例如,存储器304)中。输入矩阵A和B每个具有多个元素(例如,元素600),其中存储了将用于通过神经网络处理输入数据实例的数据。例如,输入矩阵A中的元素可以存储数据,诸如图像中的像素或像素区域的值,以便在对图像进行分类的神经网络中进行处理,以及输入矩阵B中的元素可以存储过滤器值或权重。输入矩阵A和B中每个的数据以两个以上的维数进行组织,诸如以众所周知的四维NCHW(其中,N=批次,C=通道,H=高度,W=宽度)或CNHW格式、五维NCHWVector格式等等进行组织。

图8呈现了根据一些实施例的描述在用于描述图11和图12中的操作的表达式中使用的因子或值的关键字。图8中示出的因子和值被用于具有特征处理元件的神经网络诸如卷积神经网络,但是针对图8和图11至图12描述的原理对于其他类型的神经网络的经编译表示的生成是相似的。

当处理子系统从存储在本地高速缓存中的输入矩阵A的经编译表示中获取活动线程的基址时,图11中的操作开始(步骤1100)。对于该操作,处理子系统从本地高速缓存中的经编译表示中读取线程集的基址列表(例如,基址502),以获取活动线程的相应基址。在一些实施例中,当活动线程变得活动时(即,用于处理来自输入矩阵A中的元素的值),处理子系统执行该操作,然后保持活动线程的基址(例如,在寄存器或存储器元件中)。图12呈现了根据一些实施例的使用经编译表示的伪代码示例。图12中伪代码的前几行说明了活动线程的基址的获取。注意,尽管图12被呈现为示例,但是在一些实施例中,执行不同的操作和/或不同的操作顺序以使用经编译表示。

当元素有待由活动线程处理时(步骤1102),处理子系统从经编译表示中获取下一个相对偏移(步骤1104)。对于该操作,处理子系统从顺序存储在经编译表示中的相对偏移集中前进到下一个相对偏移并读取下一个相对偏移。例如,处理子系统可以递增用于确定将使用哪个相对偏移的计数器,然后获取相关联的相对偏移(或反之亦然)。以这种方式,处理子系统一次一个地处理经编译表示中的相对偏移,从而获取每个可用的相对偏移用于处理来自输入矩阵A的对应值。在图12中示出相对偏移的获取,其中URO被设置为等于RELO(相对偏移)矩阵或向量的第K个元素(注意,在一些实施例中,相对偏移被存储在矩阵或向量的元素中)。

注意,尽管针对图11仅描述了一个线程,但是在一些实施例中,处理子系统针对所有线程以相同的方式使用相对偏移。因此,使用给定线程的基址和相对偏移矩阵、向量等中的相对偏移中的对应相对偏移计算将由给定线程处理的输入矩阵A中的每个元素的位置。如在图12中可看到,在一些实施例中,将由给定线程处理的输入矩阵A中的每个元素的位置被计算为从给定线程的基址的原始值开始并加上每个相对偏移(URO)以增加基址的当前值的运行总和,如本文所述。

然后,处理子系统将活动线程的基址增加下一个相对偏移(步骤1106)。在该操作期间,处理子系统基于下一个相对偏移将用于检索数据的基址推进到存储器中的下一个位置,且从而推进到输入矩阵A中的下一个元素。例如,如果基址的先前值是PV且相对偏移是RO,例如15个元素、100字节等,则基址PV增加RO,即计算PV+RO。基址的增加在图12中显示为AVO增加URO。

然后,处理子系统从活动线程的基址所指示的存储器中的位置从输入矩阵A的元素读取第一值(步骤1108)。在该操作期间,处理子系统使用活动线程的基址(或使用活动线程的基址确定的另一个值)执行存储器读取操作,这使得存储器返回来自由活动线程的基址指示的输入矩阵A的元素的值。图12示出该操作为A=SCALAR_BASE_A[AVO]。处理子系统也从存储器中与输入矩阵A中的元素相关联的位置处的输入矩阵B的元素中读取第二值(步骤1110)。在该操作期间,处理子系统使用基于用于从输入矩阵A获取值的下一个相对偏移的输入矩阵B内的偏移来执行存储器读取。例如,如果处理子系统正使用第13个相对偏移,则输入矩阵B内的输入是13。这在图12中示出为B=SCALAR_BASE_B[K](回顾相对偏移的第K个元素是为了从输入矩阵A获取数据而读取的)。

然后,活动线程将第一值和第二值用作GEMM运算的输入(步骤1112)。对于此操作,在底层处理器硬件(例如,流水线、流处理器等)上执行的活动线程执行GEMM运算的相应部分。对于图12中的示例,GEMM运算被示为融合乘法累加(fused multiply accumulate,FMA)运算,C+=A*B。然后,活动线程将GEMM运算的结果存储在输出矩阵C中(步骤1114)。GEMM运算的结果的存储示出在图12的最终如果语句中,它包括C[OUTPUT_IDX]=C。

然后,处理子系统返回到步骤1102以确定元素是否有待处理。如果没有剩余的元素要处理,则过程结束。否则,如果还有剩余的元素要处理,则处理子系统继续到步骤1104。

图13呈现了根据一些实施例的使用经编译表示的示例。对于图13中的示例,处理子系统上的四个线程中的每个用于计算单独的输出,输出中的每个都是来自输入矩阵A(A0、A1等)的元素集中的元素的值与输入矩阵B中的值的卷积。如在图13中可看到,假设因子和值(针对图8所述)具有相应的值,例如WS=4、HS=4等等。关于经编译表示中的值,四个线程的基址(START_ADDR_A[])是0、1、4和5,且相对偏移(RELO)是0、1、2、4等。此外,假设输入矩阵A(A[HS][WS])中的元素存储值1、3、2、7等并且假设输入矩阵B(B[R][S])中的元素存储值00、01、02等。图14呈现了根据一些实施例的输入矩阵A的元素集(或块)的示例。如在图14中可看到,每个线程处理来自输入矩阵A的不同元素集,其中每个元素集在输入矩阵A中从该线程的相应起始地址(或者更一般地,位置)开始,并且位于来自相对偏移的对应偏移处。在由图13中的线程0(即,活动线程)进行的第一计算集中,计算FMA,其中来自输入矩阵A的值(例如,A0[RELO[0]、A0[RELO[1]等)乘以来自输入矩阵B的对应值(例如,B[0][0]、B[0][1]等)并且将乘积之和写入到/存储在C[0][0]中,即输出矩阵C中的位置。在针对线程1-3的其余三个计算集中,计算FMA,其中来自输入矩阵A的相应值乘以来自输入矩阵B的对应值并且将乘积之和写入到/存储在输出矩阵C中的位置。

注意,图13至图14中所示的操作和值被呈现为一些实施例所执行的操作和所使用的值的示例。由其他实施例执行的操作包括不同的操作、以不同的顺序执行的操作和/或由不同的实体或功能块执行的操作。例如,使用具有特征处理元件、过滤器等的卷积神经网络来描述图13至图14,但是可以对其他类型的神经网络(诸如完全连接的神经网络等)执行适当调整的操作。

经编译表示的替代生成

如上所述,提供图7至图14中的示例是为了说明在一些实施例中经编译表示的生成和使用。然而,在一些其他实施例中,不同的操作、值等被用于生成和/或使用经编译表示。图15呈现了根据一些实施例的生成经编译表示的伪代码示例。注意,图15中所示的操作被呈现为由一些实施例执行的操作的一般示例。由其他实施例执行的操作包括不同的操作、以不同的顺序执行的操作和/或由不同的实体或功能块执行的操作。例如,使用具有特征处理元件、过滤器等的卷积神经网络来描述图15,但是可以对其他类型的神经网络(诸如完全连接的神经网络等)执行适当调整的操作。

对于图15中的示例,在该图的左上角示出了在经编译表示的生成中使用的因子和值。如可看到,N-批次大小、C-输入通道等。因子和值虽然与图8中所示的因子和值有一些相似性,但是在图15中被分开且不同地定义和使用。如在图15中可看到,经编译表示的基址被计算为M_BASE=N*C*H*W+H*W+W,其中如所示计算因子N、H和W本身。此外,相对偏移被计算为K_MEMORY_OFFSET=C*H*W+S*W+R。如图15中所示,基址和相对偏移一起用于确定存储器中数据位于输入矩阵A中的地址作为全局地址M=M_BASE+K存储器偏移。也应注意,使用输入矩阵B的基址N_BASE和对应的存储器偏移来访问输入矩阵B的元素。

在一些实施例中,至少一个电子装置(例如,电子装置300)使用存储在非暂时性计算机可读存储介质上的代码和/或数据来执行本文所述的操作中的一些或全部。更具体地,当执行所描述的操作时,至少一个电子装置从计算机可读存储介质读取代码和/或数据并且执行代码和/或使用数据。计算机可读存储介质可以是存储代码和/或数据以供电子装置使用的任何装置、介质或其组合。例如,计算机可读存储介质可以包括但不限于易失性和/或非易失性存储器,包括快闪存储器、随机存取存储器(例如,eDRAM、RAM、SRAM、DRAM、DDR4SDRAM等)、非易失性RAM(例如相变存储器、铁电随机存取存储器、自旋转移转矩随机存取存储器、磁阻随机存取存储器等)、只读存储器(ROM)和/或磁性或光学存储介质(例如磁盘驱动器、磁带、CD、DVD等)。

在一些实施例中,一个或多个硬件模块执行本文所述的操作。例如,硬件模块可以包括但不限于一个或多个中央处理单元(CPU)/CPU核、图形处理单元(GPU)/GPU核、专用集成电路(ASIC)芯片、现场可编程门阵列(FPGA)、压缩器或编码器、计算单元、嵌入式处理器、加速处理单元(APU)、控制器、神经网络处理器和/或其他功能块。当激活这种硬件模块中的电路(例如,集成电路元件、分立电路元件等)时,电路执行操作中的一些或全部。在一些实施例中,硬件模块包括通用电路诸如执行流水线、计算或处理单元等,其在执行指令(程序代码、固件等)时执行操作。在一些实施例中,硬件模块包括执行操作的专用或专用电路,可能包括在“硬件中”执行操作中的一些或全部且不执行指令的电路。

在一些实施例中,表示本文描述的功能块和电路元件(例如,电子装置300或其某部分)中的一些或所有的数据结构被存储在包括数据库或其他数据结构的非暂时性计算机可读存储介质上,其可以被电子装置读取并直接或间接地用于制造包括功能块和电路元件的硬件。例如,数据结构可以是用诸如Verilog或VHDL的高级设计语言(HDL)对硬件功能的行为级描述或寄存器传输级(RTL)描述。该描述可以由综合工具读取,该综合工具可以综合该描述以产生网表,该网表包括来自综合库中的晶体管/电路元件的列表,该列表表示包括上述功能块和电路元件的硬件的功能。然后,可以放置网表并路由该网表以产生描述要应用于掩模的几何形状的数据集。然后,可以在各种半导体制造步骤中使用掩模以产生与上述功能块和电路元件相对应的一个或多个半导体电路(例如,集成电路)。或者,计算机可访问存储介质上的数据库可以是所需的网表(有或没有综合库)或数据集,或者是图形数据系统(GDS)II数据。

在本描述中,变量或未指定值(即没有特定值实例的值的一般描述)由诸如N、M和X的字母表示。如本文所使用的,尽管在本描述中可能在不同位置使用类似的字母,但是在每种情况下变量和未指定值不一定相同,即,可能有不同的变量的量和值旨在用于一般变量和未指定值中的一些或所有。换句话说,在本描述中,用于表示变量和未指定值的N和任何其他字母的特定实例不一定彼此相关。

如本文所使用的表达“等等(et cetera)”或“等等(etc.)”意在呈现一者和/或情况,即,列表中与等等相关联的元素中的“至少一个”的等同物。例如,在语句“电子装置执行第一操作、第二操作等等”中,电子装置执行第一操作、第二操作和其他操作中的至少一个。此外,与等等相关联的列表中的元素仅仅是示例集中的示例-且示例中的至少一些可能不会出现在一些实施例中。

仅出于说明和描述的目的呈现了实施例的前述描述。它们并不旨在穷举或将实施例限制为所公开的形式。因此,许多修改和变化对于本领域技术人员将是明显的。此外,上述公开并非旨在限制实施例。实施例的范围由所附权利要求限定。

31页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:获取神经网络模型的方法、图像处理方法及装置

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!