针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法

文档序号:6339100阅读:844来源:国知局
专利名称:针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法
技术领域
本发明涉及一种改善稀疏矩阵向量乘性能的数据存储方法及SpMV实现方法。
技术背景
稀疏矩阵向量乘(SpMV,y = Αχ)是一个十分重要的,且经常被大量调用的计算内 核,广泛应用在科学计算、信息检索、气象、航天、油藏模拟、天体物理、数据挖掘等科学计算 和实际应用中,而且被重复调用的次数常常会达到成千上万次。但是现代基于Cache存储 层次的计算平台上,传统CSR存储的稀疏矩阵向量乘,运行效率往往低于硬件浮点运算峰 值的10%。对稀疏矩阵向量乘性能优化,可以大大改善整个工程计算的运行效率。因此优 化稀疏矩阵向量乘的性能成为提高工程效率的关键,在实际应用中有着十分重要的意义。
针对稀疏矩阵向量乘的常用存储方法是CSR,其使用3个数组表示一个mXn,含有 nnz个非零元的稀疏矩阵val和colval分别保存每个非零元的取值和列值,rowptr保存 每行第一个非零元在val或colval中的索引位置,见

图1,其SpMV实现表1 :
表1基于CSR存储方法的SpMV操作的代码表
权利要求
1.一种针对稀疏矩阵的数据存储方法,包括下列步骤A、以给定列单元大小mrows的行数扫描稀疏矩阵,当扫描到非零元时,将该非零元所 在列的非零元值存储到非零元数组val中;B、计算该非零元所在列单元与前一列单元的列值差,判断非零元列单元列值差类型, 将列值差类型相同的列单元作为同一列组并存储列组信息到index数组中。
2.根据权利要求1所述的针对稀疏矩阵的数据存储方法,其特征在于所述将非零元值 存储到数组val的方法为当一个列单元中的非零元值的个数小于mrows时,进行零元行填 充。
3.根据权利要求1所述的针对稀疏矩阵的数据存储方法,其特征在于所述将非零元值 存储到数组val的方法为首先将非零元值按行值的逆序排列方式存储到非零元数组val中;然后将列单元中的非零元的分布位图存储到map数组中,位图中1表示有非零元,0表 示没有。
4.根据权利要求1所述的针对稀疏矩阵的数据存储方法,其特征在于所述列组信息包 含列值差类型、列组中的列单元数目和列值差值。
5.根据权利要求4所述的针对稀疏矩阵的数据存储方法,其特征在于列值差类型包括 列单元连续排列、列单元不连续排列、换行和结束,列单元连续排列用常量1表示;列单元 不连续排列用存储列值差所需的字节数表示,分别为lbyte、2byteS或4bytes ;换行表示连 续多次扫描没有非零元;结束表示矩阵存储完毕。
6.根据权利要求5所述的针对稀疏矩阵的数据存储方法,其特征在于列组信息的存储 方法为当列值差类型为常量1时,不存储列值差;当列值差类型为换行时,存储的列单元数目为连续扫描没有非零元的扫描次数,不存 储列值差;当列值差类型为列单元不连续排列时,存储列单元数目,并顺序存储列值差值。
7.根据权利要求6所述的针对稀疏矩阵的数据存储方法,其特征在于列组信息存储到 index数组的方法为用一个字节存储列值差类型,列值差类型占用最低的三个比特位,第四个比特位存储 换行标识表示开始新一行;用一个字节存储列单元数目,所述列单元有η个时,以η-1表示列单元数目。
8.一种基于稀疏矩阵数据存储方法的SpMV实现方法,包括如下步骤1)从矩阵A的index数组中读取列组的列值差类型,根据列值差类型,计算该列值差类 型对应的列组中每个列单元的列值col ;2)根据每个列单元的列值col读取相应的χ变量,将χ变量的值和val数组中该列单 元的元素分别相乘后,得到变量y的数组<%,Y1,..., Ymraws-);所述元素为经零元行填充的 mrows个元素或由map数组中的分布位图确定的非零元值;3)将列组中每个列单元计算得到的数组Oc^y1,...,YmrasA进行累加后保存在结果数 组中;4)继续读取下一个列组的列值差类型,并计算数组<%,Υι,...,Ymra^1X保存在结果数组中。
9.根据权利要求8所述的SpMV实现方法,其特征在于所述列值col的计算方法为 首先判断列值差类型中是否具有换行标识,若有初始化列值为O ;然后根据列值差类型在初始化列值的基础上计算当前列单元的列值 若列值差类型为常量1,列值增加1.若列值差类型为列单元不连续排列,则从index数组中读取该列单元的列值差值加上 初始化列值,得到当前列单元的列值。 若列值差类型为换行,列值为O。
10.根据权利要求8所述的SpMV实现方法,其特征在于当列组中的列单元小于设定阈 值时,将该列组与相邻列组合并。
全文摘要
本发明公开一种针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法,存储方法包括A、以给定列单元大小的行数扫描稀疏矩阵,当扫描到非零元时,将该非零元所在列的非零元值存储到非零元数组val中;B、计算列值差,判断非零元列单元列值差类型,将列值差类型相同的列单元作为同一列组并存储列组信息到index数组。SpMV实现方法为1)根据列值差类型,计算列单元的列值;2)根据列值读取相应的x变量,与val中的元素相乘;3)将列组中每个列单元计算得到的结果进行累加后保存在结果数组中;4)继续读取下一个列组的列值差类型。本发明的方法减少了零元填充,提高稀疏矩阵向量乘实现时的操作和存储访问操作的运行效率。
文档编号G06F17/16GK102033854SQ20101059467
公开日2011年4月27日 申请日期2010年12月17日 优先权日2010年12月17日
发明者刘芳芳, 孙相征, 张云泉, 王婷, 袁良 申请人:中国科学院软件研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1