mpi 从具有已知等级的进程中检索变量值以进行 mpi_something 调用

计算科学 宠物 mpi
2021-12-24 01:15:27

我需要从我知道的另一个进程等级中获取变量值。这发生在“A x = b”方程的并行求解器的上下文中,秩为 0 的进程知道矩阵 A,而其他进程将该矩阵中的一些值 (i,j) 放入并行求解器的矩阵中数据类型(Petsc 的垫子)。这意味着这些其他进程遍历委托给它们的范围,计算 i 和 j,检索 ij 的元素,并调用 MatSetValue。没有办法避免这种方式 - 它是一种有限差分方法,并且父进程在中心点和相邻点(左、右、上、下)中具有变量值 例如,在 petsc 库中的ex13F90.F中也会发生同样的情况例子。

问题是我不知道从父进程中检索 a_central、a_top、a_bottom、... 值的正确 MPI 子例程。现在我尝试广播它们(MPI_Bcast),但这意味着每个进程都有整个矩阵并且内存不足。

根据下面的答案,这个问题的本质是“我如何进行单一大小的 MPI 通信?”......

2个回答

对于这个问题,一般有以下三种方法:

1/ 如果处理器 P 有一个确定性算法,它需要知道它需要哪些矩阵元素,那么处理器 1 可以重放这个相同的算法来找出处理器 P 需要哪些元素。然后它可以将这些元素发送到处理器 P(和 P 单独,而不是每个人)。

2/ 处理器 P 可以“模拟”它进行计算的算法并记录它需要哪些矩阵元素来完成它的工作。然后它可以将它需要的元素列表发送给处理器 1,处理器 1 可以通过将这些元素发送给 P 来回复。然后 P 可以执行它的算法。

3/ 处理器 P 可以使用“单向”MPI 通信来简单地从处理器 1 的内存中获取数据元素。

  • 第 1 步:破解 PETSc 矩阵对象内部,并在分配数据时添加 MPI_WIN_CREATE 调用。
  • 第 2 步:编写地址转换例程,将矩阵行和列坐标 (i,j) 转换为进程和窗口的远程偏移量 (proc,offset)。非常需要此功能的远程版本。
  • 第 3 步:使用第 2 步中的函数对您的 PETSc 矩阵执行 MPI_{PUT,GET}。这可能最好使用所述矩阵对象的新 API 函数来完成。

对于密集矩阵的情况,您基本上是在实现 Global Arrays 3.0 :-)

如果您想回答您的最终问题(“我如何进行单方面的 MPI 通信”),请就此单独发表一篇文章,以便其他人清楚问题的真正含义。