System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 基于非空列存储的稀疏矩阵向量乘加速方法及装置制造方法及图纸_技高网

基于非空列存储的稀疏矩阵向量乘加速方法及装置制造方法及图纸

技术编号:40421498 阅读:6 留言:0更新日期:2024-02-20 22:40
本发明专利技术提出一种基于非空列存储的稀疏矩阵向量乘加速方法和装置。本发明专利技术通过分析传统稀疏矩阵向量乘法实现在输入稠密向量访存上的局限性,提出并设计了一种在CPU上实现高性能稀疏矩阵向量乘法的新的存储格式。通过预处理阶段对稀疏矩阵向量乘法中的稀疏矩阵进行格式转换,不仅实现了稀疏矩阵向量乘法的高性能,而且实现了在不同CPU上的性能可移植。

【技术实现步骤摘要】

本专利技术涉及处理器cpu加速计算,尤其涉及一种加速处理器cpu执行稀疏矩阵向量乘的方法和装置。


技术介绍

1、稀疏矩阵向量乘(sparse matrix–vector multiplication,spmv)一个稀疏矩阵乘以一个稠密向量,是一种在深度学习、流体动力学、图分析和电路仿真等诸多领域中广泛使用的关键计算内核,也是主要性能瓶颈之一。矩阵a的稀疏结构使得对输入向量x的访存不规则,因此spmv在cpu上的性能往往受内存访问局部性差、向量化效率低和多核负载不均衡等因素的限制。

2、压缩稀疏行(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指令本身的较高延迟,这个过程往往会导致较大比例的计算流水线停顿。

3、面向cpu的spmv优化工作主要集中在以下两个方面:

4、1)通过调整计算顺序,如缓存分块,来提高数据访问局部性。

5、2)通过设计新的稀疏矩阵格式来有效利用向量计算单元。

6、现有的部分工作通过将稀疏矩阵按列划分为与最后一级缓存大小相等的列段,以提高输入向量x的访存局部性。然而,这种方法存在三个问题:(1)将矩阵分成列段对csr格式不友好,因为在每一行找到每个段的边界需要许多额外的判断和内存访问指令,(2)列段化会使输出向量y的内存访问次数增加到原来的2*numseg倍(numseg指列段数),(3)跨线程拆分行会引入高开销的原子同步操作。。

7、在向量化效率方面,英特尔核心数学库(math kernel library,mkl)使用simd向量直接计算同一行的值,代码逻辑相对简单,其向量利用率也相对较低。一些先进稀疏矩阵存储格式,沿着列方向执行simd,同时根据每行非零元素个数重新排列行,使得相邻行有着相似的非零元素数量进而减少填充零的个数,以追求更高的向量利用率。但重排序行的这种方式导致对输出向量y的乱序访存。为了更充分充分利用simd宽度,压缩稀疏行5和面向压缩向量化的稀疏行等存储格式采用复杂的机制填充simd通道,这些复杂的计算模式引入了额外的数据结构与计算指令,不可避免地会降低整体计算效率。以上介绍的工作的共同特点是需要采用高开销的gather指令来获取x向量中的元素到向量寄存器中,向量寄存器位于cpu内核中的存储区域。


技术实现思路

1、本专利技术解决了传统稀疏矩阵向量乘时,对输入向量的局访存部性优化引入高开销的原子同步操作以及额外内存访问的问题,以及对输入向量应用gather指令的较高指令延迟问题。

2、具体来说,本专利技术提出了一种基于非空列存储的稀疏矩阵向量乘加速方法,其中包括:

3、步骤1、获取待稀疏矩阵向量乘的稠密向量和稀疏矩阵,该稀疏矩阵的列与该稠密向量具有相同维度,且在计算中该稀疏矩阵的每一列均对应该稠密向量中的一个相关位置处的元素;

4、步骤2、对该稀疏矩阵按行分块并移除该稀疏矩阵每一行块的空列,得到非空列矩阵,将该稀疏矩阵的列索引数组转换为该非空列矩阵的非空列索引数组存入内存,并移除该稠密向量中与该空列对应的元素,得到压缩向量存入内存;

5、步骤3、根据该非空列矩阵构建起始元素列索引col_start数组、起始元素数值索引val_start数组、向量布局v_layout数组和向量数行指针v_row_ptr数组;

