openmp中的立即与同步通信

时间:2014-11-12 07:18:41

标签: asynchronous mpi blocking openmpi

关于同步 - 异步的概念,我在阻塞和放大的背景下略微混淆了。非阻塞操作(在OpenMPI中)从这里开始:

  • link 1MPI_Isend 不一定是异步的(因此可以同步?)

  • link 2MPI_Isend()MPI_Irecv()是MPI的ASYNCHRONOUS通信原语。

我已经完成了之前的同步 - 异步 - 阻塞 - stackoverflow(asynchronous vs non-blocking)上的非阻塞问题,但对我没有任何帮助。 据我所知:

所以&为什么MPI_ISEND可能阻塞(链接1)以及非阻塞(链接2)? 即什么意思是异步&同步MPI_Isend在这里?

关于MPI_Ssend& MPI_Issend,因为MPI_ S 中的 S SEND表示同步(或阻止),并且: -

  • MPI_Ssend :同步发送阻止,直到远程进程收到数据为止。确认 发件人收到,
  • MPI_Issend :表示立即同步发送

I mmediate也是非阻塞的, 那么,MPI_ IS SEND怎么能 S ynchronous&立即退回

我想异步和放大需要更清晰。在阻塞和同步的背景下同步非阻塞OpenMPI通信。 这方面的实际例子或类比将非常有用。

1 个答案:

答案 0 :(得分:11)

MPI函数调用返回(阻塞与非阻塞)和相应操作完成时(标准,同步,缓冲,就绪模式)之间存在区别。

无论操作是否已完成,非阻塞调用MPI_I...都会立即返回。操作在后台继续,或异步。除非操作已完成,否则阻止调用不会返回。非阻塞操作由其句柄表示,可用于执行阻塞等待(MPI_WAIT)或非阻塞测试(MPI_TEST)以完成。

完成操作意味着MPI不再访问所提供的数据缓冲区,因此可以重复使用。在将消息完整地放入网络之后(包括消息的一部分可能仍由网络设备和/或驱动程序缓冲的情况),或者已经在某处缓冲,发送缓冲区可以自由重用。 MPI实施。缓冲的情况不要求接收器发布匹配的接收操作,因此不同步 - 接收可以在很晚的时间发布。除非接收方已发布接收操作,否则阻塞同步发送MPI_SSEND不会返回,因此它会同步两个等级。非阻塞同步发送MPI_ISSEND立即返回,但异步(后台)操作不会完成,除非接收方已发布匹配的接收。

阻塞操作相当于非阻塞操作,紧接着是等待。例如:

MPI_Ssend(buf, len, MPI_TYPE, dest, tag, MPI_COMM_WORLD);

相当于:

MPI_Request req;
MPI_Status status;

MPI_Issend(buf, len, MPI_TYPE, dest, tag, MPI_COMM_WORLD, &req);
MPI_Wait(&req, &status);

标准send(MPI_SEND / MPI_ISEND)在构造消息后完成,并且可以重用作为其第一个参数提供的数据缓冲区。没有同步保证 - 消息可能在本地或远程缓冲。对于大多数实现,通常存在一些大小阈值:在同步发送较长消息的同时,缓冲达到该大小的消息。阈值取决于实现。

缓冲发送始终将消息缓冲到用户提供的中间缓冲区中,实质上执行更复杂的内存复制操作。阻塞(MPI_BSEND)和非阻塞版本(MPI_IBSEND)之间的区别在于前者在所有消息数据都被缓冲之前没有返回。

准备发送是一种非常特殊的操作。只有当发送方发出发送呼叫时,目的地等级已经发布了接收操作,它才能成功完成。它可以通过消除执行某种握手的需要来减少通信延迟。