用于多个异步传输的 MPI 策略

计算科学 并行计算 软件 mpi
2021-12-13 11:13:36

MPI 中多个重叠异步传输的策略是什么?

我有一个带有几个打开的异步irecv操作的程序。我发现可能发生的传输(对应的isend已被调用)等待其他尚未准备好的传输(对应isend的尚未被调用)。需要明确的是,这种低效率并非源于网络争用;我的网络不必要地空闲。

我的程序如下所示:

机器 1

call irecv(variable A from machine 2)
call irecv(variable B from machine 2)
call irecv(variable C from machine 2)
call wait(variable C from machine 2)
call do_important_work_with(variable C)
....

机器 2

call isend(variable C to machine 1)
call isend(variable B to machine 1)
call do a bunch of costly work
call isend(variable A to machine 1)
....

问题

的转移C似乎被 的转移不必要地阻止了A

我发现机器 1 上的waitonvariable C直到机器 2 上昂贵的工作完成之后才完成。这很不幸,因为这种转移可能在我的程序开始时就开始了。似乎不必要地等待传输A完成。

问题

特别是我有一个如下的计算。

  • 这是预期的吗?
  • 多个重叠异步传输的策略是什么?
  • 在不重新安排我的代码的情况下可以避免这种情况(是否有一些相关的内部设置)?
  • 我应该去哪里了解更多关于 MPI 多次实时转账的政策?
1个回答

标准中不能保证在您实际调用MPI_WAIT. 这是一个完全有效的实现,只需将操作排队,当您调用时MPI_WAIT,所有MPI_ISEND操作都会立即完成。实际上,它们通常倾向于在您进入 MPI 库的任何时候获得进展的机会,如果您启用异步进展线程,它们就有更好的机会在后台进展。

至于签名问题,MPI 保证同一通信器上相同等级的消息将按照它们发送的顺序被接收。

从 MPI 标准 3.0 版开始:

Order Messages are non-overtaking:如果一个发送者连续发送两个消息到同一个目的地,并且都匹配同一个接收,那么如果第一个消息仍然是未决的,那么这个操作就不能接收第二个消息。如果接收者连续发布两个接收,并且都匹配相同的消息,那么如果第一个仍然未决,则该消息不能满足第二个接收操作。

这并没有说明实现如何选择发送消息,但至少它们会以正确的顺序被接收。

我的建议是首先确保您启用了进度线程,然后确保您在真正需要发送消息的地方调用等待(尽管使用进度线程,您很可能会没事)。