在MPI标准第3.4节(第37页)中:http://mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf 同步发送完成装置 1.发送缓冲区可以重用 2.接收器已启动以接收数据。
标准说“已经开始”而非“已完成”,所以我对此有疑问:想象一个案例: 发送方调用MPI_Ssend,然后匹配接收方并开始接收数据。此时,发送完成并返回。正如MPI标准所说,发送缓冲区可以重用,因此发送方修改发送缓冲区的一些数据。同时,接收器正在非常缓慢地接收数据(例如网络非常糟糕),那么我们如何保证接收器最终接收的数据与存储在发送器的发送缓冲区中的原始数据相同?
答案 0 :(得分:0)
Ssend是同步的。这意味着Ssend在调用相应的Recv之前无法返回。
Ssend正在阻止。这意味着只有在触摸" send-buffer"时才能返回该函数。
同步和阻止是两回事,我知道这可能会令人困惑。
Send的大部分实现如下(MPICH,OpenMPI,CRAY-MPI):
所以MPI_Send是:阻塞,小信息异步,大信号同步。
Ssend的工作原理如下: 一旦Recv启动并且发送缓冲区被复制或完全在网络中,Ssend就会返回。
应尽可能避免Ssend。因为它减慢了通信速度(由于网络需要告诉发送方已经启动了recv)