使用SIMD指令进行高效的直接卷积的制作方法

文档序号:20921593发布日期:2020-05-29 14:13阅读:499来源:国知局
使用SIMD指令进行高效的直接卷积的制作方法

本公开一般而言涉及数字信号处理、机器学习和神经网络,并且更特别地涉及用于使用卷积运算对信号进行滤波的系统和方法。



背景技术:

在数字信号处理中,卷积是数据集中输入值及其紧邻值的加权和,产生输出数据集的输出值。这些数据集可以是一维或多维的,其中对应的数据组织确定作为输入值的紧邻邻居的值。卷积的加权值是在卷积内核中指定的,其中内核处理与输入和输出数据集相同数量的维度。卷积运算在大量各种信号处理应用中是有用的,并且是深度神经网络许多方面的运算不可或缺的一部分。

卷积可以在机器学习应用中广泛使用。在这种上下文中,通常使用许多小的卷积内核将卷积应用于单个数据集。因此,卷积通常是机器学习应用的计算密集部分,因此以高效的手段执行卷积运算具有越来越大的价值。

提高卷积效率的一种流行方法是降低卷积,将卷积运算转换成等效的计算过程,该过程可以通过优化的密集线性代数来解决。这允许使用优化的通用矩阵乘法(gemm)例程,这些例程善于利用数据的固有重用、最小化片外带宽需求以及细分可以跨许多核心分布的计算。这种方法也有显著的缺点,降低卷积会增加额外的处理器开销,并显著增加数据大小。数据大小的增加使高速缓存变得困难,并增加了片外带宽的使用量,从而导致解决方案倾向于使用昂贵的高性能存储器来代替高速缓存和常规的存储器技术。

第二种方法是在频域中执行卷积。这要求将输入数据集和卷积内核分别转换到频域,将两个转换后的数据集一起相乘,并将逆频率变换应用于乘积。这种方法具有降低卷积的类似优点和缺点,乘法运算可以再次由gemm例程实现,但是增加了计算开销,并且对于小的内核大小,存储器占用量可能急剧增加。在使用许多小内核的机器学习应用中,由于需要将许多小内核转换到频域,因此频域中的卷积不受欢迎。

第三种方法,通常称为“直接卷积”,将卷积滤波器直接应用于时域或空间域中的数据。这种方法避免了前述方法的额外计算开销和存储器增长,但处理器利用率低得多、并行性和重用率降低,或者硬件仅专用于解决卷积问题。典型地,此类硬件没有利用常规硬件的现有资源,并且对于给定的深度神经网络进行编程和优化并非易事。



技术实现要素:

描述了用于使用提供向量指令的中央处理单元(cpu)来提供高效的直接卷积运算的方法和系统。高效的直接卷积运算在机器学习和深度神经网络应用中是有用的,在这些应用中,卷积运算可能需要大量的存储器带宽和计算资源。这些卷积应用的特征通常是使用较小的卷积内核大小,否则直接卷积方法将受到存储器带宽的限制。通过使用本文公开的方法在主cpu上实现直接卷积,系统可以避免对专用硬件加速器或通用gpu(gpgpu)解决方案的需求,从而在这些应用中实现更好的性能伸缩,同时在通常用于机器学习应用的较小内核大小中充分利用计算资源以及高速缓存和存储器带宽。

为了增加硬件中的数据级并行度,处理器可以包括向量指令,其在诸如单指令多数据(simd)微体系架构中为每个执行的指令提供并行执行通道。这种类型的微体系架构可以为某些应用提供比单通道或通用微体系架构更高的吞吐量。虽然通用微体系架构对寄存器中包含的数据的单个通道进行操作,但是simd微体系架构对包含在由多个独立数据通道组成的向量中的数据进行操作。

在一些实施例中,加载多个simd源向量,一个源向量与要计算的目的地向量对齐,一个或多个源向量包括相对于目的地向量的左半部分数据,并且一个或多个源向量包括相对于目的地向量的右半部分数据。这些源向量中的每一个都与各自的卷积系数向量相乘,然后加到累加器向量中。一旦所有源向量已被处理,累加器向量就被写入到目的地向量。

在一些实施例中,要执行的卷积可以是多维卷积。在这些实施例中,可以使用相同的加载源向量来同时计算多个累加器向量。可以将各种源向量乘以与卷积内核的其它维度对应的其它卷积系数向量,并且直到已经处理给定目的地向量的所有源向量之后,才可以写入这多个累加器向量。

在一些实施例中,可以提供simd指令以从对齐的simd向量对中提取未对齐的simd向量。在这些实施例中,可以从公共数据源加载对齐的源向量以及多个移位的源向量。

在一些实施例中,可以提供simd指令以执行simd标量乘加运算,其中数据向量的每个通道被乘以标量,并且与基向量的相应通道相加。

在一些实施例中,可以通过使用预交织的源数据计算部分解析输出数据集来同时对多个输入数据集执行卷积运算。在这些实施例中,可以提供simd指令以对计算出的数据向量执行去交织操作以提取部分解析输出数据向量。

