CN102033854A - 针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法 - Google Patents
针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法 Download PDFInfo
- Publication number
- CN102033854A CN102033854A CN 201010594672 CN201010594672A CN102033854A CN 102033854 A CN102033854 A CN 102033854A CN 201010594672 CN201010594672 CN 201010594672 CN 201010594672 A CN201010594672 A CN 201010594672A CN 102033854 A CN102033854 A CN 102033854A
- Authority
- CN
- China
- Prior art keywords
- column unit
- train value
- value difference
- zero entry
- array
- 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
Landscapes
- Complex Calculations (AREA)
Abstract
本发明公开一种针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法,存储方法包括A、以给定列单元大小的行数扫描稀疏矩阵,当扫描到非零元时,将该非零元所在列的非零元值存储到非零元数组val中;B、计算列值差,判断非零元列单元列值差类型,将列值差类型相同的列单元作为同一列组并存储列组信息到index数组。SpMV实现方法为:1)根据列值差类型,计算列单元的列值;2)根据列值读取相应的x变量,与val中的元素相乘;3)将列组中每个列单元计算得到的结果进行累加后保存在结果数组中;4)继续读取下一个列组的列值差类型。本发明的方法减少了零元填充,提高稀疏矩阵向量乘实现时的操作和存储访问操作的运行效率。
Description
技术领域
本发明涉及一种改善稀疏矩阵向量乘性能的数据存储方法及SpMV实现方法。
背景技术
稀疏矩阵向量乘(SpMV,y=Ax)是一个十分重要的,且经常被大量调用的计算内核,广泛应用在科学计算、信息检索、气象、航天、油藏模拟、天体物理、数据挖掘等科学计算和实际应用中,而且被重复调用的次数常常会达到成千上万次。但是现代基于Cache存储层次的计算平台上,传统CSR存储的稀疏矩阵向量乘,运行效率往往低于硬件浮点运算峰值的10%。对稀疏矩阵向量乘性能优化,可以大大改善整个工程计算的运行效率。因此优化稀疏矩阵向量乘的性能成为提高工程效率的关键,在实际应用中有着十分重要的意义。
针对稀疏矩阵向量乘的常用存储方法是CSR,其使用3个数组表示一个m×n,含有nnz个非零元的稀疏矩阵:val和colval分别保存每个非零元的取值和列值,rowptr保存每行第一个非零元在val或colval中的索引位置,见图1,其SpMV实现表1:
表1基于CSR存储方法的SpMV操作的代码表
基于CSR的SpMV实现运行效率很低,主要原因是浮点计算操作和存储访问操作比率非常低,稀疏矩阵非零元分布的不规则性导致对x访问的不规则,且每次对x访问都需间接访问colval数组。对x的访问是由非零元在稀疏矩阵的位置决定的,不同应用间使用稀疏矩阵的多样性增大了高效通用SpMV实现的难度。
针对应用矩阵非零元分布的特点,合理优化对x访问,人们提出了很多优化策略。我们分下面4类进行论述。
(1)对矩阵进行分块
Vuduc 2005年设计开发OSKI,利用稠密线性代数库中常用的分块和循环展开的方法(blocking and tiling),使用便于寄存器分块的BCSR存储模式。BCSR与CSR类似,CSR以非零元为存储单位,而BCSR以位置相近的非零元组成的r×c非零元块为存储单位,块中的非零元共享同一个索引信息,见图2。
BCSR为了维持非零元块的结构,需要显示填充零元。填充零元有两个缺点:存取零元需要占用额外的带宽资源;零元的浮点计算需要占用额外的计算资源。为减少非零元的填充,OSKI可以在运行时根据矩阵的信息,动态的选取最优分块大小:在安装时,对具体运行环境不同大小的分块进行运行速率测试,记作PerfDenser×c;同时用非零元填充率衡量填充非零元的数目,即转换成BCSR后非零元的数目与原CSR非零元数目的比值,记作FillRatior×c,该值与运行的具体稀疏矩阵相关,在运行时为节省时间,对矩阵进行抽样计算得到。OSKI对分块大小为r×c的评估函数为:
并选取使评估值最大的分块大小作为最终的分块大小。同时,[Vuduc et al 2002]提出了寄存器分块进行SpMV计算的速率模型。以上过程就是OSKI对任意给定稀疏矩阵,在运行时自适应地实现SpMV的过程。
寄存器分块有减少索引数据的优点,同时在一定程度上重复利用存入寄存器中的x。因此可以将寄存器分块的优点归纳为3点:是一种对索引信息进行的压缩策略,减少了cache与主存的通讯量;在分块的行大小大于1时,同列的非零元与同一个x相乘,使得x重用,这一特点不与分块的列大小相关;分块的列大小仅与稠密线性代数中运用到的循环展开类似,决定在一次循环内部操作的操作次数。但BCSR在存储非零元子块时存在以下限制:
第一,需要索引坐标的行列值必须是分块大小的行列大小的倍数。会导致在原矩阵稠密分块在坐标不对齐,需要填充整列或整行的零元,如图3(a)。
第二,整个稀疏矩阵,使用单一分块大小。原始矩阵小的稠密块必须填充更多的零元去维持分隔块的结构,如图3(b)。
为了进一步减少填充的非零元对SpMV性能的影响,Vuduc在2005年又提出可变分块(VBR),相对于BCSR,VBR可以支持不同的分块大小,进而减少对于矩阵中小的稠密块为维持分块大小较大分块格式而填充零元的数目,同时放宽BCSR中非零元块坐标位置的行列值分别是分块大小r和c整数的限制,采用UBCSR(Unaligned Block Compressed Sparse Row)来存储不同分块大小的子矩阵;Pinar和Heath提出采用矩阵重排的方法,首先对矩阵进行重排序,将非零元分布更为集中,然后再进行分块。为分析BCSR中零元填充的影响,可将零元填充细分为行填充和列填充:当非零元稠密子块中含有非零元的列所含非零元数小于分块的行值时,所需零元填充称作行填充;列填充指当非零元稠密子块列值小于分块列值时,进行的整列零元填充。则图3(b)中有2个零元为行填充,3个零元为列填充。可以认为UBCSR就是在分块行大小确定后,减少列填充,来减少零元填充的数目,同样选择不同行大小的分块以减少行填充的零元数目。
Belgin 2009年提出的方法把非零元块在未填充零元时的非零元分布记作一个Pattern,然后将同一个Pattern的非零元块存储到一个BCSR里,作为原矩阵的一个子矩阵。这样就将原来的矩阵分解成不同Pattern的子矩阵的和,记作PBR(Pattern-based Representation),然后动态的为每一种Pattern实现一种SpMV操作,这样就可以不需要进行零元的填充。但对非零元块大小和Pattern的选取,以及对应Pattern的SpMV实现是一个十分耗时的过程,此过程不是在动态执行阶段进行。
(2)Cache层次优化
以上是从寄存器分块优化的角度进行的SpMV优化,Cache Blocking优化策略也在SpMV中得到应用。Cache Blocking与寄存器分块不同:寄存器分块利用BCSR存储结构减少索引数据,而Cache Blocking是改变访存的次序,来改变访存的局部性进而对SpMV进行加速。但并不是所有矩阵利用Cache Blocking优化技术后都会有加速效果,R.Nishtala在2007指出Cache Blocking有加速效果时,稀疏矩阵需同时满足以下四点:1)x完全不能存入cache中;2)y可以存放入cache中;3)非零元的分布比较零散;4)非零元分布密度足够大,到那时使用寄存器分块后加速效果不明显。并给出了采用Cache Blocking后的性能模型。
(3)利用压缩策略
针对CSR存储格式SpMV实现的浮点计算操作和存储访问操作比率非常低,为缓解访存带宽,提出了一些关于矩阵信息压缩的策略。Willcock 2006年提出了DCSR(Delta-CodedSparse Row)和RPCSR(Row Pattern Compressed Sparse Row)两种存储格式。DCSR是一种面向字节(byte-oriented)的压缩方式,用6个命令字对相邻两个非零元的列值的差进行压缩,每个命令字可以有一参数来存放差值信息,这些命令字在SpMV操作时,可以最多表示4个连续的非零元一起参与计算。RPCSR则将相邻非零元列值的差抽象为一个间隔(interval),然后将一定数量的间隔组合成一组(group),需要在运行时为每一个Group实现具体的SpMV操作,并动态的编译,链接,调用。Kourtis 2008年开发的方法将连续非零元列值的差按存储所需字节的大小分成1byte、2bytes和4bytes,将需要相同字长的非零元存储一个单元,进行索引信息压缩,称该存储格式为CSR-DU。此外,他们发现一些矩阵很多非零元的取值是相同的,这样仅保留这些不同非零元的取值,进而对信息进行压缩。
(4)针对非零元分布特殊性质
此外还有一些根据矩阵特点的优化策略,如J.Mellor-Crummey and J.Garvin 2004年提出的当每行非零元的数目比较少时,可以将矩阵的行按非零元的数目递增排列,然后对相同非零元数目的行进行循环展开处理。若非零元最要集中在对角线上,Vuduc 2003年提出了RSDIAG存储格式,而且在实际SpMV操作时,运用循环展开的优化策略。大量非零元连续分布时,可以仅存起始地址和长度。
随着众核处理器的发展,面向众核的SpMV优化也是一个研究热点。Williams 2007年提出了基于综合的优化策略,其中包括异构Cell处理器。总结了SpMV常用的优化策略:寄存器分块、cache和TLB Blocking、使用向量指令、索引压缩以及软件预取等。
发明内容
本发明针对上述现有技术的缺陷,提出新的针对稀疏矩阵向量乘的优化存储方法,该方法能够继承BCSR的优点,同时可以在一定程度上减少零元填充,从而提高稀疏矩阵向量乘实现时的操作和存储访问操作的运行效率,使稀疏矩阵向量乘在各种实际应用中的耗时减少,效率提高。
本发明的技术方案为:
一种针对稀疏矩阵的数据存储方法,本发明的方法简称为CSRC:
A、以给定列单元大小mrows的行数扫描稀疏矩阵A,当扫描到非零元时,将该非零元所在列的非零元值存储到非零元数组val中;
B、计算该非零元所在列单元与前一列单元的列值差,判断非零元列单元列值差的类型,将列值差类型相同的列单元作为同一列组(Column Group),并存储列组信息到index数组中。mrow行内,含有非零元的一列设为列单元(Column Unit),作为存储单位;mrow值为列单元大小(Colum Unit Size)。
所述列组信息包含列值差类型、列组中的列单元数目和具体列值差取值。在CSRC存储中的列值差类型概括为以下6种:
1)常量1。当列单元连续排列时,列值差为常量1,此时直接存储连续排列的列单元数目,不需要存储列直差值;
2)1byte、2bytes或4bytes。当列单元不连续排列时,列值差类型可用存储列值差所需的字节数来表示,根据所需的字节数细分为1byte、2bytes或4bytes三种情况,此时除了存储包含列单元的数目外,也需要存储具体的列值差;
3)换行。用于描述矩阵中连续多次扫描没有非零元的情况,列单元数目表示连续扫描没有非零元的扫描次数,如以mrows=3扫描,连续扫描了三次没有非零元,总共有9行没有非零元,则列单元数目为3。由于没有非零元,无需存储列值差取值。
4)结束。用于表示整个矩阵存储完毕。当在SpMV操作过程中,碰到此列值差类型便可以退出。
所述扫描新一行时,设初始列单元的列值为0,以便计算该行第一个列单元的列值差。
在CSRC存储方法中,列组信息将被存储在index数组中,其所包含列值差类型、列组中的列单元数目和具体列值差取值在index数组中的排列如下:
1)用一个字节表示列值差类型。在计算机存储中,一个字节包含8个比特位,将列值差的编码如表2所示。表示6种列值差类型,仅需要3个比特位即可,用最低3个比特位(bit0,bit1,bit2)。每行开始的第一个列组,除存储列值差类型外,还需要增加一个换行标识,用于表示新的一行的开始(这里的新一行是指新的一次扫描行),此时将bit3位置为1,否则置为0。之所以增加该标识,而且换行列值差类型可以表示新的一行开始,是因为每次行扫描均有非零元时,每次换行标识都需要一个列组表示,增加了SpMV操作的判断次数。
表2CSRC列值差类型编码位图以及列值差类型的符号表示
2)用一个字节记录列组大小,为了有效利用存储空间,在存储每个列组所包含列单元数目时,计数从0开始。即当列组包含n个列单元时,用数值n-1表示。比如,列组中有1个列单元时用0表示列单元数目,有2个时用1表示,以此类推。
3)具体列值差取值,根据前面讨论根据不同的列值差类型而定。
因此,在CSRC中稀疏矩阵的索引信息就用一个数组存放,用index表示;有另一数组val存储非零元的值。
所述将非零元值存储到非零元数组val,存储方法为:
当一个列单元中的非零元值的个数小于mrows时,进行零元行填充,即按行序进行零填充。
由此看出,在存储非零元时需要填充零元,存在行填充现象。当需要填充大量的零元时,SpMV的运行速率会受到影响。因此,本发明提供另一种存储方法为:
将非零元值按行值的逆序排列的方式存储到非零元数组val中;
将列单元中的非零元的分布位图存储到map数组中,位图中1表示有非零元,0表示没有。
由于mrow的取值不大,实现所有位图表示的SpMV操作是有可能的。这样就可以实现无零元填充。之所以将非零元按行值的逆序排列的方式存储,是为了避免SpMV操作实现所占的空间过大,可以将位图SpMV操作的实现叠加,这样必须将非零元在列单元中按行值的逆序排列。
本发明的另一目的是提供基于上述方法的SpMV实现方法,包括如下步骤:
1、从矩阵A的index数组中读取列组的列值差类型,根据列值差类型,计算该列值差类型对应的列组中每个列单元的列值col;
2、根据每个列单元的列值col读取相应的x变量,将x变量的值与val数组中该列单元的元素分别相乘后,得到变量y的数组<y0,y1,...,ymrows-1>;所述元素为经零元行填充的mrows个元素或由map数组中的分布位图确定的非零元值。经零元行填充的mrows个元素包括非零元值和填充的零元。
3、将列组中每个列单元计算得到的数组<y0,y1,...,ymrows-1>进行累加后保存在结果数组中;
4、继续读取下一个列组的列值差类型,并计算数组<y0,y1,...,ymrows-1>,保存在结果数组中。
所述列值col的计算方法为:
首先判断列值差类型中是否具有换行标识,若有将初始化列值为0;若换行标识无则初始化列值保留原来的值。
然后根据列值差类型在初始化列值的基础上计算当前列单元的列值:
若列值差类型为常量1,列值增加1.
若列值差类型为列单元不连续排列,则从index数组中读取该列单元的列值差值,加上初始化列值,得到当前列单元的列值。
若列值差类型为换行时,列值为0。
但是,由于带有非零元分布位图的存储方法虽然不需要存储额外的零元,但是在SpMV操作时,需要根据位图的值做一次无条件跳转。是否使用位图,需要在运行时根据矩阵行填充时需要填充零元的数目决定。此外,是否需要分布位图以及需要展开次数可以根据样本矩阵进行测试,选取性能最佳的选择。
由于引入列值差类型,当列单元频繁间断时,会导致列组中列单元数目少,使得列组数目过多,导致SpMV操作时,过多地根据列值差类型进行跳转操作。本发明提出的优化操作方法进行列组合并操作,将所含列单元少于设定阈值length-limit的列组与相邻的列组进行合并。合并相邻的列组时,应尽可能地合并相邻的含列单元数目少的列组,并使合并后的索引信息长度尽可能小。合并规则如下,当两个相邻的列单元组所包含列单元数目小于阈值length_limt时,根据两个列组的列组差类型,如果是常量1,1byte,2bytes或4bytes。列值差存储所需字节数小的合并到所需字节数多的列组中去,列值差的存储位数做相应的扩充,并修改列单元所包含列单元的数目。例如,当需要合并列值差类型为1byte和2bytes的数组,需要将1byte的列组合并到2byte的数组中去,除了将原1byte列组所含列单元数目增加到新的2bytes列组中去外,列组差的存储字节也扩充为2bytes.
本发明的存储方法减少了零元填充,提高稀疏矩阵向量乘实现时的操作和存储访问操作的运行效率,使稀疏矩阵向量乘在各种实际应用中的耗时减少,效率提高。
附图说明
图1是现有技术中CSR存储方法形成的存储图;
图2是现有技术中BCSR存储方法中矩阵的分块图;
图3是BCSR存储中进行零元填充形成的矩阵分块图;
图4是本发明的方法形成的存储图;
图5是带有非零元分布位图的存储方法形成的存储图;
图6是利用本发明的存储方法对实施例中的测试矩阵进行SpMV实现的加速效果
具体实施方式
一种针对稀疏矩阵的数据存储方法,简称:
A、以给定列单元大小mrows的行数扫描稀疏矩阵,当扫描到非零元时,将该非零元所在列的非零元值顺序存储到非零元数组val;
B、计算该非零元所在列单元与前一列单元的列值差,判断非零元列单元列值差的类型,将列值差类型相同的列单元作为同一列组并存储列组信息到index数组中。
以mrows=3为例,图1中的稀疏矩阵用本发明的方法进行存储后获得的存储图参见图5,当扫描到出现非零元1、3时,将1、3存储到数组val中,但由于该列只有两个非零元小于3,因此按行序填充零,在数组val中即为1,3,0,这是一个列单元,其他列单元同理。
由于这是新的一行的扫描,设列单元的列值为0,则第一列单元的列值差为1,第二个列单元的列值差为4;这两个列单元为非连续排列的列单元,需要1byte存储,为相同列值差类型,存储在一个列组中,将列组信息存储到index数组中,第一个字节表示列值差类型,即为非连续排列列单元,且需要1byte字节存储,根据表2的编码规则,即为1;第二个字节表示该列组含有列单元的数目,则用1表示两个列单元,即1;第三个字节表示第一列单元的列值差为1;第四个字节表示第二列单元的列值差为4。第二列组信息对应的是数组val中的5,0,0列单元,其列值差为3,存储字节需要1byte,其列值差类型为1byte。由于是新的一行,bit3位置为1,根据表2的编码规则,列值差用9表示,只有一个列单元,列单元数目为0,具体列值差取值为3,所以该列组对应的index数组为9,0,3。而继续扫描可以发现,下面的列单元为三个连续列单元,其列值差类型为常量1,用0表示,包含三个列单元,列单元数目表示为2,不需要存储列值差。当矩阵存储完毕时,以6,0作为列值差类型表示结束。
以mrows=3为例,整个SpMV(y=A×x)的具体实现过程如下:
1.初始化列单元的列值col为0
2.在SpMV操作过程中,将mrows行处理的SpMV结果保留在mrows个临时变量y0~mrows-1中,初始化这些临时变量为0
3.从index数组中读取一个字节,根据CRSC存储格式的定义,该字节为列值差类型。
4.判断该列值差类型是否有换行标识,若有执行第5步,否则执行第6步
5.将mrows个临时变量y0~mrows-1的值保存到结果数组中,并重新将这些临时变量赋值y0~mrows-1为0,初始化列单元列值col为0
6.从index数组中读取一个字节,根据CRSC存储格式的定义,该字节保存改组包含列单元的数目num_colunit,然后根据列值差类型做相应的处理:
a)若为常量1:
根据循环展开的优化策略,每次处理unroll个列单元。在每个列单元的处理过程 中,列单元的列值col每次增加1。根据列值读取相应的x变量,从val数组中取出mrows个元素,并分别与该x变量相乘后,将乘积结果累加到相应的mrows个临时变量y0~mrows-1中。
b)若为1bytes(2bytes或4bytes):
跟常量1唯一不同在于计算列单元的列值时。需要从index数组中读取1字节(2字节,或4字节),然后加到当前列值col中。
c)若为换行:
将mrows个临时变量y0~mrows-1值保存到结果数组中。然后将结果数组中随后(num_colunit-1)×mrows长度个元素赋值0。重新将这些临时变量赋值y0~mrows-1为0,初始化列单元列值col为0
d)若为结束:
将mrows个临时变量y0~mrows-1的值保存到结果数组中,调转到步骤8。
7.跳转到步骤3。
8.整个spmv操作过程结束
上述过程可以用表3的代码来实现。
表3CSRC存储方法的列单元SpMV操作实现代码表
由于需要对稀疏矩阵进行行填充,因此本发明根据填充零的数目选择另一种方法,即带有分布位图的存储方法。
以上述矩阵为例,mrows=3,列单元的非零元没有三个,不进行零填充,而是列单元存储到非零元数组val时按行值的逆序排列的方式存储,即1,3存储为3,1,参见图6。同时,将列单元中的非零元的分布位图存储到另一个数组map数组中,位图中1表示有非零元,0表示没有。对于包含3,1这个列单元,非零元的分布位图的二进制表示为011,非零元1和3分布在最低两位,其值16进制形式为0x3。而index数组没有任何影响,因为分布位图不影响列值差的存储。
将稀疏矩阵的数据进行存储后,仅在列单元的处理过程有变动,如下表4所示。在对列单元操作过程,将操作位图重合部分的SpMV操作重叠。
表4带有非零元分布位图的列单元处理
对于对本发明的存储方法和基于该存储方法进行的操作方法的测试结果,发明人在Quad-Core AMD Opteron(tm)Processor 8378处理器平台上,使用GCC 4.4.2编译器,采用-03编译选项。对表4所给的矩阵进行测试。
表5测试矩阵表
No | name | row | column | nonzero |
1 | af23560 | 23560 | 23560 | 484256 |
2 | raefsky1 | 3242 | 3242 | 293409 |
3 | raefsky2 | 3242 | 3242 | 293551 |
4 | raefsky3 | 21200 | 21200 | 1488768 |
5 | ex11 | 16,614 | 16,614 | 1,096,948 |
测试步骤:
首先,从矩阵文件中将矩阵以通用CSR存储方法读入寄存器。
然后,根据CSRC存储方法的将矩阵转换成不同列单元大小mrow存储稀疏矩阵,然后在具体SpMV操作时,会根据不同的循环展开次数unroll进行操作。同时我们测试是否使用非零元分布位图两种情况下,不同mrow和unroll取值组合下的性能,查看CRSC存储方法能够达到的性能。
下面详细介绍对af23560矩阵采用非零元存储位图,不使用非零元存储位图的比较两种情况下,在分段大小下的加速比。由于在未使用非零元存储位图,我们使用了SSE指令集,由于每条SSE指令处理两个双精度浮点,且在对齐情况下访存效率高,我们仅实行偶数行分段。
表6、使用非零元存储分布位图存储方法的测试结果表
表7、使用不带有分布位图、并使用sse2指令集的存储方法测试结果表
可以看出,对af23560矩阵使用CSRC存储结构后相对于CSR有2.3倍的加速,效果。对表2中的矩阵进行测试后,得到的加速比如图7所示。可以看出CSRC对表2中矩阵的SpMV有加速效果。平均加速比为1.66,最高加速比为2.32,最低有1.13加速。
Claims (10)
1.一种针对稀疏矩阵的数据存储方法,包括下列步骤:
A、以给定列单元大小mrows的行数扫描稀疏矩阵,当扫描到非零元时,将该非零元所在列的非零元值存储到非零元数组val中;
B、计算该非零元所在列单元与前一列单元的列值差,判断非零元列单元列值差类型,将列值差类型相同的列单元作为同一列组并存储列组信息到index数组中。
2.根据权利要求1所述的针对稀疏矩阵的数据存储方法,其特征在于所述将非零元值存储到数组val的方法为:当一个列单元中的非零元值的个数小于mrows时,进行零元行填充。
3.根据权利要求1所述的针对稀疏矩阵的数据存储方法,其特征在于所述将非零元值存储到数组val的方法为:
首先将非零元值按行值的逆序排列方式存储到非零元数组val中;
然后将列单元中的非零元的分布位图存储到map数组中,位图中1表示有非零元,0表示没有。
4.根据权利要求1所述的针对稀疏矩阵的数据存储方法,其特征在于所述列组信息包含列值差类型、列组中的列单元数目和列值差值。
5.根据权利要求4所述的针对稀疏矩阵的数据存储方法,其特征在于列值差类型包括列单元连续排列、列单元不连续排列、换行和结束,列单元连续排列用常量1表示;列单元不连续排列用存储列值差所需的字节数表示,分别为1byte、2bytes或4bytes;换行表示连续多次扫描没有非零元;结束表示矩阵存储完毕。
6.根据权利要求5所述的针对稀疏矩阵的数据存储方法,其特征在于列组信息的存储方法为:
当列值差类型为常量1时,不存储列值差;
当列值差类型为换行时,存储的列单元数目为连续扫描没有非零元的扫描次数,不存储列值差;
当列值差类型为列单元不连续排列时,存储列单元数目,并顺序存储列值差值。
7.根据权利要求6所述的针对稀疏矩阵的数据存储方法,其特征在于列组信息存储到index数组的方法为:
用一个字节存储列值差类型,列值差类型占用最低的三个比特位,第四个比特位存储换行标识表示开始新一行;
用一个字节存储列单元数目,所述列单元有n个时,以n-1表示列单元数目。
8.一种基于稀疏矩阵数据存储方法的SpMV实现方法,包括如下步骤:
1)从矩阵A的index数组中读取列组的列值差类型,根据列值差类型,计算该列值差类型对应的列组中每个列单元的列值col;
2)根据每个列单元的列值col读取相应的x变量,将x变量的值和val数组中该列单元的元素分别相乘后,得到变量y的数组<y0,y1,...,ymrows-1>;所述元素为经零元行填充的mrows个元素或由map数组中的分布位图确定的非零元值;
3)将列组中每个列单元计算得到的数组<y0,y1,...,ymrows-1>进行累加后保存在结果数组中;
4)继续读取下一个列组的列值差类型,并计算数组<y0,y1,...,ymrows-1>,保存在结果数组中。
9.根据权利要求8所述的SpMV实现方法,其特征在于所述列值col的计算方法为:
首先判断列值差类型中是否具有换行标识,若有初始化列值为0;
然后根据列值差类型在初始化列值的基础上计算当前列单元的列值:
若列值差类型为常量1,列值增加1.
若列值差类型为列单元不连续排列,则从index数组中读取该列单元的列值差值加上初始化列值,得到当前列单元的列值。
若列值差类型为换行,列值为0。
10.根据权利要求8所述的SpMV实现方法,其特征在于当列组中的列单元小于设定阈值时,将该列组与相邻列组合并。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010594672 CN102033854A (zh) | 2010-12-17 | 2010-12-17 | 针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010594672 CN102033854A (zh) | 2010-12-17 | 2010-12-17 | 针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102033854A true CN102033854A (zh) | 2011-04-27 |
Family
ID=43886769
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010594672 Pending CN102033854A (zh) | 2010-12-17 | 2010-12-17 | 针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102033854A (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102436438A (zh) * | 2011-12-13 | 2012-05-02 | 华中科技大学 | 基于gpu的稀疏矩阵数据存储方法 |
CN102521463A (zh) * | 2011-12-26 | 2012-06-27 | 杭州电子科技大学 | 一种优化Cache行为提升油藏数值模拟效率的方法 |
CN103336758A (zh) * | 2013-06-29 | 2013-10-02 | 中国科学院软件研究所 | 一种稀疏矩阵的存储方法CSRL及基于该方法的SpMV实现方法 |
CN104317553A (zh) * | 2014-10-13 | 2015-01-28 | 南昌大学 | 一种基于稀疏矩阵技术快速形成及读写电力系统节点导纳矩阵数据的方法 |
CN105786760A (zh) * | 2016-03-02 | 2016-07-20 | 中国地质大学(武汉) | 一种基于稀疏块状矩阵压缩存储结构的预条件共轭梯度区域网平差方法 |
CN106775594A (zh) * | 2017-01-13 | 2017-05-31 | 中国科学院软件研究所 | 一种基于国产申威26010处理器的稀疏矩阵向量乘异构众核实现方法 |
CN108446253A (zh) * | 2018-03-28 | 2018-08-24 | 北京航空航天大学 | 一种针对神威体系架构的稀疏矩阵向量乘的并行计算方法 |
CN109726314A (zh) * | 2019-01-03 | 2019-05-07 | 中国人民解放军国防科技大学 | 基于位图的稀疏矩阵压缩存储方法 |
CN110489428A (zh) * | 2019-08-26 | 2019-11-22 | 上海燧原智能科技有限公司 | 多维稀疏矩阵压缩方法、解压缩方法、装置、设备及介质 |
CN110770722A (zh) * | 2017-06-29 | 2020-02-07 | 北京清影机器视觉技术有限公司 | 二维数据匹配方法、装置和逻辑电路 |
US10558429B2 (en) | 2016-08-24 | 2020-02-11 | International Business Machines Corporation | Switching matrix representation for an incremental algorithm computing connected components |
CN113190791A (zh) * | 2018-08-06 | 2021-07-30 | 华为技术有限公司 | 矩阵的处理方法、装置及逻辑电路 |
CN113794709A (zh) * | 2021-09-07 | 2021-12-14 | 北京理工大学 | 一种用于二值稀疏矩阵的混合编码方法 |
CN113961876A (zh) * | 2017-01-22 | 2022-01-21 | Gsi 科技公司 | 关联存储器设备中的稀疏矩阵乘法 |
CN114491404A (zh) * | 2022-01-28 | 2022-05-13 | 北京理工大学 | 应用于计算设备的混合精度SpMV优化系统及方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2000026764A1 (en) * | 1998-10-30 | 2000-05-11 | Intel Corporation | A computer product and method for sparse matrices |
CN1889367A (zh) * | 2005-06-28 | 2007-01-03 | 松下电器产业株式会社 | 构造稀疏生成矩阵的方法及低密度分组校验码的编码方法 |
CN101089840A (zh) * | 2007-07-12 | 2007-12-19 | 浙江大学 | 基于多fpga的矩阵乘法并行计算系统 |
US20090282207A1 (en) * | 2008-05-06 | 2009-11-12 | L-3 Communications Integrated Systems, L.P. | System & method for storing a sparse matrix |
CN100596029C (zh) * | 2006-10-20 | 2010-03-24 | 北京泰美世纪科技有限公司 | Ldpc码校验矩阵构造方法及利用该方法的编码解码装置 |
-
2010
- 2010-12-17 CN CN 201010594672 patent/CN102033854A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2000026764A1 (en) * | 1998-10-30 | 2000-05-11 | Intel Corporation | A computer product and method for sparse matrices |
CN1889367A (zh) * | 2005-06-28 | 2007-01-03 | 松下电器产业株式会社 | 构造稀疏生成矩阵的方法及低密度分组校验码的编码方法 |
CN100596029C (zh) * | 2006-10-20 | 2010-03-24 | 北京泰美世纪科技有限公司 | Ldpc码校验矩阵构造方法及利用该方法的编码解码装置 |
CN101089840A (zh) * | 2007-07-12 | 2007-12-19 | 浙江大学 | 基于多fpga的矩阵乘法并行计算系统 |
US20090282207A1 (en) * | 2008-05-06 | 2009-11-12 | L-3 Communications Integrated Systems, L.P. | System & method for storing a sparse matrix |
Cited By (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102436438B (zh) * | 2011-12-13 | 2015-03-04 | 华中科技大学 | 基于gpu的稀疏矩阵数据存储方法 |
CN102436438A (zh) * | 2011-12-13 | 2012-05-02 | 华中科技大学 | 基于gpu的稀疏矩阵数据存储方法 |
CN102521463A (zh) * | 2011-12-26 | 2012-06-27 | 杭州电子科技大学 | 一种优化Cache行为提升油藏数值模拟效率的方法 |
CN103336758A (zh) * | 2013-06-29 | 2013-10-02 | 中国科学院软件研究所 | 一种稀疏矩阵的存储方法CSRL及基于该方法的SpMV实现方法 |
CN103336758B (zh) * | 2013-06-29 | 2016-06-01 | 中国科学院软件研究所 | 一种采用带有局部信息的压缩稀疏行的稀疏矩阵存储方法及基于该方法的SpMV实现方法 |
CN104317553B (zh) * | 2014-10-13 | 2017-02-15 | 南昌大学 | 一种基于稀疏矩阵技术快速形成及读写电力系统节点导纳矩阵数据的方法 |
CN104317553A (zh) * | 2014-10-13 | 2015-01-28 | 南昌大学 | 一种基于稀疏矩阵技术快速形成及读写电力系统节点导纳矩阵数据的方法 |
CN105786760A (zh) * | 2016-03-02 | 2016-07-20 | 中国地质大学(武汉) | 一种基于稀疏块状矩阵压缩存储结构的预条件共轭梯度区域网平差方法 |
CN105786760B (zh) * | 2016-03-02 | 2017-02-22 | 中国地质大学(武汉) | 一种基于稀疏块状矩阵压缩存储结构的预条件共轭梯度区域网平差方法 |
US10558429B2 (en) | 2016-08-24 | 2020-02-11 | International Business Machines Corporation | Switching matrix representation for an incremental algorithm computing connected components |
CN106775594A (zh) * | 2017-01-13 | 2017-05-31 | 中国科学院软件研究所 | 一种基于国产申威26010处理器的稀疏矩阵向量乘异构众核实现方法 |
CN106775594B (zh) * | 2017-01-13 | 2019-03-19 | 中国科学院软件研究所 | 一种基于申威26010处理器的稀疏矩阵向量乘异构众核实现方法 |
CN113961876B (zh) * | 2017-01-22 | 2024-01-30 | Gsi 科技公司 | 关联存储器设备中的稀疏矩阵乘法 |
CN113961876A (zh) * | 2017-01-22 | 2022-01-21 | Gsi 科技公司 | 关联存储器设备中的稀疏矩阵乘法 |
CN110770722A (zh) * | 2017-06-29 | 2020-02-07 | 北京清影机器视觉技术有限公司 | 二维数据匹配方法、装置和逻辑电路 |
CN110770722B (zh) * | 2017-06-29 | 2023-08-18 | 北京清影机器视觉技术有限公司 | 二维数据匹配方法、装置和逻辑电路 |
CN108446253A (zh) * | 2018-03-28 | 2018-08-24 | 北京航空航天大学 | 一种针对神威体系架构的稀疏矩阵向量乘的并行计算方法 |
CN108446253B (zh) * | 2018-03-28 | 2021-07-23 | 北京航空航天大学 | 一种针对神威体系架构的稀疏矩阵向量乘的并行计算方法 |
US11250108B2 (en) | 2018-08-06 | 2022-02-15 | Huawei Technologies Co., Ltd. | Matrix processing method and apparatus, and logic circuit |
CN113190791A (zh) * | 2018-08-06 | 2021-07-30 | 华为技术有限公司 | 矩阵的处理方法、装置及逻辑电路 |
US11734386B2 (en) | 2018-08-06 | 2023-08-22 | Huawei Technologies Co., Ltd. | Matrix processing method and apparatus, and logic circuit |
CN109726314A (zh) * | 2019-01-03 | 2019-05-07 | 中国人民解放军国防科技大学 | 基于位图的稀疏矩阵压缩存储方法 |
CN110489428A (zh) * | 2019-08-26 | 2019-11-22 | 上海燧原智能科技有限公司 | 多维稀疏矩阵压缩方法、解压缩方法、装置、设备及介质 |
CN110489428B (zh) * | 2019-08-26 | 2020-05-22 | 上海燧原智能科技有限公司 | 多维稀疏矩阵压缩方法、解压缩方法、装置、设备及介质 |
CN113794709A (zh) * | 2021-09-07 | 2021-12-14 | 北京理工大学 | 一种用于二值稀疏矩阵的混合编码方法 |
CN113794709B (zh) * | 2021-09-07 | 2022-06-24 | 北京理工大学 | 一种用于二值稀疏矩阵的混合编码方法 |
CN114491404A (zh) * | 2022-01-28 | 2022-05-13 | 北京理工大学 | 应用于计算设备的混合精度SpMV优化系统及方法 |
CN114491404B (zh) * | 2022-01-28 | 2022-12-06 | 北京理工大学 | 应用于计算设备的混合精度SpMV优化系统及方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102033854A (zh) | 针对稀疏矩阵的数据存储方法及基于该方法的SpMV实现方法 | |
Deveci et al. | Multithreaded sparse matrix-matrix multiplication for many-core and GPU architectures | |
CN102141976B (zh) | 稀疏矩阵的对角线数据存储方法及基于该方法的SpMV实现方法 | |
CN103336758B (zh) | 一种采用带有局部信息的压缩稀疏行的稀疏矩阵存储方法及基于该方法的SpMV实现方法 | |
Pınar et al. | Fast optimal load balancing algorithms for 1D partitioning | |
KR101196566B1 (ko) | 멀티 프로세서 시스템 및 그 정보처리방법 | |
CN110516316B (zh) | 一种间断伽辽金法求解欧拉方程的gpu加速方法 | |
CN103559148B (zh) | 面向多任务嵌入式系统的片上便笺式存储器管理方法 | |
CN103229180A (zh) | 利用优化地球模型表示进行计算的系统和方法 | |
CN113254241B (zh) | 一种应用于cfd高性能计算的数据跨进程传输方法 | |
US11886347B2 (en) | Large-scale data processing computer architecture | |
CN114491402A (zh) | 一种稀疏矩阵向量乘访存优化的计算方法 | |
CN111783933A (zh) | 一种对深度卷积神经网络计算加速的、结合主存储器的数据载入装置的硬件电路设计及方法 | |
CN117539546A (zh) | 基于非空列存储的稀疏矩阵向量乘加速方法及装置 | |
Zhang et al. | Efficient sparse matrix–vector multiplication using cache oblivious extension quadtree storage format | |
CN115329260A (zh) | 一种基于偏移对角矩阵的Transformer加速器 | |
Durand et al. | A packed memory array to keep moving particles sorted | |
Zhang et al. | Evaluating computational geometry libraries for big spatial data exploration | |
KR20230042052A (ko) | 심층 학습 네트워크의 트레이닝을 가속화하기 위한 시스템 및 방법 | |
CN102867023A (zh) | 一种栅格数据的存储、读取方法及装置 | |
CN116842304A (zh) | 一种不规则稀疏矩阵的计算方法及系统 | |
Dang et al. | Acceleration of frequent itemset mining on FPGA using SDAccel and Vivado HLS | |
Yuan et al. | Optimizing sparse matrix vector multiplication using diagonal storage matrix format | |
CN115081608A (zh) | 基于自适应分配的神经网络加速器实现系统和方法 | |
CN103391104A (zh) | 低密度奇偶校验码ldpc编码处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20110427 |