前言:
上图是BCSR的示例
BCSR是最流行的块稀疏矩阵格式之一。在BCSR中,所有的块都有相同的大小。为了理解这种格式,想象一个块大小为1的稀疏矩阵。在这种情况下,CSR和BCSR矩阵表示是等效的。块大小的增加不会影响列指针数组和行指针数组。相反,它只是扩展了values数组。也就是说,列和行指针数组包含块的值。块连续地存储在值数组中,极大地降低了内存空间需求。
负载划分策略:
这里我们给出两种BSpMV的负载划分策略,这两种策略都是让一个warp来负责进行一个块行与稠密向量单位乘积,都需要进行warp内的规约,不同之处是:策略1是让一个要求一个warp能覆盖整数个完整的块,策略2要求一个warp能够覆盖整数个完整的列。具体如下:
策略1:
上图展示的是策略1对矩阵A的访存模式,以block size = 2为例,因为一个warp(8个线程)要覆盖完整的块,所以每轮迭代可以处理两个完整的块,同一块行剩下的元素需要在下一轮迭代中被访问,伪码如下:
其中r,c分别对应着在block中的行和列
reduce如上图所示
策略2:
上图展示了策略2的访存模式,block size为3。可以看到,因为我们放宽了对warp覆盖完整块的要求,转变为能够覆盖完整列,这样的负载分配策略允许单个warp能够处理更大的block size,并且较策略1,能够减少inactive threads的数目,此时一个warp中的32个线程中有30个线程处于活跃状态(32%3 = 2),伪码如下:
明天任务:研究加入shared memory
研究失败,这玩意sdata赋初值的过程够官方库跑几个来回的了
下一阶段目标:用shf1完成reduce