矩阵乘法(Mat*Mat 和 Mat*Vec)是否随非零的数量或矩阵的大小而缩放?或者两者的某种组合。
形状怎么样。
例如,我有一个包含 100 个值的 100 x 100 矩阵,或者一个包含 100 个值的 1000 x 1000 矩阵。
当对这些矩阵进行平方(或将它们乘以具有相似稀疏度的相似矩阵)时,第一个(100x100)是否会比第二个(1000x1000)快?这取决于价值观在哪里?
如果它依赖于实现,我对 PETSc 的答案很感兴趣。
矩阵乘法(Mat*Mat 和 Mat*Vec)是否随非零的数量或矩阵的大小而缩放?或者两者的某种组合。
形状怎么样。
例如,我有一个包含 100 个值的 100 x 100 矩阵,或者一个包含 100 个值的 1000 x 1000 矩阵。
当对这些矩阵进行平方(或将它们乘以具有相似稀疏度的相似矩阵)时,第一个(100x100)是否会比第二个(1000x1000)快?这取决于价值观在哪里?
如果它依赖于实现,我对 PETSc 的答案很感兴趣。
稀疏矩阵向量乘法的成本与非零条目的数量成线性关系,因为每个条目都与向量中的某个条目相乘一次。
稀疏矩阵-矩阵乘法的成本高度依赖于非零的结构。例如,考虑对稀疏矩阵进行平方这是一个箭头结构:
然后拥有非零,但是是稠密的。对这种现象有一个众所周知的图形解释:图中的每条长度为 1 或 2成为图中的一条边(即,一个非零条目)。
首先,它依赖于实现。如果将稀疏矩阵实现为密集矩阵并填充非零,它将随矩阵的整体大小缩放。如果它被存储为非零,它将随着访问时间随矩阵大小而缩放。
在 PETSc 文档中,它解释了稀疏矩阵的默认存储是压缩行存储,它随行数和每行非零值的数量而缩放。因此,我希望 MatMat 可以随该度量的平方进行广泛缩放;IE.
然而,需要注意的一件事是,存储不存在的东西是没有意义的。如果您关心这种性能,为什么要为 1000x1000 矩阵存储 100 个值?这意味着至少 90% 的行/列根本没有非零值,并且可以完全从矩阵中删除。如果非零值的模式没有改变,请考虑从这个矩阵和目标矩阵中删除总是全零的行;它将消除大约 90% 的工作量,使两个矩阵 (100 2 , 1000 2 ) 的性能大致相当。
本文给出了一个完整的SpMV性能模型。它清楚地表明主要限制因素是带宽,尽管您可以通过使用多个向量来减轻负担。之后,您会遇到指令问题限制和我认为未完成的写入指令的限制。