所公开的各种实施例将直接卷积的计算从传统上受存储器带宽限制的运算转换成在仅需要主cpu的充分利用高速缓存和存储器子系统的计算资源和带宽的运算,并且这些实施例特别适合于直接卷积计算。应当注意的是,它们可以更一般地应用于各种计算任务,例如,应用于一般的并行遍历技术。

附图说明

图1是计算机系统的一个实施例的框图。

图2a是图示具有三元素卷积内核的数据元素的一维卷积的框图。

图2b是图示具有3x3元素卷积内核的数据元素的二维卷积的框图。

图3是图示根据至少一些实施例的支持与三元素卷积内核一起使用的源向量的对齐加载的向左和向右移位的数据流的框图。

图4图示了根据至少一些实施例的使用对齐的、向左移位和向右移位的源向量以及各自的内核向量来计算三元素一维卷积的输出向量。

图5是图示用于计算数据集的一系列输出向量的方法的一个实施例的流程图,该数据集包括输入数据集的三元素一维卷积。

图6a图示了根据至少一些实施例的提取(extract)向量指令,该提取向量指令生成包括两个源向量的级联的子集的数据向量。

图6b图示了根据至少一些实施例使用图6a的提取向量指令,以使用一组对齐的、顺序的源输入向量来加载用于卷积运算的一组源向量。

图7是图示用于计算包括输入数据集的三元素一维卷积的数据集的一系列输出向量并使用图6a的提取向量指令的方法的一个实施例的流程图。

图8图示了标量乘加向量指令,该指令得出标量值、按该标量值对向量的每个数据通道进行缩放以产生经缩放的向量,并将经缩放的向量与基向量相加以生成输出向量。

图9是图示用于计算包括输入数据集的三元素一维卷积的数据集的一系列输出向量并使用图8的标量乘加向量指令的方法的一个实施例的流程图。

图10图示了根据至少一些实施例的使用对齐的、向左移位和向右移位的源向量以及各自的内核向量对3x3元素的二维卷积的多个输出向量进行部分计算。

图11是图示用于计算包括输入数据集的3x3元素的二维卷积的数据集的输出向量的列并且使用图8的标量乘加向量指令和图6a的提取向量指令的方法的一个实施例的流程图。

图12a图示了混洗(shuffle)向量指令的一个实施例,该指令生成包括多个交织源向量的级联的混洗数据通道的数据向量,该多个交织源向量包括步幅(stride)因子和起始源通道。

图12b图示了混洗向量指令的一个实施例,该混洗向量指令从包括步幅因子、起始源通道和起始输出通道的交织源向量生成包括去交织(del-interlaced)数据通道的数据向量。

图13图示了根据至少一些实施例的使用图6a的提取向量指令和图12a的混洗向量指令为步幅值为2并且使用一组对齐的顺序源输入向量的卷积运算加载一组源向量。

虽然本文通过示例的方式描述了几个实施例和说明性附图,但是本领域技术人员将认识到,本公开不限于所描述的实施例或附图。应该理解的是,本文的附图和详细描述并非旨在将本公开限制为所公开的特定形式,而是相反,本公开将覆盖落入由所附权利要求定义的精神和范围内的所有修改、等同形式和替代形式。本文使用的任何标题仅用于组织目的,并不意味着限制说明书或权利要求的范围。如本文所使用的,词语“可以”以允许的意义(即,意味着有可能)而不是强制性的意义(即,意味着必须)使用。类似地,词语“包括”意味着包括但不限于。

各种单元、电路或其它部件可以被描述为“被配置为”执行一个或多个任务。在这种上下文中,“被配置为”是对结构的广泛叙述,通常是指“具有”在操作期间执行一个或多个任务的“电路系统”。由此,即使单元/电路/部件当前未开启,单元/电路/部件也可以被配置为执行任务。一般而言,形成与“被配置为”对应的结构的电路系统可以包括硬件电路。类似地,为了便于描述,各种单元/电路/部件可以被描述为执行一个或多个任务。这样的描述应该被解释为包括短语“被配置为”。叙述被配置为执行一个或多个任务的单元/电路/部件明确不旨在援引35u.s.c.§112(f)对该单元/电路/部件的解释。

本说明书包括对“一个实施例”或“实施例”的引用。短语“在一个实施例中”或“在实施例中”的出现不一定指相同的实施例,但是通常设想包括特征的任何组合的实施例,除非本文明确地声明。可以按照与本公开一致的任何合适方式来组合特定特征、结构或特性。

具体实施方式

深度神经网络在解决与大型数据集相关的各种通用问题方面已变得越来越重要。但是,这些网络在卷积和矩阵乘法中花费了大量的处理时间,在训练阶段,每遍(pass)的处理时间要增加一倍以上,才能更新神经元权重。为了缓慢收敛网络,可能还需要许多遍。因此,高效的卷积计算变得越来越重要。

描述了用于使用提供向量指令的中央处理单元(cpu)来提供高效的直接卷积运算的方法和系统。高效的直接卷积运算在深度神经网络应用以及卷积运算可能需要大量计算资源的其它应用中很有用。通过在主cpu上实现卷积,系统可以避免需要专用硬件加速器或通用gpu(gpgpu)解决方案,从而在卷积神经网络应用中实现更好的性能扩展。

