行分割稀疏矩阵向量乘法

时间:2019-05-10 12:09:31

标签: c mpi sparse-matrix

我是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循环吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

在1D-稀疏矩阵的行分区中,首先我使用https://sparse.tamu.edu/中的“ mmio.c”从SuiteSparse Matrix Collection(https://math.nist.gov/MatrixMarket/mmio-c.html)中读取了不同的稀疏矩阵,并通过RowWise对该稀疏矩阵进行了分区分成N x(N / p)个矩阵并将这些矩阵分配给不同的进程(p =进程数)。将整个矩阵划分为不同的片段后,我为每个进程简单地创建(N / p)x 1密集向量。

分区结束后,我需要确定哪些进程相互交互,以使非阻塞点对点通信(MPI_Isend和MPI_IRecv)很小。因此,我需要创建一个任务交互图来显示哪些进程相互通信。一个进程可以将其密集向量部分发送给其他使用该密集向量进行局部乘法的进程。同样,一个进程可以从其他进程接收不同的密集矢量部分。例如,确定这些过程后,我获得了这两个相关过程。

示例

进程0

发送受抚养者

过程1 工程5 流程6

接收家属

过程10 流程13

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

最后,我已经实现了稀疏矩阵-密集矢量乘法。