根据文档,MPI_Ssend和MPI_Issend是一个阻塞和非阻塞的发送操作,两者都是同步的。MPI规范指出,当接收方开始接收消息时,同步发送完成,然后更新发送缓冲区是安全的:
函数MPI_WAIT和MPI_TEST用于完成非阻塞通信。发送操作的完成表明,发送方现在可以自由地更新发送缓冲区中的位置(发送操作本身保持发送缓冲区的内容不变)。它并不表示消息已被接收,而是可能已被通信子系统缓冲。但是,如果使用同步模式send,则send操作的完成表明已启动匹配的接收,并且消息最终将通过此匹配的接收来接收。
考虑到同步发送在刚开始接收时被认为已经完成,我不确定以下几点:
MPI_Ssend或MPI_Issend发出发送完成信号时,可能只有一部分数据是从发送缓冲区读取的?例如,第一个N个字节已经发送和接收,而下一个M字节仍在发送。MPI_Issend() 从来没有在本地缓冲数据。发布于 2020-08-02 09:34:18
MPI_Ssend() (或与MPI_Issend()相关的MPI_Wait() )在以下情况下返回:
接收方已开始接收message
如果完全接收到消息,或者MPI库本地缓冲数据,则满足第二个条件。
我没有读到MPI标准禁止数据缓冲。
从标准来看,MPI 3.1 chpt 3.4页37
使用同步模式的发送,无论是否发布了匹配的接收,都可以启动。但是,只有在发送匹配的接收,并且接收操作已开始接收同步发送发送的消息时,发送才能成功完成。因此,同步发送的完成不仅意味着可以重用发送缓冲区,而且还表明接收方在执行过程中已经到达了某个点,即它已经开始执行匹配的接收。如果发送和接收都是阻塞操作,那么同步模式的使用提供了同步通信语义:在两个进程在通信时会合之前,通信在两端都不完成。在此模式下执行的发送是非本地的.
。
https://stackoverflow.com/questions/63214310
复制相似问题