关于同步 - 异步的概念,我在阻塞和放大的背景下略微混淆了。非阻塞操作(在OpenMPI中)从这里开始:
我已经完成了之前的同步 - 异步 - 阻塞 - stackoverflow(asynchronous vs non-blocking)上的非阻塞问题,但对我没有任何帮助。 据我所知:
MPI_Isend
):方法返回&执行下一行 - >非阻塞MPI_Send
):对于大型邮件,它会一直阻止,直到传输完成所以&为什么MPI_ISEND
可能阻塞(链接1)以及非阻塞(链接2)?
即什么意思是异步&同步MPI_Isend
在这里?
关于MPI_Ssend
& MPI_Issend
,因为MPI_ S 中的 S SEND表示同步(或阻止),并且: -
I mmediate也是非阻塞的, 那么,MPI_ IS SEND怎么能 S ynchronous&立即退回我?
我想异步和放大需要更清晰。在阻塞和同步的背景下同步非阻塞OpenMPI通信。 这方面的实际例子或类比将非常有用。
答案 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
)之间的区别在于前者在所有消息数据都被缓冲之前没有返回。
准备发送是一种非常特殊的操作。只有当发送方发出发送呼叫时,目的地等级已经发布了接收操作,它才能成功完成。它可以通过消除执行某种握手的需要来减少通信延迟。