设计混合MPI / OpenMP以避免空闲根进程而不阻止从进程发送

时间:2014-09-06 06:34:18

标签: mpi openmp

我是混合并行化的新手,我对设计混合并行化方法有疑问。

我正在多个时间帧上实现计算,每个帧有数百万个点。我使用一个包含6个节点的集群,每个节点有20个线程。我将每个节点分配给仅1个MPI进程,并且它使用20个共享线程。这是我的工作文件的主线

mpiexec -ppn 1 -np 6 -env OMP_NUM_THREADS 20 ./mycode

假设我必须计算60个时间帧。这是我的并行化:

  • 我使用MPI在时间步骤上进行并行化。如果有6个节点有60个时间帧,我可以指定每个节点计算10个时间帧。时间帧计算是独立的,因此除了root进程之外,MPI进程不进行通信。
  • 在每个MPI过程中,应计算10个独立的时间帧。在每个时间范围内, points 使用OpenMP并行化。

我的代码的最终输出是60个数据集,需要在60个单独的文件中写入。节点之间的几乎所有通信都只是将从站的输出结果发送到root。根据根进程是否工作或空闲,我可以通过多种方式设计root和slave:

  1. 在第一个实现中,根进程(节点0)正在进行计算以及从节点(节点1到5),因此每个必须计算10个帧。在所有节点(根节点或从节点)中,10个时间帧中每个节点的输出数据在计算后立即写入文件(如果它在根目录中),或者发送回根节点(如果它是&#39) ; s在slave节点中。)

    显然这是一种错误的方法,因为root忙,root和slave无法满足发送/接收结果,因此它会阻止从属节点在下一帧上进行迭代。例如,从节点2应该等到根完成所有10次计算然后根节点从节点2接收数据,最后节点2移动到下一次计算帧。

  2. 为了避免阻塞,我可以通过将它们保存在MPI的缓冲区上来发回Slave的结果,因此从站可以自由地移动到下一次迭代时间。然而,数据占用了大量内存,在缓冲区之前等待10个巨大的数据集,直到根节点接收到它的工作结束可能不是一个好主意。

  3. 奴隶可以在结束时发送数据而不是在计算数据后立即发送数据,而不是缓冲数据。也就是说,从节点2计算所有10个时间帧而不发送它们。同时根进程几乎同时完成了10帧的计算。最后,所有从节点都将其结果发送到根节点。这是有效的,因为(A)根不空闲,(B)没有堵塞。然而问题是从属节点上的内存是有限的,并且它们不能保持所有10个时间帧结果。最好在计算完成后立即将结果发送回根进程,然后清除内存以进行下一次迭代。

  4. 或者不要将root进程用于任何计算。每个从站必须计算60 /(6-1)= 12个时间帧,并且根节点仅等待接收数据。问题是根节点有20个空闲线程,其中只有一个用于通信,而其他19个线程根本没有使用。

  5. 请您告诉我,在这种情况下,这种混合并行化的最佳设计是什么?是否可以将根节点拆分为1 + 19个线程,第一个线程仅用于接收和写入数据,而其他19个根节点与slave一起执行计算?

    感谢。

0 个答案:

没有答案