所以最近,我在研究中开发了一些异步算法。我正在做一些并行性能研究,我一直怀疑我没有正确理解关于各种非阻塞MPI函数的一些细节。
我在这里看到了一些有见地的帖子,即:
MPI: blocking vs non-blocking
MPI Non-blocking Irecv didn't receive data?
有一些事情我不确定或只是想澄清与使用非阻塞功能有关,我认为这将有助于我潜在地提高当前软件的性能。
从MPI 3.0标准的非阻塞通信部分:
非阻塞发送开始调用启动
发送操作,但未完成。在将消息复制到发送缓冲区之外之前,可以返回send start调用。需要单独的send complete调用来完成通信,即验证数据是否已从发送缓冲区中复制出来。使用合适的硬件,可以继续从发送器内存中传输数据
在发送启动后和发送完成之前在发送端进行的计算。
...
如果发送模式是标准的,则发送完成呼叫可以
如果邮件是
缓冲的。另一方面,接收完成可能不完成
直到一个匹配的接收被投递,并且消息被复制到
接收缓冲区。
因此,作为关于MPI_Isend(和类似的MPI_Irecv)的第一组问题,似乎要确保非阻塞发送完成,我需要使用一些机制来检查它是否完成,因为在最坏的情况下,可能没有合适的硬件来同时传输数据,对吧?因此,如果我在非阻塞发送之后从未使用过类似于MPI_TestMPI_Wait的内容,那么MPI_Isend可能永远不会真正发出它的消息,对吧?
这个问题适用于我的一些工作,因为我通过MPI_Isend发送消息,在得到预期的响应消息之前实际上并不测试完整性,因为我想避免MPI_Test调用的开销。虽然这种方法一直有效,但从我的阅读来看,它似乎是错误的。
此外,第二段似乎说,对于标准的非阻塞发送,MPI_Isend,在目标进程调用匹配接收之前,它甚至可能不会开始发送其任何数据。考虑到MPI_Probe/MPI_Iprobe的可用性,这是否意味着MPI_Isend调用将至少发送消息的一些初步元数据,例如大小、源和标记,以便目标进程上的探测函数可以知道消息要发送到那里,从而目标进程可以实际发送相应的接收?
相关的是一个关于探测器的问题。在Probe和Cancel部分,标准规定
MPI_IPROBE(source, tag, comm, flag, status)如果可以接收到与参数flag = truesourcetag提供的模式规格匹配的消息,则返回comm。调用与在程序中的同一点执行的对MPI_RECV(..., source, tag, comm, status)的调用所接收到的消息匹配,并在状态下返回与MPI_RECV()返回的值相同的值。否则,调用返回flag = false,并保持status未定义。
从上面的段落开始,很明显探测将告诉您是否有一个可用的消息可以接收到对应于指定的sourcetagcomm。我的问题是,您是否应该假设成功探测的相应发送的数据实际上尚未传输?
现在,在我看来,在阅读了标准之后,探针所意识到的消息实际上不必是本地进程已经完全接收到的消息。鉴于之前关于标准非阻塞发送的详细信息,在进行探测之后,似乎需要发送一个接收,以确保源非阻塞标准发送将完成,因为有时源发送的大消息MPI不希望复制到某个内部缓冲区,对吧?不管是哪种方式,似乎在探测之后发布接收是如何确保从要发送的相应发送中获得完整数据的。这是对的吗?
后一个问题与代码中的一个实例有关,我正在执行MPI_Iprobe调用,如果成功,我将执行MPI_Recv调用以获取消息。然而,我认为现在这可能是个问题,因为我在想,如果探测成功,那意味着它已经得到了全部信息。这意味着MPI_Recv会运行得很快,因为完整的消息已经在本地内存中的某个地方了。然而,我觉得这是一个错误的假设,现在一些澄清将是有益的。

最佳答案

MPI标准不要求进程线程。这意味着,在通信进行之前,MPI_Isend()可能什么也做不了。大多数MPI子程序都是在后台进行的,MPI_Test()MPI_Wait()MPI_Probe()是最明显的。
恐怕你正在混合进度和同步发送(例如MPI_Ssend())。
MPI_Probe()是本地操作,这意味着它不会与发件人联系,询问是否发送了某些内容,也不会对其进行处理。
在性能方面,您应该尽可能避免意外的消息,这意味着在消息被另一端发送之前,应在一端发送接收消息。
在性能和可移植性之间有一个权衡:
如果要编写可移植代码,则不能假定存在MPI进度线程
如果要在给定的系统上优化应用程序,应尝试使用MPI库,该库在所使用的互连上实现进度线程
请记住,大多数MPI实现(请阅读,这不是MPI标准强制要求的,您不应该依赖它)都会以紧急模式发送小消息。
这意味着,如果消息足够小(足够小取决于MPI实现、如何调整或使用哪种互连),那么MPI_Send()可能会立即返回。

10-07 17:45