稀疏矩阵与密集矩阵乘法C ++ Tensorflow

时间:2020-07-28 05:32:16

标签: c++ sparse-matrix matrix-multiplication

我想用C ++ Tensorflow稀疏矩阵密集向量(SPMv)乘法编写:y = Ax

稀疏矩阵A以CSR格式存储。 A的通常稀疏度在50-90%之间。目标是达到比密集矩阵密集向量(DMv)乘积更好的时间或类似的时间。

请注意,我已经查看了以下帖子:Q1 Q2 Q3。但是,我仍然想知道以下几点:

  1. SPMv乘法在时间上与DMv相比如何?由于稀疏度较高,因此我认为鉴于操作数量的减少,SPMv应该更好-是吗?
  2. 我应该考虑使SpMv在时间上与DMv相同或更佳的因素?为什么PPL说DMv比SPMv表现更好?存储形式是否有所不同?
  3. 任何建议使用C ++执行SPMv的库都可用于CPU或GPU的实现。

这个问题与我在这里的其他问题有关:(CSCC: Convolution Split Compression Calculation Algorithm for Deep Neural Network

1 个答案:

答案 0 :(得分:2)

要回答已编辑的问题:

  1. 除非矩阵非常稀疏(CPU上的非零值小于10%,GPU上的非零值可能小于1%),否则您可能不会从稀疏中受益。虽然减少了浮点运算的数量,但存储量至少是 double 倍(列或行索引+值),内存访问是不规则的(您可以通过右向的索引进行间接访问,另一方面),向量化(或在GPU上实现合并)变得更加困难,如果并行化,则必须处理行长度不同的事实,因此静态调度可能次优。 li>
  2. 除了以上几点以外,是的,存储表示很重要。例如,COO矩阵存储两个索引和值,而CSR / CSC仅存储一个索引,但需要附加的偏移数组,这使得它们在运行时更加复杂。特别是在GPU上,如果要至少实现 some 合并,存储格式就很重要。本文研究了存储格式如何影响GPU的性能:https://onlinelibrary.wiley.com/doi/full/10.1111/cgf.13957
  3. 对于通用的东西,请在GPU上尝试EigencuSparse。在特定的用例中,还有很多其他的性能更好,但是问题的这一部分并没有明确回答。

除了矩阵格式本身之外,即使矩阵中的条目顺序也会对性能产生重大影响,这就是为什么通常使用Cuthill-McKee算法来减少矩阵带宽(从而提高缓存性能)的原因。