6、其中该起始元素列索引col_start数组用于存储该非空列矩阵每个simd向量的第一个元素的列索引;该起始元素数值索引val_start数组用于存储每个simd向量的第一个元素的vals数组索引;该向量布局v_layout数组用于记录每个simd向量的元素分布;该向量数行指针v_row_ptr数组用于存储该非空列矩阵每一行中的simd向量组数;

7、步骤4、根据该向量数行指针v_row_ptr数组确定当前参与向量乘的该非空列矩阵的行;对于每一行的稀疏矩阵元素,根据该向量布局v_layout数组和起始元素值索引val_start数组,得到simd向量填充零后的元素分布,将每一simd向量中的元素分布顺序排列,以零填充后的矩阵值数组的形式存储在内存中,并最终将稀疏矩阵元素按行以simd向量的形式从该内存中取出送到向量寄存器;

8、步骤5、根据当前simd向量的起始元素列索引col_start数组,得到与稀疏矩阵元素所对应的压缩向量元素,将该压缩向量元素从该内存取出送到该向量寄存器;

9、步骤6、用向量乘法指令完成该向量寄存器内稀疏矩阵元素和对应的压缩向量元素相乘,并在该行最后一个simd向量内通过规约指令将相乘结果进行累加,作为该非空列矩阵行的乘加结果;

10、步骤7、重复该步骤4到步骤6,直到得到该非空列矩阵每一行的乘加结果,作为该稀疏矩阵向量乘的结果。

11、所述的基于非空列存储的稀疏矩阵向量乘加速方法,其中该步骤2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;

12、该标志前缀和算法包括:生成维度为该稀疏矩阵列数的位标志数组col_id,该位标志数组col_id在该稀疏矩阵中空列的对应位置存储1,反之存储0;对该位标志数组col_id做前缀和操作,得到结果数组,并将自然数增序数组与该结果数组作差,得到映射数组;该位标志数组col_id通过查找该映射数组中的值,得到该非空列索引数组nec_id。

13、所述的基于非空列存储的稀疏矩阵向量乘加速方法,其中

14、该步骤4包括:cpu通过连续加载指令将当前该行的稀疏矩阵元素以simd向量的形式从该内存中取出送到向量寄存器;

15、该步骤5包括:cpu通过连续加载指令将该压缩向量元素从该内存取出送到该向量寄存器。

16、本专利技术还提出了一种基于非空列存储的稀疏矩阵向量乘加速装置,其中包括:

17、模块1,用于获取待稀疏矩阵向量乘的稠密向量和稀疏矩阵,该稀疏矩阵的列与该稠密向量具有相同维度,且在计算中该稀疏矩阵的每一列均对应该稠密向量中的一个相关位置处的元素;

18、模块2,用于对该稀疏矩阵按行分块并移除该稀疏矩本文档来自技高网...

【技术保护点】

1.一种基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,包括:

2.如权利要求1所述的基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,该步骤2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;

3.如权利要求1所述的基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,

4.一种基于非空列存储的稀疏矩阵向量乘加速装置,其特征在于,包括:

5.如权利要求4所述的基于非空列存储的稀疏矩阵向量乘加速装置,其特征在于,该模块2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;

6.如权利要求4所述的基于非空列存储的稀疏矩阵向量乘加速装置,其特征在于,

7.一种服务器,其特征在于,包括权利要求4-6所述的一种稀疏矩阵向量乘加速装装置。

8.一种存储介质,用于存储一种执行权利要求1-3所述稀疏矩阵向量乘加速装方法的计算机程序。

【技术特征摘要】

1.一种基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,包括:

2.如权利要求1所述的基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,该步骤2包括:将该稀疏矩阵的列索引数组通过标志位前缀和算法转换为该非空列索引数组;

3.如权利要求1所述的基于非空列存储的稀疏矩阵向量乘加速方法,其特征在于,

4.一种基于非空列存储的稀疏矩阵向量乘加速装置,其特征在于,包括:

5.如权利要求...

【专利技术属性】
技术研发人员:贾海鹏张云泉王麓涵
申请(专利权)人:中国科学院计算技术研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1