【问题标题】:Sparse Matrix-Vector Multiplication By Row Partitioning行分区的稀疏矩阵向量乘法
【发布时间】:2019-09-28 08:30:23
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 这个算法真的需要自己实现吗?如果没有,许多预先存在的、经过验证和优化的并行线性代数库都是可用的,并且可以轻松使用。在这种情况下,请查看提供并行数据结构和并行线性代数算法的 PETSc (mcs.anl.gov/petsc) 或 Trilinos (trilinos.github.io)。
  • 感谢您的回答,但我需要在不使用任何其他库的情况下在 C 中实现此算法。

标签: c mpi sparse-matrix


【解决方案1】:

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

在 1D - Rowwise Partitioning of Sparse Matrix 中,首先我通过使用来自 https://math.nist.gov/MatrixMarket/mmio-c.html 的“mmio.c”从 SuiteSparse Matrix Collection (https://sparse.tamu.edu/) 中读取了不同的稀疏矩阵,并通过 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_Waital 函数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多