CN117539546A - 基于非空列存储的稀疏矩阵向量乘加速方法及装置 - Google Patents
基于非空列存储的稀疏矩阵向量乘加速方法及装置 Download PDFInfo
- Publication number
- CN117539546A CN117539546A CN202311504581.8A CN202311504581A CN117539546A CN 117539546 A CN117539546 A CN 117539546A CN 202311504581 A CN202311504581 A CN 202311504581A CN 117539546 A CN117539546 A CN 117539546A
- Authority
- CN
- China
- Prior art keywords
- vector
- array
- sparse matrix
- matrix
- row
- 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
- 239000013598 vector Substances 0.000 title claims abstract description 283
- 239000011159 matrix material Substances 0.000 title claims abstract description 203
- 238000000034 method Methods 0.000 title claims abstract description 23
- 230000001133 acceleration Effects 0.000 title claims abstract description 22
- 230000015654 memory Effects 0.000 claims abstract description 47
- 238000004422 calculation algorithm Methods 0.000 claims description 12
- 238000011068 loading method Methods 0.000 claims description 10
- 238000013507 mapping Methods 0.000 claims description 10
- ACWBQPMHZXGDFX-QFIPXVFZSA-N valsartan Chemical class C1=CC(CN(C(=O)CCCC)[C@@H](C(C)C)C(O)=O)=CC=C1C1=CC=CC=C1C1=NN=NN1 ACWBQPMHZXGDFX-QFIPXVFZSA-N 0.000 claims description 8
- 238000004364 calculation method Methods 0.000 claims description 7
- 238000000638 solvent extraction Methods 0.000 claims description 4
- 238000004590 computer program Methods 0.000 claims description 3
- 238000007781 pre-processing Methods 0.000 abstract description 8
- 238000006243 chemical reaction Methods 0.000 abstract description 5
- 238000013461 design Methods 0.000 abstract description 3
- 238000005457 optimization Methods 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 238000003491 array Methods 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000004793 poor memory Effects 0.000 description 2
- 230000011218 segmentation Effects 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 239000012530 fluid Substances 0.000 description 1
- 230000001788 irregular Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
- G06F9/3887—Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
-
- 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
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/76—Adapting program code to run in a different environment; Porting
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本发明提出一种基于非空列存储的稀疏矩阵向量乘加速方法和装置。本发明通过分析传统稀疏矩阵向量乘法实现在输入稠密向量访存上的局限性,提出并设计了一种在CPU上实现高性能稀疏矩阵向量乘法的新的存储格式。通过预处理阶段对稀疏矩阵向量乘法中的稀疏矩阵进行格式转换,不仅实现了稀疏矩阵向量乘法的高性能,而且实现了在不同CPU上的性能可移植。
Description
技术领域
本发明涉及处理器CPU加速计算技术领域,尤其涉及一种加速处理器CPU执行稀疏矩阵向量乘的方法和装置。
背景技术
稀疏矩阵向量乘(Sparse matrix–vector multiplication,SpMV)一个稀疏矩阵乘以一个稠密向量,是一种在深度学习、流体动力学、图分析和电路仿真等诸多领域中广泛使用的关键计算内核,也是主要性能瓶颈之一。矩阵A的稀疏结构使得对输入向量x的访存不规则,因此SpMV在CPU上的性能往往受内存访问局部性差、向量化效率低和多核负载不均衡等因素的限制。
压缩稀疏行(Compressed Sparse Row,CSR)格式是目前表示稀疏矩阵的最流行和高效的格式之一。CSR格式采用三个数组来存储稀疏矩阵:vals数值数组按行顺序存储所有非零元素的数值,列索引col_id数组记录vals中每个非零元素对应的列索引,行指针row_ptr数组存储每个行的起始和结束位置。在基于CSR的SpMV运算中,vals、col_id、row_ptr以及输出向量y都以顺序流的形式访问,这样可以被数据预取器提前获取,进而隐藏较长的内存访问延迟。而输入x向量(稠密向量)的加载地址由col_id决定,通常是高度随机的,这使得它难以被有效地预取。x[col_id[i]]通常需要采用聚集指令gather进行加载,以便充分利用单指令多数据(Single instruction multipledata,SIMD)向量化指令。但由于其数据访问局部性较差,以及gather指令本身的较高延迟,这个过程往往会导致较大比例的计算流水线停顿。
面向CPU的SpMV优化工作主要集中在以下两个方面:
1)通过调整计算顺序,如缓存分块,来提高数据访问局部性。
2)通过设计新的稀疏矩阵格式来有效利用向量计算单元。
现有的部分工作通过将稀疏矩阵按列划分为与最后一级缓存大小相等的列段,以提高输入向量x的访存局部性。然而,这种方法存在三个问题:(1)将矩阵分成列段对CSR格式不友好,因为在每一行找到每个段的边界需要许多额外的判断和内存访问指令,(2)列段化会使输出向量y的内存访问次数增加到原来的2*NUMseg倍(NUMseg指列段数),(3)跨线程拆分行会引入高开销的原子同步操作。。
在向量化效率方面,英特尔核心数学库(Math Kernel Library,MKL)使用SIMD向量直接计算同一行的值,代码逻辑相对简单,其向量利用率也相对较低。一些先进稀疏矩阵存储格式,沿着列方向执行SIMD,同时根据每行非零元素个数重新排列行,使得相邻行有着相似的非零元素数量进而减少填充零的个数,以追求更高的向量利用率。但重排序行的这种方式导致对输出向量y的乱序访存。为了更充分充分利用SIMD宽度,压缩稀疏行5和面向压缩向量化的稀疏行等存储格式采用复杂的机制填充SIMD通道,这些复杂的计算模式引入了额外的数据结构与计算指令,不可避免地会降低整体计算效率。以上介绍的工作的共同特点是需要采用高开销的gather指令来获取x向量中的元素到向量寄存器中,向量寄存器位于CPU内核中的存储区域。
发明内容
本发明解决了传统稀疏矩阵向量乘时,对输入向量的局访存部性优化引入高开销的原子同步操作以及额外内存访问的问题,以及对输入向量应用gather指令的较高指令延迟问题。
具体来说,本发明提出了一种基于非空列存储的稀疏矩阵向量乘加速方法,其中包括:
步骤1、获取待稀疏矩阵向量乘的稠密向量和稀疏矩阵,该稀疏矩阵的列与该稠密向量具有相同维度,且在计算中该稀疏矩阵的每一列均对应该稠密向量中的一个相关位置处的元素;
步骤2、对该稀疏矩阵按行分块并移除该稀疏矩阵每一行块的空列,得到非空列矩阵,将该稀疏矩阵的列索引数组转换为该非空列矩阵的非空列索引数组存入内存,并移除该稠密向量中与该空列对应的元素,得到压缩向量存入内存;
步骤3、根据该非空列矩阵构建起始元素列索引col_start数组、起始元素数值索引val_start数组、向量布局v_layout数组和向量数行指针v_row_ptr数组;
其中该起始元素列索引col_start数组用于存储该非空列矩阵每个SIMD向量的第一个元素的列索引;该起始元素数值索引val_start数组用于存储每个SIMD向量的第一个元素的vals数组索引;该向量布局v_layout数组用于记录每个SIMD向量的元素分布;该向量数行指针v_row_ptr数组用于存储该非空列矩阵每一行中的SIMD向量组数;
步骤4、根据该向量数行指针v_row_ptr数组确定当前参与向量乘的该非空列矩阵的行;对于每一行的稀疏矩阵元素,根据该向量布局v_layout数组和起始元素值索引val_start数组,得到SIMD向量填充零后的元素分布,将每一SIMD向量中的元素分布顺序排列,以零填充后的矩阵值数组的形式存储在内存中,并最终将稀疏矩阵元素按行以SIMD向量的形式从该内存中取出送到向量寄存器;
步骤5、根据当前SIMD向量的起始元素列索引col_start数组,得到与稀疏矩阵元素所对应的压缩向量元素,将该压缩向量元素从该内存取出送到该向量寄存器;
步骤6、用向量乘法指令完成该向量寄存器内稀疏矩阵元素和对应的压缩向量元素相乘,并在该行最后一个SIMD向量内通过规约指令将相乘结果进行累加,作为该非空列矩阵行的乘加结果;
步骤7、重复该步骤4到步骤6,直到得到该非空列矩阵每一行的乘加结果,作为该稀疏矩阵向量乘的结果。
所述的基于非空列存储的稀疏矩阵向量乘加速方法,其中该步骤2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;
该标志前缀和算法包括:生成维度为该稀疏矩阵列数的位标志数组col_id,该位标志数组col_id在该稀疏矩阵中空列的对应位置存储1,反之存储0;对该位标志数组col_id做前缀和操作,得到结果数组,并将自然数增序数组与该结果数组作差,得到映射数组;该位标志数组col_id通过查找该映射数组中的值,得到该非空列索引数组nec_id。
所述的基于非空列存储的稀疏矩阵向量乘加速方法,其中
该步骤4包括:CPU通过连续加载指令将当前该行的稀疏矩阵元素以SIMD向量的形式从该内存中取出送到向量寄存器;
该步骤5包括:CPU通过连续加载指令将该压缩向量元素从该内存取出送到该向量寄存器。
本发明还提出了一种基于非空列存储的稀疏矩阵向量乘加速装置,其中包括:
模块1,用于获取待稀疏矩阵向量乘的稠密向量和稀疏矩阵,该稀疏矩阵的列与该稠密向量具有相同维度,且在计算中该稀疏矩阵的每一列均对应该稠密向量中的一个相关位置处的元素;
模块2,用于对该稀疏矩阵按行分块并移除该稀疏矩阵每一行块的空列,得到非空列矩阵,将该稀疏矩阵的列索引数组转换为该非空列矩阵的非空列索引数组存入内存,并移除该稠密向量中与该空列对应的元素,得到压缩向量存入内存;
模块3,用于根据该非空列矩阵构建起始元素列索引col_start数组、起始元素数值索引val_start数组、向量布局v_layout数组和向量数行指针v_row_ptr数组;
其中该起始元素列索引col_start数组用于存储该非空列矩阵每个SIMD向量的第一个元素的列索引;该起始元素数值索引val_start数组用于存储每个SIMD向量的第一个元素的vals数组索引;该向量布局v_layout数组用于记录每个SIMD向量的元素分布;该向量数行指针v_row_ptr数组用于存储该非空列矩阵每一行中的SIMD向量组数;
模块4,用于根据该向量数行指针v_row_ptr数组确定当前参与向量乘的该非空列矩阵的行;对于每一行的稀疏矩阵元素,根据该向量布局v_layout数组和起始元素值索引val_start数组,得到SIMD向量填充零后的元素分布,将每一SIMD向量中的元素分布顺序排列,以零填充后的矩阵值数组的形式存储在内存中,并最终将稀疏矩阵元素按行以SIMD向量的形式从该内存中取出送到向量寄存器;
模块5,用于根据当前SIMD向量的起始元素列索引col_start数组,得到与稀疏矩阵元素所对应的压缩向量元素,将该压缩向量元素从该内存取出送到该向量寄存器;
模块6,用于用向量乘法指令完成该向量寄存器内稀疏矩阵元素和对应的压缩向量元素相乘,并在该行最后一个SIMD向量内通过规约指令将相乘结果进行累加,作为该非空列矩阵行的乘加结果;
模块7,用于重复调用该模块4、模块5和模块6,直到得到该非空列矩阵每一行的乘加结果,作为该稀疏矩阵向量乘的结果。
所述的基于非空列存储的稀疏矩阵向量乘加速装置,其中该模块2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;
该标志前缀和算法包括:生成维度为该稀疏矩阵列数的位标志数组col_id,该位标志数组col_id在该稀疏矩阵中空列的对应位置存储1,反之存储0;对该位标志数组col_id做前缀和操作,得到结果数组,并将自然数增序数组与该结果数组作差,得到映射数组;该位标志数组col_id通过查找该映射数组中的值,得到该非空列索引数组nec_id。
所述的基于非空列存储的稀疏矩阵向量乘加速装置,其中
该模块4包括:CPU通过连续加载指令将当前该行的稀疏矩阵元素以SIMD向量的形式从该内存中取出送到向量寄存器;
该模块5包括:CPU通过连续加载指令将该压缩向量元素从该内存取出送到该向量寄存器。
本发明还提出了一种服务器,其中包括所述的一种稀疏矩阵向量乘加速装装置。
本发明还提出了一种存储介质,用于存储一种执行所述稀疏矩阵向量乘加速装方法的计算机程序。
由以上方案可知,本发明的优点在于:
本发明通过分析传统稀疏矩阵向量乘法实现在输入向量x访存上的局限性,提出并设计了一种在CPU上实现高性能稀疏矩阵向量乘法的新的存储格式。
通过预处理阶段对稀疏矩阵向量乘法中的稀疏矩阵进行格式转换,不仅实现了稀疏矩阵向量乘法的高性能,而且实现了在不同CPU上的性能可移植。本稀疏矩阵存储格式已经完成了在主流X86和ARMv8架构的计算平台上的实现和优化。基于性能表现,我们可以得出结论,本发明是一个可移植的稀疏矩阵存储格式,可以用于在主流CPU上构建高性能稀疏矩阵向量乘法。对于新架构,开发人员只需要根据目标机器的硬件参数即可完成格式转换。因此,本发明显著减少了将高性能稀疏矩阵向量乘法应用于新平台的工作量。
附图说明
图1为本发明向量化非空列VNEC格式示意图。
具体实施方式
由于稀疏矩阵的不规则性,SpMV在CPU平台上的性能往往会受到内存访问局部性差和向量化效率低下的约束。现有的面向向量化和访存局部性优化的工作在优化访存局部性的同时,通常会引入高开销的原子同步操作以及额外内存访问,且它们更多关注向量利用率,而忽视部分向量化指令,如gather指令本身的高开销。因此,本发明提出了向量化非空列(Vectorized Non-Empty Column,VNEC)的面向SpMV计算内核的稀疏矩阵存储格式,旨在优化访存局部性和向量化的同时缓解现有的瓶颈。本发明VNEC按行对稀疏矩阵进行分块,并删除每行块中的空列,以提高输入向量的访存局部性,减少第二步零填充的个数,同时避免引发对输出向量访存次数的增加。而后,VNEC还可以通过填充零,以及采用延迟较低的顺序加载指令vload替换高开销gather指令,以保持SIMD高向量利用率的同时降低计算开销。
为了实现上述技术效果,本发明包括如下关键技术点:
关键点1,对稀疏矩阵进行按行分块并删除每行块中的空列,以提高输入向量访存的局部性,减少第二步零填充的数量。
关键点2,在空列去除方法的基础上生成VNEC存储格式,以便通过填充零,以及采用成本较低的顺序加载指令vload按行取数与运算。
为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。本说明书公开了一个或多个包含本发明特点的实施例。公开的实施例仅仅用于举例说明。本发明的保护范围并不限于所公开的实施例,本发明由所附权利要求来限定。
步骤一,通过变换col_id数组,压缩输入向量x,从而去除全零列。
首先,在多核CPU环境下,将稀疏矩阵按行划分为线程数目的行块,为满足负载均衡,采用整行合并路径merge-path算法保证每一行块所包含的行数与非零元素个数之和基本一致。实验表明在实际应用的稀疏矩阵集合中,将稀疏矩阵按照上述方法划分为48个行块后,每个行块平均有高达91.1%的空列(全零列),即每个块平均只访问输入向量x中8.9%的元素。这种情况意味着我们可以通过移除每个块中91.1%的元素来生成一个新的相对于稀疏矩阵更稠密的输入向量,从而确新向量中的每个元素都会被访问。其中划分为48个行块是因为实施例采用的计算平台包含48个物理核,因此可以用48个线程每个线程并行负责一个行块。若采用36个物理核的平台也可划分36行块。这种行块级的粗粒度线程划分策略能够消除在写入输出向量y时的高速缓存伪共享。
其次,我们移除每个行块中的空列,将非空列对应的x拼接为一个名为非空列x(nec_x)的新的输入向量。首个稀疏矩阵的行块访问nec_x的第一段,以此类推。对于某一行块A而言,以上过程如图1的①空列移除部分所示。
最后,为了保证各个列索引与新的输入向量nec_x上各个元素的对应关系与原先保持一致,我们将原始的列索引col_id数组通过本发明提出的标志前缀和算法变换为去除空列后的非零列索引nec_id数组,每个行块共享一个nec_id数组。列索引col_id代表稀疏矩阵A的“第几列”,在计算中与其对应的是图1中A正下方的x中每个元素v的下标,即x中的“第几个元素”。nec_id表示的是非空列矩阵(第一步A空列移除后的矩阵)的“第几列”。nec_id同样对应的是nex_x数组中n的下标,即nec_x的“第几个元素”。
步骤二,将去除空列后的CSR格式转换为VNEC格式。
在去除空列后,CSR格式中矩阵的原始列索引col_id数组被更适合现代微处理器内存层次结构处理的nec_id取代。随后,在预处理阶段将原格式转换为VNEC格式,转换过程如图1的②格式转换部分所示。VNEC格式源自传统的CSR存储格式,包含以下四个数组:
1)起始元素列索引col_start数组存储每个SIMD向量的第一个元素的列索引。
2)起始元素数值索引val_start数组存储每个SIMD向量的第一个元素在CSR格式中vals数组索引。
3)向量布局v_layout数组记录每个SIMD向量中元素的分布。
4)向量数行指针v_row_ptr数组存储每一行中的SIMD向量组数。
当SIMD宽度为4,v_layout辅助数组记录了当前SIMD向量中元素分布的8种情况:其中二进制表示从0B000(只有第一个通道存储非零元素)到0B111(所有四个通道存储非零元素)。根据格式设计原则,第一个通道必须是非空的,因此无需记录。在预处理阶段,val_start和v_layout数组进一步生成零填充后稀疏矩阵的非零元素数组vals_pd,基于零填充的该数组使得稀疏矩阵的非零元素能够与vload指令取出的输入向量元素与原来保持一致。
步骤三,基于VNEC格式的SpMV。
通过步骤一和步骤二的预处理,稀疏矩阵的稀疏模式信息保存在VNEC中。在现实诸多应用场景下,SpMV通常是以稀疏矩阵保持不变而输入向量每次迭代更新的形式执行,因此预处理后的格式能够在后续大量迭代计算中复用,预处理开销也可以得到较好摊销。在预处理得到VNEC格式后,只需采用向量化顺序加载加载vload指令,即可将稀疏矩阵与输入向量(稠密向量)中的元素从高速缓存中打包取出送到CPU向量寄存器,并保证其顺序一一对应,此外,这种去除空列后的访存方式也会提高缓存命中率。
v_row_ptr数组可以控制将每一行乘加操作执行完毕,将向量中的元素规约后输入到所在行的输出向量中。该过程也保证了输出向量的顺序写入。
例如非空列矩阵的第四行与稠密向量nec_x的乘加运算,若串行计算,则y[3]=j*n2+k*n4+l*n5。本方法中,将[j,0,k,l]加载到一个大小为4的向量寄存器中,[n2,n3,n4,n5]对应加载到另一个向量寄存器中。这样用一条向量乘法指令计算后向量寄存器中的元素分别是j*n2,0,k*n4,l*n5。但是为了得到结果y[3],还需要用一条向量规约指令将向量寄存器中的元素累加起来。
关于本发明的技术进步。从访存角度出发,采用现有技术处理图1中A、X相乘会引入高开销的原子同步操作以及额外内存访问;在向量化方面,它们会应用高开销的gather指令加载输入向量X。本申请通过分段空列去除将输入向量压缩为nec_x,极大提高对输入向量访存局部性的同时避免引入高开销的同步栅栏操作或额外的访存开销。此外,这种空列去除方法也可以很大程度上减少生成vals_pd时的零填充个数。在该方法基础上,与vals_pd对应的输入向量x元素能够被延迟较低的连续加载指令vload直接从高速缓存中加载到向量寄存器中。
以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。
本发明还提出了一种基于非空列存储的稀疏矩阵向量乘加速装置,其中包括:
模块1,用于获取待稀疏矩阵向量乘的稠密向量和稀疏矩阵至CPU,该稀疏矩阵的列与该稠密向量具有相同维度,且在计算中该稀疏矩阵的每一列均对应该稠密向量中的一个相关位置处的元素;
模块2,CPU对该稀疏矩阵按行分块并移除该稀疏矩阵每一行块的空列,得到非空列矩阵,将该稀疏矩阵的列索引数组转换为该非空列矩阵的非空列索引数组存入内存,并移除该稠密向量中与该空列对应的元素,得到压缩向量存入内存;
模块3,CPU根据该非空列矩阵构建起始元素列索引col_start数组、起始元素数值索引val_start数组、向量布局v_layout数组和向量数行指针v_row_ptr数组;
其中该起始元素列索引col_start数组用于存储该非空列矩阵每个SIMD向量的第一个元素的列索引;该起始元素数值索引val_start数组用于存储每个SIMD向量的第一个元素的vals数组索引;该向量布局v_layout数组用于记录每个SIMD向量的元素分布;该向量数行指针v_row_ptr数组用于存储该非空列矩阵每一行中的SIMD向量组数;
模块4,CPU根据该向量数行指针v_row_ptr数组确定当前参与向量乘的该非空列矩阵的行;对于每一行的稀疏矩阵元素,根据该向量布局v_layout数组和起始元素值索引val_start数组,得到SIMD向量填充零后的元素分布,将每一SIMD向量中的元素分布顺序排列,以零填充后的矩阵值数组的形式存储在内存中,并最终将稀疏矩阵元素按行以SIMD向量的形式从该内存中取出送到向量寄存器;
模块5,CPU根据当前SIMD向量的起始元素列索引col_start数组,得到与稀疏矩阵元素所对应的压缩向量元素,CPU将该压缩向量元素从该内存取出送到该向量寄存器;
模块6,CPU采用向量乘法指令完成该向量寄存器内稀疏矩阵元素和对应的压缩向量元素相乘,并在该行最后一个SIMD向量内通过规约指令将相乘结果进行累加,作为该非空列矩阵行的乘加结果;
模块7,用于重复调用该模块4、模块5和模块6,直到得到该非空列矩阵每一行的乘加结果,作为CPU执行该稀疏矩阵向量乘的结果。
所述的基于非空列存储的稀疏矩阵向量乘加速装置,其中该模块2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;
该标志前缀和算法包括:生成维度为该稀疏矩阵列数的位标志数组col_id,该位标志数组col_id在该稀疏矩阵中空列的对应位置存储1,反之存储0;对该位标志数组col_id做前缀和操作,得到结果数组,并将自然数增序数组与该结果数组作差,得到映射数组;该位标志数组col_id通过查找该映射数组中的值,得到该非空列索引数组nec_id。
所述的基于非空列存储的稀疏矩阵向量乘加速装置,其中
该模块4包括:CPU通过连续加载指令将当前该行的稀疏矩阵元素以SIMD向量的形式从该内存中取出送到向量寄存器;
该模块5包括:CPU通过连续加载指令将该压缩向量元素从该内存取出送到该向量寄存器。
所述的基于非空列存储的稀疏矩阵向量乘加速方法,其中模块4中该SIMD向量指稀疏矩阵元素分组,分组大小取决于向量寄存器宽度。从该非空列矩阵第一行开始,将第一个矩阵非零元素作为当前SIMD向量的第一个元素,然后根据非空列索引判断下一个非零元素是否包含在当前分组范围内,若在范围中则加入该当前SIMD向量对应位置,其他位置填充零,否则则将下一个非零元素放在下一个SIMD向量的第一个位置处;该非空列矩阵的每一行的首个非零元素均放入一个新开启的SIMD向量。
本发明还提出了一种服务器,其中包括所述的一种稀疏矩阵向量乘加速装装置。
本发明还提出了一种存储介质,用于存储一种执行所述稀疏矩阵向量乘加速装方法的计算机程序。
尽管本发明的实施方案已公开如上,但其并不仅仅限于说明书和实施方式中所列运用,它完全可以被适用于各种适合本发明的领域,对于熟悉本领域的人员而言,可容易地实现另外的修改,因此在不背离权利要求及等同范围所限定的一般概念下,本发明并不限于特定的细节和这里示出与描述的图例。
Claims (8)
1.一种基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,包括:
步骤1、获取待稀疏矩阵向量乘的稠密向量和稀疏矩阵,该稀疏矩阵的列与该稠密向量具有相同维度,且在计算中该稀疏矩阵的每一列均对应该稠密向量中的一个相关位置处的元素;
步骤2、对该稀疏矩阵按行分块并移除该稀疏矩阵每一行块的空列,得到非空列矩阵,将该稀疏矩阵的列索引数组转换为该非空列矩阵的非空列索引数组存入内存,并移除该稠密向量中与该空列对应的元素,得到压缩向量存入内存;
步骤3、根据该非空列矩阵构建起始元素列索引col_start数组、起始元素数值索引val_start数组、向量布局v_layout数组和向量数行指针v_row_ptr数组;
其中该起始元素列索引col_start数组用于存储该非空列矩阵每个SIMD向量的第一个元素的列索引;该起始元素数值索引val_start数组用于存储每个SIMD向量的第一个元素的vals数组索引;该向量布局v_layout数组用于记录每个SIMD向量的元素分布;该向量数行指针v_row_ptr数组用于存储该非空列矩阵每一行中的SIMD向量组数;
步骤4、根据该向量数行指针v_row_ptr数组确定当前参与向量乘的该非空列矩阵的行;对于每一行的稀疏矩阵元素,根据该向量布局v_layout数组和起始元素值索引val_start数组,得到SIMD向量填充零后的元素分布,将每一SIMD向量中的元素分布顺序排列,以零填充后的矩阵值数组的形式存储在内存中,并最终将稀疏矩阵元素按行以SIMD向量的形式从该内存中取出送到向量寄存器;
步骤5、根据当前SIMD向量的起始元素列索引col_start数组,得到与稀疏矩阵元素所对应的压缩向量元素,将该压缩向量元素从该内存取出送到该向量寄存器;
步骤6、用向量乘法指令完成该向量寄存器内稀疏矩阵元素和对应的压缩向量元素相乘,并在该行最后一个SIMD向量内通过规约指令将相乘结果进行累加,作为该非空列矩阵行的乘加结果;
步骤7、重复该步骤4到步骤6,直到得到该非空列矩阵每一行的乘加结果,作为该稀疏矩阵向量乘的结果。
2.如权利要求1所述的基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,该步骤2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;
该标志前缀和算法包括:生成维度为该稀疏矩阵列数的位标志数组col_id,该位标志数组col_id在该稀疏矩阵中空列的对应位置存储1,反之存储0;对该位标志数组col_id做前缀和操作,得到结果数组,并将自然数增序数组与该结果数组作差,得到映射数组;该位标志数组col_id通过查找该映射数组中的值,得到该非空列索引数组nec_id。
3.如权利要求1所述的基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,
该步骤4包括:CPU通过连续加载指令将当前该行的稀疏矩阵元素以SIMD向量的形式从该内存中取出送到向量寄存器;
该步骤5包括:CPU通过连续加载指令将该压缩向量元素从该内存取出送到该向量寄存器。
4.一种基于非空列存储的稀疏矩阵向量乘加速装置,其特征在于,包括:
模块1,用于获取待稀疏矩阵向量乘的稠密向量和稀疏矩阵,该稀疏矩阵的列与该稠密向量具有相同维度,且在计算中该稀疏矩阵的每一列均对应该稠密向量中的一个相关位置处的元素;
模块2,用于对该稀疏矩阵按行分块并移除该稀疏矩阵每一行块的空列,得到非空列矩阵,将该稀疏矩阵的列索引数组转换为该非空列矩阵的非空列索引数组存入内存,并移除该稠密向量中与该空列对应的元素,得到压缩向量存入内存;
模块3,用于根据该非空列矩阵构建起始元素列索引col_start数组、起始元素数值索引val_start数组、向量布局v_layout数组和向量数行指针v_row_ptr数组;
其中该起始元素列索引col_start数组用于存储该非空列矩阵每个SIMD向量的第一个元素的列索引;该起始元素数值索引val_start数组用于存储每个SIMD向量的第一个元素的vals数组索引;该向量布局v_layout数组用于记录每个SIMD向量的元素分布;该向量数行指针v_row_ptr数组用于存储该非空列矩阵每一行中的SIMD向量组数;
模块4,用于根据该向量数行指针v_row_ptr数组确定当前参与向量乘的该非空列矩阵的行;对于每一行的稀疏矩阵元素,根据该向量布局v_layout数组和起始元素值索引val_start数组,得到SIMD向量填充零后的元素分布,将每一SIMD向量中的元素分布顺序排列,以零填充后的矩阵值数组的形式存储在内存中,并最终将稀疏矩阵元素按行以SIMD向量的形式从该内存中取出送到向量寄存器;
模块5,用于根据当前SIMD向量的起始元素列索引col_start数组,得到与稀疏矩阵元素所对应的压缩向量元素,将该压缩向量元素从该内存取出送到该向量寄存器;
模块6,用于用向量乘法指令完成该向量寄存器内稀疏矩阵元素和对应的压缩向量元素相乘,并在该行最后一个SIMD向量内通过规约指令将相乘结果进行累加,作为该非空列矩阵行的乘加结果;
模块7,用于重复调用该模块4、模块5和模块6,直到得到该非空列矩阵每一行的乘加结果,作为该稀疏矩阵向量乘的结果。
5.如权利要求4所述的基于非空列存储的稀疏矩阵向量乘加速装置,其特征在于,该模块2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;
该标志前缀和算法包括:生成维度为该稀疏矩阵列数的位标志数组col_id,该位标志数组col_id在该稀疏矩阵中空列的对应位置存储1,反之存储0;对该位标志数组col_id做前缀和操作,得到结果数组,并将自然数增序数组与该结果数组作差,得到映射数组;该位标志数组col_id通过查找该映射数组中的值,得到该非空列索引数组nec_id。
6.如权利要求4所述的基于非空列存储的稀疏矩阵向量乘加速装置,其特征在于,
该模块4包括:CPU通过连续加载指令将当前该行的稀疏矩阵元素以SIMD向量的形式从该内存中取出送到向量寄存器;
该模块5包括:CPU通过连续加载指令将该压缩向量元素从该内存取出送到该向量寄存器。
7.一种服务器,其特征在于,包括权利要求4-6所述的一种稀疏矩阵向量乘加速装装置。
8.一种存储介质,用于存储一种执行权利要求1-3所述稀疏矩阵向量乘加速装方法的计算机程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311504581.8A CN117539546A (zh) | 2023-11-13 | 2023-11-13 | 基于非空列存储的稀疏矩阵向量乘加速方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311504581.8A CN117539546A (zh) | 2023-11-13 | 2023-11-13 | 基于非空列存储的稀疏矩阵向量乘加速方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117539546A true CN117539546A (zh) | 2024-02-09 |
Family
ID=89783543
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311504581.8A Pending CN117539546A (zh) | 2023-11-13 | 2023-11-13 | 基于非空列存储的稀疏矩阵向量乘加速方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117539546A (zh) |
-
2023
- 2023-11-13 CN CN202311504581.8A patent/CN117539546A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102557589B1 (ko) | 가속화된 수학 엔진 | |
CN114238204B (zh) | 可重构并行处理 | |
CN109543830B (zh) | 一种用于卷积神经网络加速器的拆分累加器 | |
US8463820B2 (en) | System and method for memory bandwidth friendly sorting on multi-core architectures | |
KR20100029179A (ko) | 데이터 압축을 위한 회로 및 그 회로를 채택한 프로세서 | |
KR20210002495A (ko) | 다중 포트 메모리를 포함하는 벡터 레지스터 파일을 갖는 행렬 벡터 곱셈기 | |
US10664552B2 (en) | Stream processing for LU decomposition | |
CN109993293B (zh) | 一种适用于堆叠式沙漏网络的深度学习加速器 | |
US20060253513A1 (en) | Multi-dimensional fast fourier transform | |
Shahbahrami et al. | FPGA implementation of parallel histogram computation | |
CN116842304A (zh) | 一种不规则稀疏矩阵的计算方法及系统 | |
CN117539546A (zh) | 基于非空列存储的稀疏矩阵向量乘加速方法及装置 | |
CN111522776B (zh) | 一种计算架构 | |
Liu et al. | LSRB-CSR: A low overhead storage format for SpMV on the GPU systems | |
Li | Towards efficient hardware acceleration of deep neural networks on fpga | |
WO2020059156A1 (en) | Data processing system, method, and program | |
Jain-Mendon et al. | A case study of streaming storage format for sparse matrices | |
US11669489B2 (en) | Sparse systolic array design | |
US11983616B2 (en) | Methods and apparatus for constructing digital circuits for performing matrix operations | |
CN113642713A (zh) | 一种用于神经网络张量处理器的4d计算装置 | |
CN116029890A (zh) | 一种神经网络增强的图形处理器流水线架构 | |
CN117234592A (zh) | 一种数据加速排序方法、装置、存储介质和电子设备 | |
CN113313251A (zh) | 一种基于数据流架构的深度可分离卷积融合方法及系统 | |
CN113906448A (zh) | 用于在神经网络中提供分块稀疏性的系统和方法 | |
JP5008720B2 (ja) | メモリ間接参照をメモリ直接参照に変換する方法及び装置 |
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 |