这是一篇比较长的综述,我只挑了一部分来看。
SpMV在GPGPU上的加速,可以大致分为三个方法:
-
使用新的稀疏矩阵格式,基本上是从经典的格式演变而来的
-
已存在的格式对特定硬件架构的优化
-
使用自动调参机制
这些方法不是互斥的。
我不想发明新的稀疏矩阵格式,感觉CSR还是最通用的。后面讲稀疏矩阵格式的基本只看了CSR的部分。
最经典的CSR在GPU上的算子(kernel),一个是scalar,一个是vector。scalar是一行分配一个thread,vector是一行分配一个warp所包含的thread(英伟达GPU上是32个)。
我对CSR的行该怎么在GPU上分配的负载均衡问题,有一定的兴趣。
论文里提到了原来看过的一篇论文,讲的是按NNZ数量分配行,如果分配到的行少于或等于两个,使用vector算子,否则使用scalar算子。我觉得这个方法有点简陋,不知道好不好改进。
还有一篇论文将行按照非零元素数升序排列,然后按照非零元素数将行分配到计算单元里,负载均衡不错。但是排序所需时间可能有点多。
还有一篇叫LightSpMV比较经典,没看过。
后面做了一些实验,总得看起来我觉得还是CSR好一些、更通用。