[daily paper 5]2023 03 03 2019 54 Efficient SpMV Operation for Large and Highly Sparse Matrices

论文链接

这篇文章是CMU这个大学的人写的,CMU全称Carnegie Mellon University,卡内基·梅隆大学,是坐落于美国宾夕法尼亚州的匹兹堡的私立大学。

本文章提出了一种针对大型高度稀疏矩阵的SpMV算法及硬件结构。高度稀疏(Highly Sparse)指nnz<N,N是长/宽。

这个算法叫做two-step SpMV,第一步是将矩阵切成很多竖直细条,细条的宽度为 d p a g e d_{page} dpage,同时x也这样切,然后每一个细条乘上x的对应部分,得到很多中间稀疏向量;第二步是将中间稀疏向量合并。如下图所示:

Two-Step SpMV

第一步是切割后的A和x相乘,最后得到中间稀疏向量 v 0 . . v n − 1 v^0..v^{n-1} v0..vn1。还有一个点,由于矩阵超稀疏,所以可以用RM-COO(RM表示row major)格式。这一步相对简单,关键在第二步。

中间稀疏向量可能有几千个,每个中间稀疏向量的高度可达千万甚至十亿。该怎么持续地合并?

论文中给出了一种叫Merge Core(MC)的基于二叉树的多路合并网络,它有多个stage,每个stage有…,8,4,2,1个FIFO,每个FIFO里可以存多个数据。每个周期可以输出一个最小的数据出来,如果前后输出的key(在y中的下标)相等,就可以直接合并。这样会不会太慢?对于超稀疏矩阵,nnz的个数小于N,所以并不算慢。但是论文中计算了,如果初始阶段有1024个入口,吞吐量还是有点小,应该多放几个来并行。

MC

多个有序的数组合并,需要先知道某一头的所有元素,所以第一步如果 A 0 . . A n − 1 A^0..A^{n-1} A0..An1这样乘,得乘到 A n − 1 A^{n-1} An1的时候才能开始合并,这样就浪费了大量时间,因为n可能达到几千的数量级。

一个自然的想法是,将矩阵也横着切块:

partitioning lists

不过这样的结构,每个MC需要要快速取中间向量的话(中间向量在内存里),需要配备一个prefetch,一共需要 m × K × d p a g e m\times K\times d_{page} m×K×dpage然而片上内存(on-chip memory)是很宝贵的,这样的方法行不通。为什么一个list需要取 d p a g e d_{page} dpage那么多呢?因为当矩阵很大时,每个list的中间结果是要在内存DRAM中的,内存的存取以 d p a g e d_{page} dpage为单位,如果取的少了,比如只取一个,那还不如不用prefetch。我觉得论文中讲得不够清楚,没有挑明这一点。后面优化的结果是,每个MC对应的list不用 d p a g e d_{page} dpage那么多prefetch,而是要少一些。

文中提出了一种叫Radix Pre-sorter(PRaP)的方法,将中间结果先按照LSB分类,再存入Prefetch Buffer中。如Figure 8所示,最终MC0输出的是0,8,16…这些数。再看Figure 10,我们可以看到有一个"slot for radix 2 & list i",这个slot应该容量不只是一个,我们可以具体算一下,一共K*dpage的容量,K*p个slot,那么每个slot有dpage/p的容量,按dpage=2KB,p=8,key-value对8B算,每个slot可以装32个key-value对。

PRaP

由于输出向量是稠密的,每个MC还有一个机制,比如MC0应该输出0,8,16…这些,如果输出0后直接输出了16,那么MC0-MC7输出的结果会不对齐,所以要补一个8。

insertion of mission keys

由于MC得所有list都有数据(或者得知list没有数据了),才可能有最终输出,所以我推测第一步也应该会将矩阵细条分块,然后x分段和第一行分块挨个乘,然后第二行、三行这样。这样的话乘完第一行就有可能有MC可以输出结果了,这样才符合多路归并的顺序。

后面还有两个Iteration Overlap Optimization和Optimization for Power-law Graphs,对于第一个,有一张图:

ITS SpMV

对于第二个,使用了Bloom Filter(布隆过滤器)探测High Degree Nodes(HDNs)。

总结一下,这篇文章是自己设计了硬件,看了挺长时间,也不知道看明白没。然后就是算法上有一个收获,可以用布隆过滤器探测HDN。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值