图1提供了计算机系统的一个实施例的框图。计算机系统100包括处理器110、存储器120和附接到io总线130的大容量存储设备140。处理器110包括耦合到高速缓存116的执行核心112,其包括寄存器文件114。注意的是,虽然在计算机系统100中示出并描述了特定的部件,但是在替代实施例中,可以存在不同的部件和部件的数量。例如,计算机系统100可以不包括大容量存储设备140,而可以包括类似于处理器110的多个处理器。此外,虽然在处理器110内部示出了单个高速缓存116,但是可以存在包括处理器110内部和外部的多个级别的分层高速缓存。计算机系统100还可以包括图形处理器、用户界面设备、网卡和/或使用io总线130、网络或其它通信信道耦合到处理器110的其它外围设备。

在各种实施例中,处理器110可以代表执行计算操作的通用处理器。例如,处理器110可以是中央处理器(cpu),诸如微处理器、微控制器、专用集成电路(asic)或现场可编程门阵列(fpga)。处理器110可以是独立部件,或者可以与其它部件(例如,其它处理器或片上系统(soc)或fpga中的其它部件)集成,或者可以是多芯片模块(mcm)中与其它部件一起的部件。处理器110可以包括一种或多种用于向量处理的机制(例如,向量执行单元)。

如图1所示,处理器110可以包括执行核心112。执行核心112可以被配置为执行在由处理器110实现的指令集体系架构中定义的指令。根据需要,执行核心112可以具有各种微体系架构特征和实现方式特征。例如,执行核心112可以包括超标量或标量实现方式。执行核心112可以包括有序或无序实现方式,以及推测性或非推测性实现方式。执行核心112可以包括以上特征的任何组合。在一些实施例中,实现方式可以包括微代码。执行核心112还可以包括各种执行单元,每个执行单元被配置为执行各种类型的操作(例如,整数、浮点、向量、多媒体、加载/存储等)。执行核心112可以包括不同数量的流水线级和各种其它性能增强特征,诸如分支预测。执行核心112可以包括指令解码单元、调度器或预留站、重排序缓冲区、存储器管理单元、i/o接口等中的一个或多个。

寄存器文件114可以包括可以用于存储各种指令的操作数的一组寄存器。基于执行核心112被配置为存储在寄存器中的操作数的类型(例如,整数、浮点数、多媒体、向量等),寄存器文件114可以包括各种数据类型的寄存器。寄存器文件114可以包括体系架构的寄存器(即,在由处理器110实现的指令集体系架构中指定的那些寄存器)。替代地或附加地,寄存器文件114可以包括物理寄存器(例如,如果在执行核心112中实现寄存器重命名)。

高速缓存116可以例示任何高速缓存结构。例如,高速缓存116可以被实现为哈佛体系架构(单独的用于指令获取的指令高速缓存和用于通过用于存储器引用操作的执行单元进行数据读/写的数据高速缓存)、共享指令和数据高速缓存等。在实施例中,可以提供加载/存储执行单元来执行存储器引用操作。

指令可以是在由处理器110实现的指令集体系架构中定义的可执行实体。存在多种指令集体系架构(例如,intel最初开发的x86体系架构、armholdings公司的arm、来自ibm/motorola的power和powerpc等)。每条指令都在指令集体系架构中定义,包括其在存储器中的编码、其操作以及其对寄存器、存储器位置和/或其它处理器状态的影响。指令集体系架构的给定实现可以直接执行每条指令,但是其形式可以通过处理器硬件中的解码和其它操纵来更改。另一个实现方式可以将至少一些指令解码为多条指令操作,以由处理器110中的执行单元执行。在一些实施例中,一些指令可以被微编码。

大容量存储设备110、存储器120和高速缓存116是共同形成存储用于处理器110的数据和指令的存储器层次结构的存储设备。更特别地,大容量存储设备110可以是高容量的非易失性存储器,诸如盘驱动器或具有长访问时间的大型闪存单元,而高速缓存116和存储器120可以更小,但访问时间更短。这些更快的半导体存储器存储频繁使用的数据的副本。存储器120可以代表存储器设备的动态随机存取存储器(dram)系列中的存储器设备。存储器120的大小通常大于高速缓存116,而高速缓存116通常使用静态随机存取存储器(sram)系列的设备中的较小设备来实现。在一些实施例中,在计算机系统100中的一个或多个处理器之间共享高速缓存116、存储器120和大容量存储设备110。

注意的是,数据和指令可以存储在非暂态计算机可读存储设备上,该设备可以是可以存储代码和/或数据以供计算机系统(例如,计算机系统100)使用的任何设备或存储介质。一般而言,非暂态计算机可读存储设备包括但不限于易失性存储器、非易失性存储器、磁和光存储设备,诸如盘驱动器、磁带、光碟(cd)、数字通用碟或数字视频碟(dvd)、或现在已知或以后开发的能够存储计算机可读介质的其它介质。由此,大容量存储设备110、存储器120和高速缓存116都是非临时性计算机可读存储介质的示例。

如上所述,执行核心112可以被配置为执行向量指令。向量指令在传统意义上可以被定义为单指令多数据(simd)指令,因为它们可以定义要在多个数据元素上并行执行的相同操作。由指令的实例操作的数据元素可以被称为向量,并组织在数据通道中。这些数据元素可以包含基于执行内核112被配置为存储在寄存器中的操作数的类型(例如,整数、浮点数、多媒体、向量等)的各种多位数据类型的数据。为了简单起见,本公开中的向量被表示为包括八个数据通道,但是应该理解的是,这并不旨在将本公开限制于该特定载体组织。相反,本领域技术人员将认识到,可以配置向量以提供任意数量的数据通道。在一些实施例中,向量寄存器文件中可以有32个向量寄存器,并且每个向量寄存器可以包括128位。但是,在替代实施例中,可以存在不同数量的向量寄存器和/或每个寄存器不同的位数量。一般而言,向量长度可以被实现为二的幂(例如,二、四、八等)。但是,在一些实施例中,向量长度不必是二的幂。此外,实现寄存器重命名的实施例可以包括可以分配给体系架构向量寄存器的任意数量的物理寄存器。体系架构寄存器可以是在向量指令中可指定为操作数的寄存器。

在数字信号处理中,卷积是数据集中输入值及其紧邻值的加权和,产生输出数据集的输出值。这些数据集可以是一维或多维的,其中对应的数据组织确定作为输入值的紧邻邻居的值。卷积的加权值是在卷积内核中指定的,其中卷积拥有与输入和输出数据集相同数量的维度。

图2a描绘了一维卷积运算225。在图2a中,源数据200的数据元素s2将与三元素卷积内核210进行卷积以在输出数据220中产生数据元素o2。另外,卷积需要源数据200的数据元素s1和s3作为数据元素s2的直接左邻居和右邻居。输出数据是具有卷积内核210的各个加权因子k1-k3的源数据元素的加权和,换句话说,o2=k1*s1+k2*s2+k3*s3。

图2b描绘了二维卷积运算275。在图2b中,源数据250的数据元素s5将与3x3元素的卷积内核260进行卷积,以在输出数据270中产生数据元素o5。另外,卷积需要源数据250的数据元素s1-s4和s6-s9作为数据元素s2的左、右、上和下的紧邻邻居。输出数据是具有卷积内核260的各个加权因子k1-k9的源数据元素的加权和,换句话说,

o5=k1*s1+k2*s2+k3*s3+k4*s4+k5*s5+k6*s6+k7*s7+k8*s8+k9*s9。

应该理解的是,一维和二维卷积的示例并不旨在将本公开限制于这些特定的卷积组织。相反,本领域技术人员将认识到,可以以任何数量的维度执行卷积。此外,示例并非旨在将卷积限制为每个维度三个元素,并且本领域技术人员将认识到,可以在每个维度上用其它数量的元素执行卷积。

图3图示了根据一些实施例的预移位源数据集的方法。除了对齐数据300之外,图3还示出了对应于其中向量对齐已经向左移位一个数据通道的数据集的左移位数据310和对应于其中向量对齐已经向右移位一个数据通道的数据集的右移位数据320。三个数据集300、310和320对应于使用由三列组成的卷积内核的卷积运算。这样的卷积可以是一维卷积或多维卷积。此外,应该理解的是,数据集的预移位不限于三列的卷积。本领域技术人员将认识到,可以支持任何数量的列,例如,五列卷积可以具有总共五个源数据集,即,图3中示出的300、310和320,以及左双移位的数据集和双右移位的数据集。

图4图示了在给定预移位源向量的情况下使用一维三元素卷积内核对卷积输出向量的计算。在一些实施例中,可以从诸如图3中所示的预移位数据集加载预移位源向量,但是在其它实施例中,也可以使用各种其它方法来加载预移位源向量。内核向量410a、410b和410c是图2a的卷积内核210的向量表示。每个内核向量都由复制到内核向量的所有数据通道中的相应的卷积内核加权值组成。例如,内核向量410b对应于卷积内核210的中间加权值,并且因此具有复制到其所有数据通道中的加权值k2。因此,输出向量420是源向量400乘以它们各自的内核向量410的总和。图4所示的卷积计算不限于执行仅涉及三个内核列的卷积,而是可以扩展为实现任何数量的内核列。

图5是演示根据一些实施例的多个数据向量的一维三元素卷积的流程图。该方法从步骤502开始,该步骤初始化对应于图4的内核向量410的三个内核向量vkleft、vkcenter和vkright。由于这些向量在卷积运算期间保持不变,因此它们只能被加载一次。

该方法进行到步骤504,该步骤加载与图4中的向量400对应的对齐和移位的源向量vleft、vcenter和vright。在一些实施例中,vleft、vcenter和vright可以从诸如图3中所示的预移位数据集加载,而在其它实施例中,它们可以通过其它手段加载。

然后,该方法进行到步骤506,该步骤执行添加到向量累加器vacc的三个加权和。每个加权值是使用许多simd体系架构通用的乘加向量指令计算的,但是在一些实施例中,它可以使用算术向量指令的组合来实现。在步骤506中,乘加向量指令由madd运算表示,该运算采用三个操作数:第一操作数是基向量,第二操作数是源向量,并且第三操作数是内核向量。madd运算将第二和第三操作数相乘,然后将乘积与第一操作数相加,并返回结果向量。在第一madd运算中,指定的基向量vzero对应于在所有数据通道中包含0值的向量,并且对于许多simd体系架构都是通用的。以这种方式使用vzero提供了初始化向量累加器vacc的高效手段,但是在一些替代实施例中,对于不提供等效vzero向量的simd体系架构,向量累加器vacc可以首先通过替代手段进行初始化。在剩余的两个madd运算中,指定的基向量是累加器vacc。vleft、vcenter和vright这三个源向量分别与它们各自的内核向量vkleft、vkcenter和vkright相乘,然后添加到累加器vacc中。

一旦madd运算完成,该方法就进行到步骤508,其中将累加器向量写入到目的地地址。在步骤510中检查剩余向量的数量,并且该过程在步骤504处继续,直到已经生成所有向量。

虽然图5中公开的实施例利用三元素内核执行一维卷积,但是应该理解的是,该实施例不旨在限于三个元素,而是可以包括各种内核宽度。虽然图5的实施例实现了加权和的高效计算,但它依赖于预移位的源数据,诸如图3中所示的预移位的源数据,并且对于更宽的内核宽度,使用这些预移位的数据集导致对存储器和片外带宽的更大需求。由于这个原因,在图6a中公开了用于导出移位的源数据的向量指令。当与图5的实施例结合使用时,使用该向量指令最大程度地减少了片外带宽需求,尤其是在内核宽度较宽的情况下。

在一些实施例中,提取向量指令可以用于使用一对对齐的源向量来生成卷积计算所需的移位数据向量。提取向量指令的使用允许使用原来提供用于卷积运算的源数据,从而使得能够高效使用存储器和高速缓存带宽。图6a图示了这样的提取向量指令620的示例。在图6a中,将两个连续的源向量600a和600b级联,并从由移位605指定的偏移数据通道开始提取所得双倍宽度向量的子集,以产生输出向量610。可选地,可以指定输出宽度615,其允许输出向量包含小于输出数据通道的完整向量宽度。在这种情况下,输出向量610的最右边的通道将包含零。在图6a中,示出了八个数据通道的向量宽度,其中移位605值为四,并且输出宽度615值为六。

使用提取向量指令,卷积运算的各种实施例可以仅使用三个对齐的源向量、中心对齐的向量以及中心对齐向量的紧邻左和紧邻右的对齐向量来加载用于各种内核宽度的移位的源向量。

图6b图示了针对诸如图4所示的一维三元素卷积的源向量的加载。加载三个对齐的源向量,即中心源向量625b、紧邻中心向量625a左侧的源向量和紧邻中心向量625c的右侧的源向量。使用左和中心源向量625a和625b以及图6a的提取向量指令620使用等于向量中数据通道的数量的偏移值(在该示例中为八)减一来执行左提取(extractleft)运算630。该运算产生左向量650。同样,使用中心和右源向量625b和625c以及图6a的提取向量指令620使用1的移位值来执行右提取(extractright)运算640。该运算产生右向量670。然后可以在诸如图5中所示的卷积中使用向量650、660和670的集合。本领域技术人员将认识到,图6b中所示的方法并不旨在限于三元素卷积运算,而是可以用于生成执行各种内核宽度的卷积所需的向量,通常无需加载除了图6b中所示的那些之外的其它源向量625。此外,提取向量指令620的使用消除了对诸如图3所示的预移位数据的需要,从而消除了卷积运算的数据大小的增长。

图7是演示根据一些实施例的使用图6b的提取方法的多个数据向量的一维三元素卷积的流程图。图7的卷积最大程度地减少了向量数据到主存储器的加载和存储的次数,并使用原始源数据而无需对向量数据进行预先计算。此外,加载和存储到主存储器的顺序可以实现系统高速缓存的高性能,从而实现了可以在计算需求与高速缓存和存储器带宽之间取得平衡的高性能的卷积实现方式。

该方法从步骤702开始,该步骤初始化对应于图4的内核向量410的三个内核向量vkleft、vkcenter和vkright。由于这些向量在卷积运算期间保持不变,因此它们可以仅加载一次。此外,初始化左对齐的源向量vsrcleft,并将第一源向量加载到vcenter中。

该方法进行到步骤704,该步骤加载右对齐的源向量vsrcright。由于已经加载了vsrcleft和vcenter,因此一旦加载了vsrcright,那么该方法就进行到步骤706,其中提取向量指令620用于产生左移位和右移位的向量vleft和vright,以进行卷积计算。在步骤706中,提取向量指令620由extract运算表示,其采用四个操作数:第一和第二操作数是源向量,第三操作数是移位值,并且第四操作数是输出宽度。步骤706产生左移位和右移位的源向量vleft和vright,当其与中心向量vcenter组合时,形成用于执行卷积的向量。

然后,该方法进行到步骤708,该步骤执行添加到向量累加器vacc的三个加权和。每个加权值是使用许多simd体系架构通用的乘加向量指令计算的,但是在一些实施例中,它可以使用算术向量指令的组合来实现。在步骤708中,乘加向量指令由madd运算表示,该运算采用三个操作数:第一操作数是基向量,第二操作数是源向量,并且第三操作数是内核向量。madd运算将第二和第三操作数相乘,然后将乘积与第一操作数相加,并返回结果向量。在第一madd运算中,指定的基向量vzero对应于在所有数据通道中包含0值的向量,并且对于许多simd体系架构都是通用的。以这种方式使用vzero提供了初始化向量累加器vacc的高效手段,但是在一些替代实施例中,对于不提供等效vzero向量的simd体系架构,向量累加器vacc可以首先通过替代手段进行初始化。在剩余的两个madd运算中,指定的基向量是累加器vacc。vleft、vcenter和vright这三个源向量分别与它们各自的内核向量vkleft、vkcenter和vkright相乘,然后添加到累加器vacc中。

一旦madd运算完成,该方法就进行到步骤710,其中将累加器向量写入到目的地地址。在步骤712中,将vcenter和vsrcright向量分别移位以变为vsrcleft和vcenter向量,然后在步骤714中检查剩余向量的数量,并且该过程步骤704处继续,直到已经生成所有向量。

在一些实施例中,可以使用标量乘加向量指令。在传统的乘加向量指令中,两个向量相乘并将乘积加到第三向量以产生输出向量。在图8所示的本公开的标量乘加向量指令860中,源向量800的每个通道都乘以由内核向量810的通道820指定的标量,以形成经缩放的向量830,该向量与基向量840相加以产生输出向量850。使用该向量指令可使卷积内核的加权系数紧凑地存储在向量的各个通道中,而不是对每个加权系数使用向量。这减少了寄存器文件114的使用以及片外带宽需求。

图9是根据一些实施例的使用图8的标量乘加向量指令860来演示多个数据向量的一维三元素卷积的流程图。该方法从步骤902开始,该步骤使用向量的各个通道中的加权系数来初始化单个内核向量vkernel。由于该向量在卷积运算期间保持不变,因此它可以仅加载一次。

该方法进行到步骤904,该步骤加载与图4中的向量400对应的对齐和移位的源向量vleft、vcenter和vright。在一些实施例中,可以从诸如图3中所示的预移位数据集加载vleft、vcenter和vright,而在其它实施例中,可以通过诸如使用如图6a和图6b中所示的方法和提取向量指令620加载它们。

然后,该方法进行到步骤906,该步骤执行向量累加器vacc的三个加权和。使用图8的标量乘加向量指令860来计算每个加权值。在步骤906中,标量乘加向量指令860由scalar_madd运算表示,该运算采用四个操作数:第一操作数是基向量,第二操作数是源向量,第三操作数是内核向量,并且第四操作数是包含缩放系数的内核向量的通道。scalar_madd运算将第二操作数的每个通道乘以由第三和第四操作数指定的通道,然后将乘积加到第一操作数,并返回结果向量。在第一scalar_madd运算中,指定的基向量vzero对应于在所有数据通道中包含0值的向量,并且对于许多simd体系架构都是通用的。以这种方式使用vzero提供了初始化向量累加器vacc的高效手段,但是在一些替代实施例中,对于不提供等效vzero向量的simd体系架构,向量累加器vacc可以首先通过替代手段进行初始化。在剩余的两个scalar_madd运算中,指定的基向量是累加器vacc。将三个源向量vleft、vcenter和vright乘以从内核向量vkernel的相应数据通道加载的它们各自的内核标量值,并加到累加器vacc。

一旦完成scalar_madd运算,该方法就进行到步骤908,在该步骤中将累加器向量写入到目的地地址。在步骤910中检查剩余向量的数量,并且该过程在步骤904处继续,直到已经生成所有向量。

虽然图9中公开的实施例利用三元素内核执行一维卷积,但是应该理解的是,该实施例不旨在限于三个元素,而是可以包括各种内核宽度。此外,虽然先前讨论的各种实施例已经实现了一维卷积运算,但是应该理解的是,所讨论的方法也可以应用于多维卷积运算。在多维卷积的情况下,诸如图4所示的一组源向量可以同时应用于多个累加器向量,以实现多维卷积。

图10图示了在给定预移位源向量的情况下使用二维3x3元素卷积内核对卷积输出向量进行的部分计算。在一些实施例中,包括左向量1002、中心向量1004和右向量1006的预移位源向量可以从诸如图3所示的预移位数据集加载,或者可以使用各种其它方法加载,包括使用如图6a和图6b中所示的方法和提取向量指令620。3x3内核1010的各种加权系数可以在一些实施例中存储为如图4所示的内核向量410,或者在其它实施例中存储为与图8的标量乘加向量指令860一起使用的内核向量的各个数据通道。左向量、中心向量和右向量1002、1004和1006在3x3内核1010中具有相应的左列、中心列和右列,其中每一列包括三行加权系数。3x3内核1010的每一行具有相应的累加器向量,第一行的领先累加器1018,第二行的中心累加器1016,以及第三行的滞后累加器1014。

对源向量1002、1004和1006中的每个向量执行三次乘加向量指令,对三个累加器向量中的每个向量执行一次。结果是总共九个乘加向量指令,每个内核加权系数一个。对于每个乘加向量指令,基于操作的相应源向量和累加器向量选择内核的行和列。因此,领先累加器1018是使用系数k1的左向量1002、使用系数k2的中心向量1004和使用系数k3的右向量1006的加权和。同样,中心累加器1016是使用系数k4的左向量1002、使用系数k5的中心向量1004和使用系数k6的右向量1006的加权和。最后,滞后累加器1014是使用系数k7的左向量1002、使用系数k8的中心向量1004和使用系数k9的右向量1006的加权和。

图10仅图示了针对单组源向量的输出向量的部分计算。为了完整计算每个输出向量,还必须执行每个目的地向量紧邻上方和紧邻下方的向量的加权和。通过在源数据的列上迭代图10中所示的方法,可以在仅加载一次每个源向量以及其相关联的左移位和右移位向量时执行完整的卷积计算。

虽然为了简单起见,图10图示了具有3x3卷积内核的卷积计算,但是本领域技术人员将认识到,所示的计算不仅限于三行或三列,而是还可以用于支持其它数量的行、列或行和列。此外,所示的计算不旨在限于二维卷积运算,而是可以用于执行大于二维的卷积。

图11是根据一些实施例的使用图8的标量乘加向量指令860和图6a的提取向量指令620来演示多个数据向量的二维三元素卷积的一部分的流程图。该方法假定内核向量vkernel和vkernel2已经使用加权系数进行了初始化。在这个示例中,假定向量包含八个数据道,而需要九个加权系数,因此使用了两个内核向量,但是本领域技术人员将认识到,取决于向量和卷积内核配置,可以使用更多或更少的内核向量。该方法从步骤1110开始,该步骤加载中心源向量vcenter。一旦该向量被加载,它就立即可用于卷积计算。

该方法然后进行到执行两个函数的步骤1102。首先,加载左对齐的源向量。一旦该向量被加载,它就可以与vcenter结合以产生左移位的向量vleft。其次,使用图8的标量乘加向量指令860,使用先前步骤中加载的vcenter向量来执行加权和计算。

标量乘加向量指令860由scalar_madd运算表示,该运算采用四个操作数:第一操作数是基向量,第二操作数是源向量,第三操作数是内核向量,并且第四操作数是包含缩放系数的内核向量的通道。scalar_madd运算将第二操作数的每个通道乘以由第三和第四操作数指定的通道,然后将乘积加到第一操作数,并返回结果向量。

vtop和vmid累加器向量可能具有该方法先前迭代的部分结果,并且因此未被初始化。但是,vbtm累加器必须被初始化。在步骤1102的vbtm计算中指定的基向量vzero对应于所有数据通道中包含0值的向量,并且对于许多simd体系架构都是通用的。以这种方式使用vzero提供了初始化向量累加器vbtm的高效手段,但是在一些替代实施例中,对于不提供等效vzero向量的simd体系架构,向量累加器可以首先通过替代手段进行初始化。步骤1102使用scalar_madd运算来使用vcenter源向量和与3x3卷积内核的中心列对应的三个加权值来计算三个部分和。

该方法然后进行到步骤1104,该步骤加载vsrcright源向量。步骤1104还使用已经加载的vsrcleft和vcenter向量以及图6a的提取向量指令620来加载vleft向量。提取向量指令620由extract运算表示,该运算采用四个操作数:第一和第二操作数是源向量,第三操作数是移位值,并且第四操作数是输出宽度。

然后该方法进行到步骤1106,该步骤使用已经加载的vcenter和vsrcright向量以及图6a的提取向量指令620来加载vright向量。此外,在步骤1104中加载的vleft向量用于使用图8的标量乘加向量指令860使用与3x3卷积内核的左列对应的三个加权值来执行加权和计算。

然后,该方法进行到步骤1108,其中在步骤1106中加载的vright向量用于使用图8的标量乘加向量指令860使用与3x3卷积内核的右列对应的三个加权值来执行加权和计算。

然后该方法进行到步骤1110,其中已完成针对源行的源向量的部分和。此时,累加器vtop将完成所有行,并可将其写入到目的地向量。该方法进行到步骤1112,其中将剩余的两个累加器vmid和vbtm分别移位到vtop和vmid位置,以准备下一个计算行。

虽然为简单起见,图11的流程图图示了具有3x3卷积内核的卷积计算,但是本领域的技术人员将认识到,所示的计算不限于三行或三列,而是可以用于支持其它数量的行、列或行和列。此外,所示的计算不旨在限于二维卷积运算,而是可以用于执行大于二维的卷积。

