CN115328440A - 一种基于2d脉动阵列的通用稀疏矩阵乘法实现方法及装置 - Google Patents
一种基于2d脉动阵列的通用稀疏矩阵乘法实现方法及装置 Download PDFInfo
- Publication number
- CN115328440A CN115328440A CN202210847492.2A CN202210847492A CN115328440A CN 115328440 A CN115328440 A CN 115328440A CN 202210847492 A CN202210847492 A CN 202210847492A CN 115328440 A CN115328440 A CN 115328440A
- Authority
- CN
- China
- Prior art keywords
- matrix
- compression
- compressed
- zero
- index
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/38—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
- G06F7/48—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
- G06F7/52—Multiplying; Dividing
- G06F7/523—Multiplying only
- G06F7/525—Multiplying only in serial-serial fashion, i.e. both operands being entered serially
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/174—Redundancy elimination performed by the file system
- G06F16/1744—Redundancy elimination performed by the file system using compression, e.g. sparse files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/16—Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
- G06F3/0656—Data buffering arrangements
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Pure & Applied Mathematics (AREA)
- Mathematical Optimization (AREA)
- Mathematical Analysis (AREA)
- Computational Mathematics (AREA)
- Mathematical Physics (AREA)
- Data Mining & Analysis (AREA)
- Computing Systems (AREA)
- Databases & Information Systems (AREA)
- Human Computer Interaction (AREA)
- Algebra (AREA)
- Software Systems (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明公开了一种基于2D脉动阵列的通用稀疏矩阵乘法实现方法及装置,本发明方法中在2D脉动阵列中每一个处理单元的处理步骤包括:先加载压缩矩阵C*,再接收输入的压缩矩阵A*、压缩矩阵B*,各压缩矩阵均采用索引和数值的格式记录;判断压缩矩阵A*或B*的索引为零则直接传递压缩矩阵A*和B*,否则拼接得到拼接索引,若和压缩矩阵C*的索引相同则计算A*×B*+C*并传递矩阵A*和矩阵B*,若不相同计算A*×B*并传递矩阵A*和矩阵B*。本发明可加速脉动阵列上的稀疏矩阵乘法,可以有效地处理稀疏矩阵乘法,确保在不同资源限制下的有效性、效率和性能。
Description
技术领域
本发明涉及处理器中的稀疏矩阵计算加速技术,具体涉及一种基于2D脉动阵列的通用稀疏矩阵乘法实现方法及装置。
背景技术
稀疏矩阵计算广泛应用于各种应用中,如计算科学、神经网络训练、语言处理模型等。然而,直接将稀疏矩阵计算为稠密矩阵是浪费计算能力和存储空间的,因为零计算是没有意义的。同时,稀疏性提供了减少计算开销和加速计算的可能性。在机器学习和神经网络等领域,稀疏性普遍存在,这主要来自两个方面:(1)激活稀疏性来自于激活函数关系,大约50%的稀疏性。(2)权重稀疏度,即剪枝算法、稀疏度训练算法,稀疏度达到90%。神经网络训练的主要计算开销是卷积运算(训练时间的70%),通过im2col方法将卷积算子转化为矩阵乘算子是硬件加速的一个方向。具有规则结构、统一布线和高频率的脉动阵列,使数据在计算单元中流动,并减少了存储器访问的次数。此外,它具有较高的数据重用性和矩阵乘法计算的巨大加速潜力。谷歌团队设计了以脉动阵列作为核心计算架构的TPU。此外,诸如之类的许多工作表明,脉动阵列在加速矩阵乘法方面具有很大的可行性。
脉动阵列是一种硬件架构,其中许多简单的处理单元按照规则排列。处理单元是乘法累加单元,在一个步骤中完成乘法和加法计算。脉动阵列中的数据移动只能发生在相邻处理单元之间。这种简单的体系结构具有良好的可扩展性,系统性能可以随着阵列规模的扩大而相应提高。因此,使用脉动阵列来加速通用矩阵乘。一般来说,通用矩阵乘运算可以执行几乎任何类型的矩阵乘法。即使矩阵是稀疏的,也可以将其计算为包含零的稠密矩阵。稀疏矩阵乘为稀疏矩阵和稠密矩阵之间的矩阵乘法。通用稀疏矩阵乘是稀疏矩阵和稀疏矩阵之间的矩阵乘法。虽然稀疏矩阵乘和通用稀疏矩阵乘计算中的矩阵是稀疏的,但它们存储为稠密矩阵。目前,大多数稀疏加速算法的主要思想是将稀疏矩阵压缩成具有索引的稠密矩阵,然后利用索引信息选择稀疏矩阵中的非零值进行计算。不幸的是,脉动阵列的规律性意味着支持这种灵活的选择操作几乎是不可能的。除此之外,脉动数组中的数据流不能被选择操作中断。因此,如何在脉动阵列中支持稀疏计算是一个挑战。此外,平衡执行效率和片上资源是另一个挑战。
发明内容
本发明要解决的技术问题:针对现有技术的上述问题,提供一种基于2D脉动阵列的通用稀疏矩阵乘法实现方法及装置,本发明可加速脉动阵列上的稀疏矩阵乘法,可以有效地处理稀疏矩阵乘法,确保在不同资源限制下的有效性、效率和性能。
为了解决上述技术问题,本发明采用的技术方案为:
一种基于2D脉动阵列的通用稀疏矩阵乘法实现方法,在2D脉动阵列中每一个处理单元的处理步骤包括:
S1、先加载压缩矩阵C*,再接收输入的压缩矩阵A*、压缩矩阵B*,所述压缩矩阵A*、压缩矩阵B*及压缩矩阵C*均采用索引和索引对应数值的格式记录,其中索引为对应数值在进行零值压缩前的原始矩阵中的索引,所述原始分块矩阵为由输入矩阵按照2D脉动阵列的脉动规模进行分块得到;
S2、判断压缩矩阵A*或压缩矩阵B*的索引为零是否成立,若成立则直接向下一个处理单元传递压缩矩阵A*和压缩矩阵B*,退出;否则跳转步骤S3;
S3、拼接压缩矩阵A*和压缩矩阵B*的索引得到拼接索引,判断拼接索引和压缩矩阵C*的索引两者是否相同,若相同则执行计算A*×B*+C*并输出计算结果,并向下一个处理单元传递矩阵A*和矩阵B*,否则执行计算A*×B*并输出计算结果,并向下一个处理单元传递矩阵A*和矩阵B*,退出。
可选地,步骤S1中所述压缩矩阵A*、压缩矩阵B*及压缩矩阵C*三者中,任意压缩矩阵的数值为全部非零值或者包含部分零值,且在包含部分零值时零值对应的索引为0,且索引为0的数值在计算时被跳过。
可选地,步骤S1中输入的压缩矩阵A*为将原始矩阵A对与原始矩阵B的非公共维度方向的零值进行零值压缩后得到,压缩矩阵A*的索引为数值在与原始矩阵B的非公共维度方向的索引,且压缩矩阵B*为将原始矩阵B对与原始矩阵A的非公共维度方向的零值进行零值压缩后得到,压缩矩阵B*的索引为数值在与原始矩阵A的非公共维度方向的索引,压缩矩阵C*的索引由压缩矩阵A*的索引、压缩矩阵B*的索引拼接形成。
可选地,所述将原始矩阵A对与原始矩阵B的非公共维度方向的零值进行零值压缩是指将原始矩阵A以行方向的零值进行零值压缩,所述将原始矩阵B对与原始矩阵A的非公共维度方向的零值进行零值压缩是指对原始矩阵B的列方向的零值进行零值压缩。
可选地,所述进行零值压缩包括:
步骤1,分别使用标记0标记被压缩矩阵的零值、使用标记1标记被压缩矩阵的非零值,将标记0和标记1生成掩码;为被压缩矩阵的非公共维度数值生成顶点集合,其中一个顶点表示矩阵的一个非公共维度;为被压缩矩阵的任意两个非公共维度之间的关系生成边,当两个非公共维度在同一个公共维度有非零数值时将两个非公共维度对应的边定义为有效边,并将所有的边生成二维的邻接矩阵来表示顶点之间的关系;
步骤2,根据邻接矩阵对顶点集合进行分组,得到顶点集合中每个顶点的组号,生成分组顶点集合;所述进行分组包括:(a)初始化组号的变量Ci;(b)赋予顶点集合中尚未分组的顶点中度最大的顶点的组号为Ci,将与该度最大的顶点不相邻且未分组的顶点集合合成可同组顶点集;(c)遍历可同组顶点集,将遍历得到的顶点加入分组Ci,每加入一个顶点就生成一次可同组顶点集,直到可同组顶点集为空;(d)更新顶点集合中尚未分组的顶点,若顶点集合中尚未分组的顶点非空,则将变量Ci加1,跳转步骤(b);否则,判定分组完毕;
步骤3,将相同组号的行/列直接合并为一个新的行/列,从而得到被压缩矩阵完成零值压缩后的矩阵。
可选地,所述进行零值压缩包括:将被压缩矩阵按照非公共维度方向逐行/列输入窗口队列,所述窗口队列为优先队列,所述窗口队列的参数包括宽度、深度和阈值,其中宽度与被压缩的行/列中包含的数据个数相同,深度为队列中可容纳的压缩后的行/列数,阈值为压缩过程中行/列的最大合并数;每当按照非公共维度方向输入窗口队列一行/列,判断新流入的行/列与窗口队列中的已存放的行/列能否合并,若对应每个位置的数据都不冲突,所述不冲突是指不同时为非零值,则将两行/列合并成一行/列,否则,将新流入的行/列插入到窗口队列的其他空位中;当窗口队列中的行/列合并次数达到阈值时,将这个行/列从队列中弹出;当新的行/列进入队列而队列中没有空位时,弹出队列中合并次数最多的行/列;当没有数据流入时,弹出队列中所有的剩余行/列。
此外,本发明还提供一种用于应用前述基于2D脉动阵列的通用稀疏矩阵乘法实现方法的通用稀疏矩阵乘法实现装置,包括:
预处理模块,所述预处理模块用于将原始的输入矩阵按照2D脉动阵列的规模划分为分块矩阵,并将分块矩阵作为被压缩矩阵进行零值压缩后作为压缩数据流输入片上缓冲;
片上缓冲,用于缓存输入2D脉动阵列的压缩数据流,以及2D脉动阵列处理得到的压缩数据,所述压缩数据流包括压缩后的压缩矩阵A*和压缩矩阵B*,所述2D脉动阵列处理得到的压缩数据包括压缩后的压缩矩阵C*以及最终输出的压缩矩阵Y*,其中压缩矩阵Y*用索引和索引对应数值的格式记录;
2D脉动阵列,包括N行N列的处理单元,所述处理单元用于根据从垂直或水平方向流入的压缩矩阵A*和B*以及提前加载的压缩矩阵C*执行乘加运算;
后处理模块,用于将片上缓冲中压缩数据中最终输出的压缩矩阵Y*写回片外存储体,并将压缩矩阵Y*根据索引信息数据还原为未压缩的原始矩阵Y;
所述2D脉动阵列中的处理单元包括:
寄存器组,分别用于缓存来自上一个处理单元输出的压缩后的压缩矩阵A*、压缩矩阵B*以及多个矩阵C*0{0…n},以及向下一个处理单元输出压缩后的矩阵A*、矩阵B*,其中矩阵C*0{0…n}为压缩矩阵A*的一行和压缩矩阵B*的一列相乘得到的部分和;
乘法器,用于将压缩矩阵A*、压缩矩阵B*进行乘法运算;
第一选择器,用于从矩阵C*0{0…n}中选择一个矩阵C*0i,其中i∈{0…n};
加法器,用于将乘法器的乘法结果和选择器输出的矩阵C*0i执行加法操作;
第二选择器,用于从加法器输出的加法操作结果、第一选择器的选择结果两者中选择一个作为输出到下一个处理单元的多个矩阵C*1{0…n};
控制逻辑,用于根据压缩矩阵A*、压缩矩阵B*、压缩矩阵C*的索引生成用于选择矩阵C*0{0…n}的控制信号以控制第一选择器,以及判断压缩矩阵A*或压缩矩阵B*的索引为零是否成立,若成立则直接向下一个处理单元传递压缩矩阵A*和矩阵B*;若不成立则拼接压缩矩阵A*和压缩矩阵B*的索引得到拼接索引,判断拼接索引和压缩矩阵C*的索引两者是否相同,若相同则调用乘法器和加法器执行计算A*×B*+C*,并向下一个处理单元传递压缩矩阵A*和压缩矩阵B*,若不相同则调用乘法器执行计算A*×B*,并向下一个处理单元传递压缩矩阵A*和压缩矩阵B*。
可选地,所述片上缓冲、2D脉动阵列以及后处理模块集成于同一个芯片的片内,所述预处理模块嵌入在该芯片的片内或设于该芯片的片外。
此外,本发明还提供一种加速器芯片,包括芯片本体和嵌入芯片本体内的2D脉动阵列,所述2D脉动阵列为所述的基于2D脉动阵列的通用稀疏矩阵乘法实现装置。
此外,本发明还提供一种计算机设备,包括相互连接的微处理器和存储器,其特征在于,所述微处理器被编程或配置以执行所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法的步骤。
和现有技术相比,本发明主要具有下述优点:
1、本发明可加速脉动阵列上的稀疏矩阵乘法,通过打包矩阵的稀疏性并与重新配置的2D脉动阵列协同工作,可以有效地处理稀疏矩阵乘法。
2、本发明以脉动阵列为计算核心,对稀疏矩阵进行重新排序和压缩,压缩稀疏矩阵消耗更少的片上存储开销、带宽和通信。
3、本发明方法可以适应不同规模的计算核心、带宽和资源限制,并在有限资源下发挥稀疏矩阵乘法的加速潜力,确保在不同资源限制下的有效性、效率和性能。
附图说明
图1为本发明实施例一方法的基本流程示意图。
图2为本发明实施例一中稀疏数据表示方式。
图3为本发明实施例一中脉稀疏动计算流程示例。
图4为本发明实施例一中零值压缩方法的流程图。
图5为本发明实施例一中稀疏矩阵压缩及乘法实现的原理图。
图6为本发明实施例一中基于脉动的稀疏矩阵乘法实现原理图。
图7为本发明实施例一中装置结构示意图。
图8为本发明实施例一中处理单元的结构示意图。
图9为本发明实施例一中单个处理单元的微结构和数据流示例。
图10为本发明实施例一中无阈值时不同稀疏度下不同分块大小的压缩比。
图11为本发明实施例一中压缩矩阵的组成情况示例。
图12为本发明实施例一中不同阈值设置时的压缩结果可视化示例。
图13为8×8脉动阵列与原始脉动阵列的归一化计算时间比较。
图14为16×16脉动阵列与原始脉动阵列的归一化计算时间比较。
图15为4096×4096矩阵计算通用稀疏矩阵乘时与GPU的加速比比较。
图16为稀疏度0.99的矩阵计算通用稀疏矩阵乘时与GPU的加速比比较。
图17为本发明实施例二中窗口队列处理过程示例。
具体实施方式
实施例一:
如图1所示,本实施例提供一种基于2D脉动阵列的通用稀疏矩阵乘法实现方法,在2D脉动阵列中每一个处理单元的处理步骤包括:
S1、先加载压缩矩阵C*,再接收输入的压缩矩阵A*、压缩矩阵B*;
S2、判断压缩矩阵A*或压缩矩阵B*的索引为零是否成立,若成立则直接向下一个处理单元传递压缩矩阵A*和压缩矩阵B*,退出;否则跳转步骤S3;
S3、拼接压缩矩阵A*和压缩矩阵B*的索引得到拼接索引,判断拼接索引和压缩矩阵C*的索引两者是否相同,若相同则执行计算A*×B*+C*并输出计算结果,并向下一个处理单元传递矩阵A*和矩阵B*,否则执行计算A*×B*并输出计算结果,并向下一个处理单元传递矩阵A*和矩阵B*,退出。
如图2所示,压缩矩阵A*、压缩矩阵B*及压缩矩阵C*均采用索引和索引对应数值的格式记录,其中索引为对应数值在进行零值压缩前的原始矩阵中的索引,原始分块矩阵为由输入矩阵按照2D脉动阵列的脉动规模进行分块得到。本实施例中采用“索引+数值”的方式产生满足二维脉动的数据流,可保证矩阵乘法计算的准确性。除了存储非零值的元素,还需要存储对应非零元素的索引信息,通过索引来选择需要相乘的元素,来保证乘法结果的有效性(即乘法所得结果是目标矩阵中的值)。在这种压缩方式下,对于输入的待乘矩阵A*和B*,只需要记录非公共维度的索引信息,不需要记录完整的索引信息(行和列),相比于坐标存储方法,能够减少一半的索引开销。对于输入的累加矩阵C*和输出的结果矩阵Y*,需要存储两个维度的坐标,索引开销与坐标存储方法一致。对于一个输入的原始矩阵,其处理步骤包括:先按照脉动阵列的规模生成分块矩阵;对分块矩阵进行预处理时,根据需要按照行方向或者列方向进行压缩处理,处理完成后输出压缩矩阵(压缩矩阵A*、压缩矩阵B*)。将得到的压缩矩阵会使用图2中的数据格式进行存储。
本实施例中,步骤S1中所述压缩矩阵A*、压缩矩阵B*及压缩矩阵C*三者中,任意压缩矩阵的数值为全部非零值或者包含部分零值,且在包含部分零值时零值对应的索引为0,且索引为0的数值在计算时被跳过。
本实施例中,步骤S1中输入的压缩矩阵A*为将原始矩阵A对与原始矩阵B的非公共维度方向的零值进行零值压缩后得到,压缩矩阵A*的索引为数值在与原始矩阵B的非公共维度方向的索引,且压缩矩阵B*为将原始矩阵B对与原始矩阵A的非公共维度方向的零值进行零值压缩后得到,压缩矩阵B*的索引为数值在与原始矩阵A的非公共维度方向的索引,压缩矩阵C*的索引由压缩矩阵A*的索引、压缩矩阵B*的索引拼接形成。
本实施例中,将原始矩阵A对与原始矩阵B的非公共维度方向的零值进行零值压缩是指将原始矩阵A以行方向的零值进行零值压缩,所述将原始矩阵B对与原始矩阵A的非公共维度方向的零值进行零值压缩是指对原始矩阵B的列方向的零值进行零值压缩。
图3为本实施例中脉稀疏动计算流程示例。压缩矩阵A*和压缩矩阵B*相乘的过程示例如图3所示。首先将输入数据表示为“索引+数据”的格式,具体来看,压缩矩阵A*中带下划线黑色数字表示行号(从1开始编号),黑色数字代表数值,注意,零值数据行号为0,目的是在重构的处理单元中跳过零值计算;压缩矩阵B*中带下划线灰色数字表示列号,黑色表示数值。在第一步时,将压缩矩阵B*加载到脉动阵列中,倾斜压缩矩阵A*流入计算;第二到第五步为脉动计算中的过程,在第三步时,流出第一组输出数据,“43 3,11 2”,表示结果矩阵的第4行第3列值为3,第1行1列值为2,将其还原得到输出数据。第五步时,计算完成,得到计算结果,与图2中C一致。
基于前文提及的零值压缩原理,可根据需要实现所需的零值压缩方法。本实施例中,考虑到离线环境(离线环境中数据的产生和消耗都在片上,会受到片上资源的约束)的需要,提供一种面向离线环境的零值压缩方法,具体地,我们将稀疏矩阵A抽象为无向图G。非公共维数抽象为顶点集V,其中一个顶点表示矩阵A的一行或一列,两行/列之间的关系抽象为边集E。当两行/列在同一列/行上具有非零值时,我们定义这条边是有效的。然后,我们将V分成K个组,每个组形成一个独立的集合,其中没有相邻的顶点。我们的目标是获得最小K值。此时,我们把问题变成了一个最优图着色问题。
如图4所示,本实施例中种面向离线环境的零值压缩包括:
步骤1,分别使用标记0标记被压缩矩阵的零值、使用标记1标记被压缩矩阵的非零值,将标记0和标记1生成掩码;为被压缩矩阵的非公共维度数值生成顶点集合,其中一个顶点表示矩阵的一个非公共维度;为被压缩矩阵的任意两个非公共维度之间的关系生成边,当两个非公共维度在同一个公共维度有非零数值时将两个非公共维度对应的边定义为有效边,并将所有的边生成二维的邻接矩阵来表示顶点之间的关系;
步骤2,根据邻接矩阵对顶点集合进行分组,得到顶点集合中每个顶点的组号,生成分组顶点集合;所述进行分组包括:(a)初始化组号的变量Ci;(b)赋予顶点集合中尚未分组的顶点中度最大的顶点的组号为Ci,将与该度最大的顶点不相邻且未分组的顶点集合合成可同组顶点集;(c)遍历可同组顶点集,将遍历得到的顶点加入分组Ci,每加入一个顶点就生成一次可同组顶点集,直到可同组顶点集为空;(d)更新顶点集合中尚未分组的顶点,若顶点集合中尚未分组的顶点非空,则将变量Ci加1,跳转步骤(b);否则,判定分组完毕;
步骤3,将相同组号的行/列直接合并为一个新的行/列,从而得到被压缩矩阵完成零值压缩后的矩阵。以矩阵A为例,最后根据组号对A的数据进行过滤和压缩,得到压缩矩阵A*。具体来说,由于组号相同的顶点是不冲突的,即两行/列在对应列/行方向的位置上不会同时为非零值,所以可以将相同组号的行/列直接合并为一个新的行/列。
由于脉动的数据流是单方向流出且只有一个数据出口,压缩后的行/列在流入到脉动中计算时,同一个方向上会存在多个部分和,为了保证结果的正确性,这些部分和不能合并(索引不同)。而一个分组中的顶点越多,为了保证结果正确性时所需要的资源也越多。例如,压缩后的行由压缩前的4行合并而成,在脉动数据流中,压缩前的行在四个行方向分别产生4个部分和,而压缩后的行在一个行方向上会产生4个部分和,计算效率提高的同时需要增加资源保证正确性。在进行压缩和分组时,我们将阈值添加到输入参数中,通过阈值参数控制分组中的顶点数量。通过调整阈值,我们可以控制压缩算法时合并行/列的数量,资源充足时可以提高阈值,从而提高合并和计算效率。反之,在资源受限时,设置较低的阈值,通过牺牲一定合并和计算效率保证正确性。
本实施例基于2D脉动阵列的通用稀疏矩阵乘法实现方法的基本思路如下:首先考虑矩阵乘法的计算规则,对于规模为M×K的矩阵A和规模为K×N的矩阵B,相乘之后得到规模为M×N的矩阵Y。对于A中的第i行k列数据a(i,k),与B中的对应k行的第k行j列数据b(k,j)相乘,得到结果y(i,j),即:矩阵Y中的第i行j列数据。为了保证结果y的有效性,数据a(i,k)的列号与数据b(k,j)的行号必须是相同的(都为k),而a(i,k)的行号i和b(k,j)的列号j可以是任意的。也就是说,在保证结果有效性的前提下,a(i,k)和b(k,j)的公共维度(a(i,k)的列和b(k,j)的行)不能发生变化,能够调整顺序的只有非公共维度(a(i,k)的行和b(k,j)的列)。在记录非公共维度索引的情况下,即使调整了乘法的顺序,也完全可以得到正确的结果。因此,压缩算法基于相乘矩阵的非公共维度进行压缩,矩阵A按行压缩,矩阵B按列压缩。如图5所示,矩阵A是规模为4×2的矩阵,矩阵B是规模为2×4的矩阵,相乘之后得到规模为4×4的矩阵Y。图中以图案代表行列信息,相同图案代表数据位于同一行/列,分别用4种图案代表矩阵A的4行和矩阵B的4列。在执行压缩算法时,矩阵A按行进行压缩,第1行和第4行进行合并,第3行没有非零值,直接过滤不做存储,最后得到压缩后的矩阵A*,规模减少为2×2;矩阵B按列进行压缩,第1列和第3列进行合并,第2列没有非零值被直接过滤,得到压缩后的矩阵B*,规模减少为2×2。(压缩后的)矩阵A*和B*相乘时,对应位置元素相乘之后,会得到不同组合,将同一组合的结果累加。Y*中只保留非零值的结果,根据行列信息还原得到矩阵Y。图6所示是将图5中的矩阵乘法采用输入固定的数据流映射到2×2规模的二维脉动阵列进行计算的过程。计算Y=A*B时,首先将B矩阵分成B0和B1两块矩阵,先将B0矩阵加载到脉动阵列中,A矩阵转置以后,倾斜数据之后流入到脉动阵列中与B0进行计算,得到部分结果Y0;然后再将B1加载到脉动阵列中,与A计算后得到部分结果Y1,Y0和Y1拼接以后得到结果Y,至此,完成矩阵计算。在进行A*和B*的乘法时,先将B*矩阵加载到脉动阵列中,A*矩阵转置以后倾斜流入到脉动阵列中,重构的处理单元会根据索引判断是否累加结果,最终得到Y*。在两种矩阵乘法计算中,A×B计算总量为64FLOPs,访存次数为4次(B0、A、B1、A),计算时间12步(一个分块计算时间为6步);A*×B*计算总量为16FLOPs,访存次数为2次(B*、A*),计算时间为4步。相比于传统的脉动阵列,利用压缩算法和重构处理单元总计获得了4倍的计算量、2倍的访存和3倍的时间减少。
如图7所示,本实施例还提供一种用于应用前文所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法的通用稀疏矩阵乘法实现装置,包括:
预处理模块,所述预处理模块用于将原始的输入矩阵按照2D脉动阵列的规模划分为分块矩阵,并将分块矩阵作为被压缩矩阵进行零值压缩后作为压缩数据流输入片上缓冲;
片上缓冲,用于缓存输入2D脉动阵列的压缩数据流,以及2D脉动阵列处理得到的压缩数据,所述压缩数据流包括压缩后的压缩矩阵A*和压缩矩阵B*,所述2D脉动阵列处理得到的压缩数据包括压缩后的压缩矩阵C*以及最终输出的压缩矩阵Y*,其中压缩矩阵Y*用索引和索引对应数值的格式记录;
2D脉动阵列,包括N行N列的处理单元,所述处理单元用于根据从垂直或水平方向流入的压缩矩阵A*和B*以及提前加载的压缩矩阵C*执行乘加运算;
后处理模块,用于将片上缓冲中压缩数据中最终输出的压缩矩阵Y*写回片外存储体,并将压缩矩阵Y*根据索引信息数据还原为未压缩的原始矩阵Y。
如图8所示,2D脉动阵列中的处理单元包括:
寄存器组,分别用于缓存来自上一个处理单元输出的压缩后的压缩矩阵A*、压缩矩阵B*以及多个矩阵C*0{0…n},以及向下一个处理单元输出压缩后的矩阵A*、矩阵B*,其中矩阵C*0{0…n}为压缩矩阵A*的一行和压缩矩阵B*的一列相乘得到的部分和;
乘法器,用于将压缩矩阵A*、压缩矩阵B*进行乘法运算;
第一选择器,用于从矩阵C*0{0…n}中选择一个矩阵C*0i,其中i∈{0…n};
加法器,用于将乘法器的乘法结果和选择器输出的矩阵C*0i执行加法操作;
第二选择器,用于从加法器输出的加法操作结果、第一选择器的选择结果两者中选择一个作为输出到下一个处理单元的多个矩阵C*1{0…n};
控制逻辑,用于根据压缩矩阵A*、压缩矩阵B*、压缩矩阵C*的索引生成用于选择矩阵C*0{0…n}的控制信号以控制第一选择器,以及判断压缩矩阵A*或压缩矩阵B*的索引为零是否成立,若成立则直接向下一个处理单元传递压缩矩阵A*和矩阵B*;若不成立则拼接压缩矩阵A*和压缩矩阵B*的索引得到拼接索引,判断拼接索引和压缩矩阵C*的索引两者是否相同,若相同则调用乘法器和加法器执行计算A*×B*+C*,并向下一个处理单元传递压缩矩阵A*和压缩矩阵B*,若不相同则调用乘法器执行计算A*×B*,并向下一个处理单元传递压缩矩阵A*和压缩矩阵B*。
对于图6中所示的压缩矩阵A*与压缩矩阵B*的乘法,我们使用2×2规模的脉动阵列就完成了计算,但是在得到C*时,一个处理单元中可能出现多个有效输出,为了保证多个有效数据不被累加为一个输出值,需要对处理单元进行重构。原始的处理单元中只需要A、B、C三个寄存器就能完成Y=A×B+C的输出,重构后的处理单元增加了存储C数据的寄存器大小和处理索引的控制逻辑。如图7所示是一个16×16规模的脉动阵列,以处理单元(15,1)为例,完成C*1=A*×B*+C*0的处理时,对于可能的多个输入数据C*0{0…n},增加寄存器大小进行存储,在进行累加之前,控制逻辑根据压缩矩阵A*、B*、C*的索引挑选出与A*×B*进行累加的C*0i(i∈{0…n}),执行完加法操作后,控制逻辑将结果写入的相应的C*1位置,再将所有C*1输出到下一个相邻的处理单元中。控制逻辑还有另一个作用,在压缩矩阵A*、B*流入处理单元时,如果有一个数据的索引为0,则压缩矩阵A*、B*不用不流入乘法器中,与输入的压缩矩阵C*一同流出到相邻处理单元,省去乘加操作开销。图7将重构的处理单元以16×16的规模排布为二维的脉动阵列,通过片上的数据缓冲区进行数据的交互,片上缓冲区再与片外的高带宽存储体进行数据交互。压缩算法可以在片外或者片上对原始数据进行预处理,片外处理时,生成的压缩数据流写入到片外的高带宽存储体中,再读写到片上缓冲区中,最后流入脉动阵列进行运算。片上处理时,在高带宽存储体和片上的数据缓冲区之间增加预处理模块,完成数据的压缩处理,再从片上的数据缓冲区中读取数据流入脉动中。后处理模块将片上的数据缓冲区中压缩数据写回高带宽存储体时,将数据还原。
在控制逻辑的控制下,处理单元对输入压缩矩阵的处理包括计算和传递,其中计算为可选操作,传递为必选操作,可选择不计算只传递,或既计算又传递,计算时又包括乘加计算(计算A*×B*+C*)和乘法计算(计算A*×B*),本实施例设计支持输入固定和输出固定两种数据流的流动形式。输入固定是指将相乘矩阵的其中一个提前固定到脉动阵列中,另一个输入矩阵从水平/垂直方向流入脉动阵列,此时,输出结果从垂直/水平流出脉动阵列。类似地,输出固定是指两个输入矩阵分别从水平和垂直方向流入脉动阵列,输出结果固定在脉动阵列中。如图9为在两种数据流模式中计算C*out=A*×B*+C*in的图示。事实上,稀疏矩阵很难被压缩成完全稠密的矩阵,即使在经过预处理压缩之后,还是会有一些零值数据流入到计算单元中,为此,我们对处理单元进行了调整,对于零值数据,处理单元不会执行计算逻辑,从而减少计算开销,而仅仅将其传递到下一个相邻单元中。图9中的a和图9中的b是输入固定数据流在处理单元中的图示。数据B*提前加载到处理单元中,A*从水平流入,C*in和C*out从垂直方向流入和流出。如图9中的a所示,A*和B*为非零值时,会继续执行后续的计算逻辑;在图9中的b中,由于A*或B*为零值,不执行计算逻辑(灰色线条),只执行了传递逻辑。图9中的c和图9中的d是输出固定数据流在处理单元中的图示。数据C*被提前加载到处理单元中,A*从水平流入,B*从垂直方向流入。同样地,是否执行计算逻辑与A*或B*是否为零值相关。
本实施例中,片上缓冲、2D脉动阵列以及后处理模块集成于同一个芯片的片内,此外需要说明的是,预处理模块则可以根据需要选择嵌入在该芯片的片内或设于该芯片的片外。
本实施例中,对零值压缩方法的性能和在算法和重构处理单元支持下脉动阵列的性能进行了分析。首先我们需要明确:对于大于脉动阵列规模的矩阵乘法,输入矩阵需要进行分块,再将分块后的矩阵流入到脉动阵列计算,分块的策略会影响整体的计算时间等性能,在我们的工作中,我们不讨论分块策略的性能,在原始脉动阵列和重构脉动阵列上使用相同的分块策略,保证比较的公平性。因此,以下分析均以可以流入脉动阵列计算的分块矩阵作为输入矩阵进行讨论。定义矩阵A为稀疏度为S的M×K的分块矩阵,非零元素数量为NNZ,数据位宽为dataWidth,存储开销为Mb,脉动阵列规模为K×K。
矩阵A按行维度压缩处理后,得到规模为R×K的压缩矩阵A*,稀疏度Sc,索引位宽为idxWidth,存储开销为MC,则以下关系成立:
NNZ=M*K*(1-S)=R*K*(1-Sc)≤R*K,
Mb=M*K*dataWidth,
Mc=R*K*(dataWidth+idxWidth),
idxWidth=log2M,
上式中,NNZ表示非零元素数量,M×K为分块矩阵的大小,S为分块矩阵的稀疏度,R×K为压缩矩阵A*的大小,Sc为压缩矩阵A*的稀疏度,Mb为存储开销,dataWidth为数据位宽,MC为存储开销,idxWidth为索引位宽。可以得到矩阵A的压缩比comRatio为:
假设在执行中,分块大小设置为256×K,使用单精度浮点数存储和计算,当稀疏度为0.5时,可以获得1.6倍的存储节约。
对于脉动阵列来说,计算时间正比于输入的数据量多少,等价于输入矩阵规模的大小,在只有单侧稀疏的稀疏矩阵乘计算中,定义A为稀疏度为S的M×K的矩阵、B为K×N的稠密矩阵,脉动阵列对矩阵A的计算时间Tbase满足:
Tbase∝M×K×N。
A*为压缩后的R×K的压缩矩阵,则脉动阵列对压缩矩阵A*的计算时间Tcomp满足:
Tcomp∝R×K×N,
由于矩阵A压缩矩阵A*的关系满足:
可以得到加速比Speedup为:
此外,为了进一步对本实施例方法进行实验验证,我们在Verilog RTL中实现了支持稀疏乘法的脉动阵列,然后使用编译器估算了ASAP 7nm开源PDK下的芯片面积和总功耗。我们与使用CUDA Toolkit 11.0中cuSPARSE库的GPU(GeForce RT×2080Ti)和具有相同处理单元数量的脉动阵列进行比较。我们使用随机生成的不同规模的稀疏矩阵来评估我们的设计,包括稀疏矩阵的压缩效率和稀疏矩阵的乘法性能。此外,我们在CIFAR-10和ImageNet数据集上比较了不同CNN的性能,包括VGG16、AlexNet和ResNet18。
我们使用随机生成的稀疏度在0.7到0.99之间的4096×4096单精度浮点矩阵来测试在不同块大小下的无阈值压缩性能。如图10所示,当稀疏度为[0.7,0.8,0.9,0.95,0.99]时,最大潜在压缩比是[2.4,3.5,6.6,12.3,47.9]倍。总体来说,稀疏度越高,非公共维数越大,公共维数越小,压缩比越高。实验结果与我们的分析是一致的。图11为压缩矩阵的组成情况去,其中(a)为无阈值设置;(b)为阈值设置为4。图11中的(a)是稀疏度为0.9且块大小为8×256的压缩矩阵的组成分析。从图中可以看出,原始矩阵中的五行合并成压缩矩阵中的一行的比率(标记为“5合1”)最高,为36%。一般而言,压缩矩阵中近80%的新行来自原始矩阵中四到六个原始行合为一个新行的组合,只有9%的行是未压缩的。
在块大小为256×8、稀疏度为0.9的4096×4096矩阵的测试条件下,我们将阈值分布设置为2、3、4、8。图12中的右侧部分表示了当阈值设置为4时,压缩矩阵中95%的行从原始矩阵的四行合并而来。此外,图12是我们对原始矩阵的一部分矩阵进行可视化的结果。当阈值设置为2、3、4、8时,我们可以从图12中的右侧部分看到256列已被压缩到130、110、95、39列(取最大列数),压缩比接近。因此,阈值越高,压缩的非零值的密度越高。
此外,我们在表1给出了不同阈值设置下处理单元所需的额外缓冲区数量。
表1:不同阈值设置下处理单元需要的额外缓冲数量。
结合表1可知,在不同的计算场景下,所需的额外缓冲区数量会有所不同。具体地说,在8×8规模的脉动阵列中,在阈值为2、3、4、8时,稀疏矩阵乘所需的额外处理单元缓冲量为2、3、4、8,而通用稀疏矩阵乘中所需的额外处理单元缓冲量为4、8、8、8。无论阈值如何,通用稀疏矩阵乘都需要比稀疏矩阵乘更多的额外缓冲区。
我们在原始的脉动阵列和修改后的脉动阵列上执行了矩阵乘法,修改后的脉动阵列中每个处理单元有四个额外的缓冲区,这两个脉动都以8×8和16×16两个规模配置。图13和图14显示了当稀疏度从0.3增加到0.9时,修改后8×8和16×16两个规模配置的脉动阵列在执行稀疏矩阵乘和通用稀疏矩阵乘时的归一化计算时间。请注意,通用稀疏矩阵乘中两个矩阵的稀疏性是相同的。与原始脉动相比,在0.5~0.9稀疏度范围内,两种配置规模的计算时间都有所减少。当稀疏度大于0.5时,在图13所示的8×8规模和图4所示的16×16规模下,修改后的脉动阵列在稀疏矩阵乘计算中分别获得1.4~4.2倍和1.2~3.2倍的加速比,在通用稀疏矩阵乘计算中分别获得2.0~7.1倍和1.3~4.4倍的加速比。实验结果与我们的分析是一致的。对稀疏度较低的矩阵,使用小规模的脉动阵列效果更好。更重要的是,即使在低稀疏度下,修改后的脉动阵列的计算时间也不会超过原始脉动阵列的计算时间。
我们测试了GPU和修改后的脉动阵列计算稀疏矩阵乘法时的性能。为了保证比较的公平性,GPU的性能通过cuSPARSE和cuBLAS的加速比来反映,cuSPARSE和cuBLAS是GPU加速矩阵乘法的库。同样,修改后的脉动阵列的性能也反映在与原始脉动阵列的加速比上。
我们将修改后的脉动阵列配置为256个处理单元(16×16),矩阵块大小为256×16。图15显示了稀疏度从0.3增加到0.99的4096×4096规模矩阵的GPU和修改后的脉动阵列的加速比。在稀疏度为0.99的情况下,修改后的脉动阵列的性能是GPU的9.7倍。即使在处理低稀疏矩阵时,修改后的脉动阵列也可以保持与原始脉动相同的时间。如果稀疏度小于0.98,cuSPARSE则需要更长时间。此外,图16描述了在0.99稀疏度下,对于规模从512到8192的方阵,GPU和修改后的脉动阵列的加速比。修改后的脉动阵列在不同尺度下保持稳定的加速比,但cuSPARSE对小规模矩阵的处理能力较差。通常情况下,cuSPARSE的性能较差,需要较大的矩阵和较高的稀疏度(接近0.98)才能获得较好的加速效益。然而,在大多数情况下,修改后的脉动阵列不会获得负收益。
进一步地,本实施例我们在神经网络训练中进行了评估。实验中采用了RigL的稀疏训练方法,使模型的权值变得稀疏,在训练阶段将权值的稀疏度控制在0.8。此外,由于模型中固有的ReLU函数,训练过程中激活的稀疏性在0.3~0.6之间。我们通过im2ol将CNN中的卷积运算转换为矩阵乘法运算,并将其映射到修改后的脉动阵列进行加速,得到的结果图表2所示。
表2:浮点计算量对比。
表2描述了与稠密浮点计算量相比,参见图2可知,修改后的脉动阵列在CIFAR-10和ImageNet数据集上分别将VGG16、AlexNet和ResNet18的浮点计算量减少了3.4倍、3.2倍和3.6倍。
此外,表3列出了原始脉动和稀疏脉动处理单元的面积和功耗,对应分别处理8位整型数据(INT8)和32位浮点数数据(FP32)。
表3:处理单元面积和功耗统计。
参见表3可知,在处理INT8数据时,由于数据位宽小,索引的开销占比较高,所以稀疏脉动面积和功耗增长的很明显,分别变为原始脉动面积的2.78倍和功耗的2.87倍。而在处理FP32时,索引的开销占比降低,稀疏脉动的面积和功耗变为原始脉动的1.28倍和1.21倍。而在执行跳过零值操作时,由于没有使用计算逻辑,稀疏脉动的功耗也得到了相应的减少。
表4是规模为8×8和16×16的稀疏脉动阵列在处理INT8和FP32数据类型时的面积和功耗开销,我们也给出了预处理和后处理的占比情况。
表4:稀疏脉动面积和功耗统计。
参见图4可知,总体来看,预处理和后处理的开销占比不高,在INT8时不超过7.5%,FP32时不超过3.5%。实验结果表明,对于稀疏度大于0.95的矩阵,本实施例基于2D脉动阵列的通用稀疏矩阵乘法实现方法实现了10倍以上的压缩率;在稀疏度为0.5~0.9的情况下,相对于矩阵乘法的基线提高了1.3~4.4倍,并且在稀疏度为0.99时比cuSPARSE的速度提高了9.7倍。在神经网络训练中,我们进一步将浮点计算量减少了3.2倍以上。
此外,本实施例还提供一种加速器芯片,包括芯片本体和嵌入芯片本体内的2D脉动阵列,所述2D脉动阵列为前文所述的基于2D脉动阵列的通用稀疏矩阵乘法实现装置。此外,本实施例还提供一种计算机设备,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行前文所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法的步骤。
实施例二:
本实施例与实施例一基本相同,其主要区别为采用的零值压缩方法不同。本实施中采用的零值压缩方法为面向在线环境,在线环境中数据的产生和消耗分别在片外和片上,片外处理时有更多的资源,限制更少。
我们提出了“窗口队列”的设计,来满足片上数据的实时产生和消耗需求。窗口队列是一个类似优先队列的结构,在预处理时,稀疏矩阵按一行/列流入到窗口队列中,在进行相关的操作之后,流出队列的行/列稀疏度下降,零值数据更少。具体地,本实施例中进行零值压缩包括:将被压缩矩阵按照非公共维度方向逐行/列输入窗口队列,窗口队列为优先队列,所述窗口队列的参数包括宽度、深度和阈值,其中宽度与被压缩的行/列中包含的数据个数相同,深度为队列中可容纳的压缩后的行/列数,阈值为压缩过程中行/列的最大合并数;每当按照非公共维度方向输入窗口队列一行/列,判断新流入的行/列与窗口队列中的已存放的行/列能否合并,若对应每个位置的数据都不冲突,所述不冲突是指不同时为非零值,则将两行/列合并成一行/列,否则,将新流入的行/列插入到窗口队列的其他空位中;当窗口队列中的行/列合并次数达到阈值时,将这个行/列从队列中弹出;当新的行/列进入队列而队列中没有空位时,弹出队列中合并次数最多的行/列;当没有数据流入时,弹出队列中所有的剩余行/列。由此可知,前文提及的相关的操作包括:入队操作:判断新流入的行/列与窗口队列中的已存放的行/列能否合并,若对应每个位置的数据都不冲突(不同时为非零值),则将两行/列合并成一行/列,否则,将新流入的行/列插入到窗口队列的其他空位中。出队操作:当窗口队列中的行/列合并次数得到阈值时,将这个行/列从队列中弹出;当新的行/列进入队列而队列中没有空位时,弹出队列中合并次数最多的行/列;当没有数据流入时,弹出队列中所有的剩余行/列。如图17所示,是宽度为3,深度为2,阈值为2的窗口队列处理流入数据的过程,分别包括:第一步:队列初始化;第二步:第一列数据入列;第三步:新数据与队列中已有数据冲突,插入到新位置;第四步,新数据和第一列数据合并,达到合并阈值,准备出列;第五步,新数据插入到空位;第六步,数据流停止,依次弹出剩余数据。
此外,本实施例还提供一种用于应用前文所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法的通用稀疏矩阵乘法实现装置,与实施例一的区别在于,其预处理模块所采用的零值压缩方法不同。
此外,本实施例还提供一种加速器芯片,包括芯片本体和嵌入芯片本体内的2D脉动阵列,所述2D脉动阵列为前文所述的基于2D脉动阵列的通用稀疏矩阵乘法实现装置。此外,本实施例还提供一种计算机设备,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行前文所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法的步骤。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种基于2D脉动阵列的通用稀疏矩阵乘法实现方法,其特征在于,在2D脉动阵列中每一个处理单元的处理步骤包括:
S1、先加载压缩矩阵C*,再接收输入的压缩矩阵A*、压缩矩阵B*,所述压缩矩阵A*、压缩矩阵B*及压缩矩阵C*均采用索引和索引对应数值的格式记录,其中索引为对应数值在进行零值压缩前的原始矩阵中的索引,所述原始分块矩阵为由输入矩阵按照2D脉动阵列的脉动规模进行分块得到;
S2、判断压缩矩阵A*或压缩矩阵B*的索引为零是否成立,若成立则直接向下一个处理单元传递压缩矩阵A*和压缩矩阵B*,退出;否则跳转步骤S3;
S3、拼接压缩矩阵A*和压缩矩阵B*的索引得到拼接索引,判断拼接索引和压缩矩阵C*的索引两者是否相同,若相同则执行计算A*×B*+C*并输出计算结果,并向下一个处理单元传递矩阵A*和矩阵B*,否则执行计算A*×B*并输出计算结果,并向下一个处理单元传递矩阵A*和矩阵B*,退出。
2.根据权利要求1所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法,其特征在于,步骤S1中所述压缩矩阵A*、压缩矩阵B*及压缩矩阵C*三者中,任意压缩矩阵的数值为全部非零值或者包含部分零值,且在包含部分零值时零值对应的索引为0,且索引为0的数值在计算时被跳过。
3.根据权利要求2所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法,其特征在于,步骤S1中输入的压缩矩阵A*为将原始矩阵A对与原始矩阵B的非公共维度方向的零值进行零值压缩后得到,压缩矩阵A*的索引为数值在与原始矩阵B的非公共维度方向的索引,且压缩矩阵B*为将原始矩阵B对与原始矩阵A的非公共维度方向的零值进行零值压缩后得到,压缩矩阵B*的索引为数值在与原始矩阵A的非公共维度方向的索引,压缩矩阵C*的索引由压缩矩阵A*的索引、压缩矩阵B*的索引拼接形成。
4.根据权利要求3所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法,其特征在于,所述将原始矩阵A对与原始矩阵B的非公共维度方向的零值进行零值压缩是指将原始矩阵A以行方向的零值进行零值压缩,所述将原始矩阵B对与原始矩阵A的非公共维度方向的零值进行零值压缩是指对原始矩阵B的列方向的零值进行零值压缩。
5.根据权利要求4所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法,其特征在于,所述进行零值压缩包括:
步骤1,分别使用标记0标记被压缩矩阵的零值、使用标记1标记被压缩矩阵的非零值,将标记0和标记1生成掩码;为被压缩矩阵的非公共维度数值生成顶点集合,其中一个顶点表示矩阵的一个非公共维度;为被压缩矩阵的任意两个非公共维度之间的关系生成边,当两个非公共维度在同一个公共维度有非零数值时将两个非公共维度对应的边定义为有效边,并将所有的边生成二维的邻接矩阵来表示顶点之间的关系;
步骤2,根据邻接矩阵对顶点集合进行分组,得到顶点集合中每个顶点的组号,生成分组顶点集合;所述进行分组包括:(a)初始化组号的变量Ci;(b)赋予顶点集合中尚未分组的顶点中度最大的顶点的组号为Ci,将与该度最大的顶点不相邻且未分组的顶点集合合成可同组顶点集;(c)遍历可同组顶点集,将遍历得到的顶点加入分组Ci,每加入一个顶点就生成一次可同组顶点集,直到可同组顶点集为空;(d)更新顶点集合中尚未分组的顶点,若顶点集合中尚未分组的顶点非空,则将变量Ci加1,跳转步骤(b);否则,判定分组完毕;
步骤3,将相同组号的行/列直接合并为一个新的行/列,从而得到被压缩矩阵完成零值压缩后的矩阵。
6.根据权利要求4所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法,其特征在于,所述进行零值压缩包括:将被压缩矩阵按照非公共维度方向逐行/列输入窗口队列,所述窗口队列为优先队列,所述窗口队列的参数包括宽度、深度和阈值,其中宽度与被压缩的行/列中包含的数据个数相同,深度为队列中可容纳的压缩后的行/列数,阈值为压缩过程中行/列的最大合并数;每当按照非公共维度方向输入窗口队列一行/列,判断新流入的行/列与窗口队列中的已存放的行/列能否合并,若对应每个位置的数据都不冲突,所述不冲突是指不同时为非零值,则将两行/列合并成一行/列,否则,将新流入的行/列插入到窗口队列的其他空位中;当窗口队列中的行/列合并次数达到阈值时,将这个行/列从队列中弹出;当新的行/列进入队列而队列中没有空位时,弹出队列中合并次数最多的行/列;当没有数据流入时,弹出队列中所有的剩余行/列。
7.一种用于应用权利要求1~6中任意一项所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法的通用稀疏矩阵乘法实现装置,其特征在于,包括:
预处理模块,所述预处理模块用于将原始的输入矩阵按照2D脉动阵列的规模划分为分块矩阵,并将分块矩阵作为被压缩矩阵进行零值压缩后作为压缩数据流输入片上缓冲;
片上缓冲,用于缓存输入2D脉动阵列的压缩数据流,以及2D脉动阵列处理得到的压缩数据,所述压缩数据流包括压缩后的压缩矩阵A*和压缩矩阵B*,所述2D脉动阵列处理得到的压缩数据包括压缩后的压缩矩阵C*以及最终输出的压缩矩阵Y*,其中压缩矩阵Y*用索引和索引对应数值的格式记录;
2D脉动阵列,包括N行N列的处理单元,所述处理单元用于根据从垂直或水平方向流入的压缩矩阵A*和B*以及提前加载的压缩矩阵C*执行乘加运算;
后处理模块,用于将片上缓冲中压缩数据中最终输出的压缩矩阵Y*写回片外存储体,并将压缩矩阵Y*根据索引信息数据还原为未压缩的原始矩阵Y;
所述2D脉动阵列中的处理单元包括:
寄存器组,分别用于缓存来自上一个处理单元输出的压缩后的压缩矩阵A*、压缩矩阵B*以及多个矩阵C*0{0…n},以及向下一个处理单元输出压缩后的矩阵A*、矩阵B*,其中矩阵C*0{0…n}为压缩矩阵A*的一行和压缩矩阵B*的一列相乘得到的部分和;
乘法器,用于将压缩矩阵A*、压缩矩阵B*进行乘法运算;
第一选择器,用于从矩阵C*0{0…n}中选择一个矩阵C*0i,其中i∈{0…n};
加法器,用于将乘法器的乘法结果和选择器输出的矩阵C*0i执行加法操作;
第二选择器,用于从加法器输出的加法操作结果、第一选择器的选择结果两者中选择一个作为输出到下一个处理单元的多个矩阵C*1{0…n};
控制逻辑,用于根据压缩矩阵A*、压缩矩阵B*、压缩矩阵C*的索引生成用于选择矩阵C*0{0…n}的控制信号以控制第一选择器,以及判断压缩矩阵A*或压缩矩阵B*的索引为零是否成立,若成立则直接向下一个处理单元传递压缩矩阵A*和矩阵B*;若不成立则拼接压缩矩阵A*和压缩矩阵B*的索引得到拼接索引,判断拼接索引和压缩矩阵C*的索引两者是否相同,若相同则调用乘法器和加法器执行计算A*×B*+C*,并向下一个处理单元传递压缩矩阵A*和压缩矩阵B*,若不相同则调用乘法器执行计算A*×B*,并向下一个处理单元传递压缩矩阵A*和压缩矩阵B*。
8.根据权利要求7所述的基于2D脉动阵列的通用稀疏矩阵乘法实现装置,其特征在于,所述片上缓冲、2D脉动阵列以及后处理模块集成于同一个芯片的片内,所述预处理模块嵌入在该芯片的片内或设于该芯片的片外。
9.一种加速器芯片,包括芯片本体和嵌入芯片本体内的2D脉动阵列,其特征在于,所述2D脉动阵列为权利要求7或8所述的基于2D脉动阵列的通用稀疏矩阵乘法实现装置。
10.一种计算机设备,包括相互连接的微处理器和存储器,其特征在于,所述微处理器被编程或配置以执行权利要求1~6中任意一项所述的基于2D脉动阵列的通用稀疏矩阵乘法实现方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210847492.2A CN115328440A (zh) | 2022-07-19 | 2022-07-19 | 一种基于2d脉动阵列的通用稀疏矩阵乘法实现方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210847492.2A CN115328440A (zh) | 2022-07-19 | 2022-07-19 | 一种基于2d脉动阵列的通用稀疏矩阵乘法实现方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115328440A true CN115328440A (zh) | 2022-11-11 |
Family
ID=83918340
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210847492.2A Pending CN115328440A (zh) | 2022-07-19 | 2022-07-19 | 一种基于2d脉动阵列的通用稀疏矩阵乘法实现方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115328440A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117931131A (zh) * | 2024-03-22 | 2024-04-26 | 中国人民解放军国防科技大学 | 一种稀疏矩阵乘指令实现方法及系统 |
-
2022
- 2022-07-19 CN CN202210847492.2A patent/CN115328440A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117931131A (zh) * | 2024-03-22 | 2024-04-26 | 中国人民解放军国防科技大学 | 一种稀疏矩阵乘指令实现方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Yepez et al. | Stride 2 1-D, 2-D, and 3-D Winograd for convolutional neural networks | |
KR102443546B1 (ko) | 행렬 곱셈기 | |
Zachariadis et al. | Accelerating sparse matrix–matrix multiplication with GPU Tensor Cores | |
CN111062472B (zh) | 一种基于结构化剪枝的稀疏神经网络加速器及其加速方法 | |
CN109324827B (zh) | 用于处理用于访问数据的指令的装置、方法和系统 | |
JP2022084674A (ja) | 代替ループ限界値 | |
CN112840356A (zh) | 运算加速器、处理方法及相关设备 | |
WO2011156247A2 (en) | Processor for large graph algorithm computations and matrix operations | |
CN103336758A (zh) | 一种稀疏矩阵的存储方法CSRL及基于该方法的SpMV实现方法 | |
CN112200300B (zh) | 卷积神经网络运算方法及装置 | |
CN110516316B (zh) | 一种间断伽辽金法求解欧拉方程的gpu加速方法 | |
CN112668708B (zh) | 一种提高数据利用率的卷积运算装置 | |
CN113344172A (zh) | 将卷积映射到通道卷积引擎 | |
CN110490308B (zh) | 加速库的设计方法、终端设备及存储介质 | |
CN114461978B (zh) | 数据处理方法、装置、电子设备及可读存储介质 | |
CN113655986B9 (zh) | 一种基于numa亲和性的fft卷积算法并行实现方法及系统 | |
CN117407640A (zh) | 一种矩阵计算方法及装置 | |
CN115328440A (zh) | 一种基于2d脉动阵列的通用稀疏矩阵乘法实现方法及装置 | |
CN110414672B (zh) | 卷积运算方法、装置及系统 | |
CN112200305A (zh) | 一种神经网络加速协处理器、处理系统及处理方法 | |
CN111523642A (zh) | 用于卷积运算的数据重用方法、运算方法及装置、芯片 | |
CN116090518A (zh) | 基于脉动运算阵列的特征图处理方法、装置以及存储介质 | |
CN118043821A (zh) | 混合稀疏压缩 | |
CN115130672A (zh) | 一种软硬件协同优化卷积神经网络计算的方法及装置 | |
TWI798591B (zh) | 卷積神經網路運算方法及裝置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |