使用 Eigen 库分块稀疏矩阵
Block Sparse Matrix with Eigen library
我想加快我正在处理的库的速度。大多数矩阵的尺寸都相当小(比如最大 10x40)。大多数是块稀疏的,稀疏模式在 运行 时间已知。我想利用稀疏性来加速线性代数运算。
除了基本的线性代数运算之外,我还使用了 SVD 分解。分块稀疏矩阵有助于检测零列/行和分块对角矩阵,可以减少分解时间。
稀疏矩阵仅按系数而不是按块实现是否有特定原因?
我的意思是,当前的实现对于具有少量非零元素的大型矩阵是有效的,但对于具有相当数量的非零元素和零元素的矩阵则不是。
我查看了 the so-bogus library,它使用 Eigen 库实现了稀疏块矩阵。
对于如此小的矩阵没有太多期望,因为这会减少矢量化机会和指令流水线。您可以通过比较 10x10 矩阵的 triangular matrix * vector
与 full matrix * vector
的性能来自行检查。
然后,关于 SVD,情况更糟,因为对于这么小的矩阵 JacobiSVD
是首选,并且零的结构可能会在第一次扫描期间完全丢失,除非它具有非常特殊的结构可以被利用,就像一个块对角线结构。
我想加快我正在处理的库的速度。大多数矩阵的尺寸都相当小(比如最大 10x40)。大多数是块稀疏的,稀疏模式在 运行 时间已知。我想利用稀疏性来加速线性代数运算。
除了基本的线性代数运算之外,我还使用了 SVD 分解。分块稀疏矩阵有助于检测零列/行和分块对角矩阵,可以减少分解时间。
稀疏矩阵仅按系数而不是按块实现是否有特定原因?
我的意思是,当前的实现对于具有少量非零元素的大型矩阵是有效的,但对于具有相当数量的非零元素和零元素的矩阵则不是。
我查看了 the so-bogus library,它使用 Eigen 库实现了稀疏块矩阵。
对于如此小的矩阵没有太多期望,因为这会减少矢量化机会和指令流水线。您可以通过比较 10x10 矩阵的 triangular matrix * vector
与 full matrix * vector
的性能来自行检查。
然后,关于 SVD,情况更糟,因为对于这么小的矩阵 JacobiSVD
是首选,并且零的结构可能会在第一次扫描期间完全丢失,除非它具有非常特殊的结构可以被利用,就像一个块对角线结构。