虽然本文讨论的卷积运算的各种实施例可以应用在各种各样的应用中,但是当将各种实施例应用到机器学习和深度神经网络时,它们可能特别有用。在这些应用中,卷积步骤被认为是非常耗时且资源效率低的操作。因此,可以定制处理器以加速该操作。卷积阶段越来越多地添加到各种各样的深度神经网络(dnn)中,包括卷积网络(d-cnn)、递归神经网络(诸如lstm)、生成对抗性(gan)等。通过使用通用cpu核心上可用的simd指令执行直接卷积运算,卷积可以与使用专用空间卷积神经网络硬件一样高效或更高效地执行,同时可装入到常规处理器管道中,从而最小化或消除额外的硬件。此外,由于这些应用中的卷积通常使用许多小型卷积内核重复用于给定数据集,因此该方法可实现出色的处理器利用率,因为各个卷积运算可以专用于各个处理器核心,从而允许系统仅通过添加附加的处理器资源即可很好地进行扩展。最后,本文描述的simd指令的各种实施例可以为除卷积之外的大范围运算带来益处。

在一些实施例中,可以采用步幅来减少卷积运算的计算需求和输出大小。在这种情况下,步幅值指定每个计算出的数据元素可以跳过多少个数据元素。例如,当采用2的步幅时,将跳过每隔一个数据元素,并且仅计算一半的数据元素。对于多维卷积维度,可以通过跳过数据元素的行来高效地采用步幅,但是对于本文描述的各种实施例中的一维卷积,步幅因子将用于降低执行核心的算术逻辑单元的利用率。出于这个原因,可以采用混洗数据集来使得能够使用向量指令的否则未被利用的数据通道。在这种情况下,公开了混洗向量指令的各种实施例,其使得能够加载混洗的源数据向量以实现步幅值大于一的卷积。

图12a图示了根据一些实施例的这种混洗向量指令1240的示例。在图12a中,从源通道1210开始并实现由步幅1220指定的步幅值,将源向量1200级联并提取所得向量的子集。结果被写入到输出向量1230。所需的源向量1200的数量将等于步幅1220,从而产生包括所有数据通道中的数据元素的输出向量。在一些实施例中,可以使用指令操作数来指定每个源向量1200。在其它实施例中,可以使用指定向量范围的操作数来指定源向量1200。

图12b图示了根据一些实施例的混洗向量指令1290的另一个示例。在图12b中,从源通道1260开始并实现由步幅1265指定的步幅值,将级联包括一个或多个向量的固定数量的源向量1250,并且提取所得向量的子集。结果被写入到输出向量1280。由于源向量1250的数量是固定的并且可以小于步幅1265,因此输出向量可以仅包括所有数据通道的连续子集。出于这个原因,可以提供附加的操作数来指定用于提取输出数据通道的第一输出通道1270。

图13图示了用于一维三元素卷积的源向量的加载,该卷积包括2的步幅值。加载三个对齐的源向量,即中心源向量1300b、紧邻中心向量1300a左侧的源向量和紧邻中心向量1300c右侧的源向量。使用左和中心源向量1300a和1300b以及图6a的提取向量指令620使用等于向量中数据通道的数量的偏移值(在该示例中为八)减一来执行提取运算1310a。同样,使用中心和右源向量1300b和1300c以及图6a的提取向量指令620使用1的移位值来执行提取运算1310b。提取运算1310a和1310b产生中间源向量1320a和1320b,它们然后被输入到混洗运算1330a中。混洗运算1330a采用图12a的混洗向量指令1240,其中源通道1210值为零并且步幅1220值为2,以产生左向量1340a,其包括从源向量1300a的数据通道l8开始的原始源向量1300的交替数据通道。

然后将源向量1300b和1300c输入到混洗运算1330b和1330c中。混洗运算1330b采用图12a的混洗向量指令1240,其中源通道1210值为零并且步幅1220值为2,以产生中心向量1340b,而混洗运算1330c采用图12a的混洗向量指令1240,其中源通道1210值为1并且步幅1220为2,以产生右向量1340b。因此,中心向量1340b包括从源向量1300b的数据通道c1开始的原始源向量1300的交替数据通道,而右向量1340c包括从源向量1300b的数据通道c2开始的原始源向量1300的交替数据通道。

向量集1340然后可以在诸如图5所示的卷积中使用,或者与图11所示的方法结合以实现带有步幅的多维卷积。本领域技术人员将认识到,图13中所示的方法既不旨在限于三元素卷积运算,也不限于2的步幅值,而是可以用于生成执行各种内核宽度和步幅值的卷积所需的向量,通常不需要加载图13所示的源向量之外的附加源向量1300。本领域技术人员还将认识到,实现大于三个的内核宽度和/或步幅大于2的实施例可能需要除图13所示的之外的附加源向量1300,以及那些特定实施例所需的附加提取运算1310。提取向量指令620和混洗向量指令1240或1290的使用消除了对诸如图3所示的预移位数据的需要,从而消除了实现步幅特征的卷积运算的数据大小的增长。

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