死锁现象:点对点通信中存在死锁现象:
MPI_Send 与MPI_Recv
1.MPI_Send调用返回时表明数据已被发出或被MPI系统复制,随后对发送缓冲区的修改不会改变所发送的数据;
2.MPI_Recv返回时表明数据接收已经完成;
3.让计算和通信重叠进行,通常先等待receive的完成,然后做计算,再等待send的完成。
4.需要采用MPI_Test()检测传输是否结束时;
5.MPI_Send可以以两种不同的方式实现:
- 将消息复制到MPI设置的缓冲区并返回;
- 直到对应的MPI_Recv出现前都阻塞
6.造成死锁的最大因素在于多个进程同时发出消息,再同时接收消息;
- 因为若是每个进程都阻塞在MPI_Send上,则没有程序调用MPI_Recv,程序则会死锁
7.解除死锁可以使一些进程先接收消息再发送消息。
MPI_Sendrecv and MPI_Sendrecv_replace
可以自动实现数据交换,解除死锁问题.
语法规范: