通过行分区进行稀疏矩阵向量乘法

Sparse Matrix-Vector Multiplication By Row Partitioning

我是 MPI 和并行计算环境的新手。我有来自 https://sparse.tamu.edu/ 的不同稀疏矩阵,我试图通过分别使用 N x N 和 N x 1 大小的行分区将稀疏矩阵与密集向量相乘。我将使用进程数 1、2、4、8、16 测试我的并行 MPI 程序。

我对这个算法做了一些研究,并从这个演示文稿中找到了更好的解决方案和路线图。 https://www.sandia.gov/~mmwolf/presentations/CS591MH/CS591MH_20070913.pdf

算法是这样的;

  1. 首先,为每个进程按行划分整个稀疏矩阵,并对密集向量进行划分。为了内存效率,还存储稀疏矩阵的非零元素。
  2. 在进行任何计算之前,将发送的 x[j] 所需的向量元素发送到具有 j 列中的非零值。
  3. 进行计算并将每一行结果保存在输出向量中。

我不明白如何指定远程进程来发送 x[j]。如果我指定,我如何通过非阻塞发送和接收操作在这些进程之间进行通信?我应该为每个发送操作使用 for 循环吗?

提前致谢。

注意:我解决了如何通过按行分区乘以稀疏矩阵 - 密集向量乘法。

在 1D - Rowwise Partitioning of Sparse Matrix 中,首先我从 SuiteSparse Matrix Collection 中读取了不同的稀疏矩阵(https://sparse.tamu.edu/ ) by using “mmio.c” from https://math.nist.gov/MatrixMarket/mmio-c.html 并通过 RowWise 将该稀疏矩阵划分为 N x (N / p ) 矩阵并分配这些矩阵矩阵到不同的进程(p = 进程数)。将整个矩阵分成不同的部分后,我只需为每个进程创建 (N / p) x 1 个密集向量。

分区结束后,我需要确定哪些进程相互交互以使 non-blocking point-to-point 通信(MPI_Isend 和 MPI_IRecv)较小。出于这个原因,我需要创建一个 task-interaction 图来显示哪些进程与每个 other.A 进程通信可以将其密集向量部分发送到使用此密集向量进行本地乘法的其他进程。此外,一个进程可以从其他进程接收不同的密集向量部分。比如确定了这几个进程后,我得到了这两个依赖进程

示例

进程 0

寄养

进程 1 工序5 流程 6

接收家属

进程 10 流程 13

在查看这些依赖进程时,我在每个进程中使用了两个 for 循环来发送其密集向量部分并通过使用 non-blocking point-to-point 通信从其他进程接收不同的密集向量部分(MPI_Isend 和 MPI_Irecv)。为了等待所有发送和接收请求,我使用了 MPI_Waitall 函数。

作为最后一部分,我实现了稀疏矩阵-稠密向量乘法。