您的位置:首页 > 其它

MPI学习-MPI_Sendrecv and MPI_Sendrecv_replace

2015-11-27 11:57 357 查看
死锁现象:点对点通信中存在死锁现象:



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

可以自动实现数据交换,解除死锁问题.

语法规范

int MPI_Sendrecv(
void* send_buf,
int send_count,
MPI_Datatype sendtype,
int dest,/*process rank of destination*/
int sendtag,
void* recv_buf,
int recv_count,
MPI_Datatype recvtype,
int source,/*process rank of source process*/
int recvtag,
MPI_Comm comm,
MPI_Status*status
)


int MPI_Sendrecv_replace(
void* buffer,
int count,
MPI_Datatype sendtype,
int dest,/*process rank of destination*/
int sendtag,
int source,/*process rank of source process*/
int recvtag,
MPI_Comm comm,
MPI_Status*status
)


举例

/**
* 函数MPI_Sendrecv可解除死锁.
*/
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

#define N 65536

int main(int argc, char *argv[])
{
int myrank, dest;
int my_int
, get_int
;
MPI_Status status;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

my_int[0] = (myrank + 1) * (myrank + 1);
dest = (myrank == 0) ? (1) : (0);
/*#if...#endif 为注释*/
#if 0
if (myrank == 0)
{/*进程0先发送再接收信息*/
MPI_Send(my_int, N, MPI_INT, dest, 99, MPI_COMM_WORLD);
MPI_Recv(get_int, N, MPI_INT, dest, 99, MPI_COMM_WORLD, &status);
}
else
{/*其它进程现接收再发送信息*/
MPI_Recv(get_int, N, MPI_INT, dest, 99, MPI_COMM_WORLD, &status);
MPI_Send(my_int, N, MPI_INT, dest, 99, MPI_COMM_WORLD);
}
#endif
/*等同于使用MPI_Sendrecv*/
MPI_Sendrecv(my_int, N, MPI_INT, dest, 99,
get_int, N, MPI_INT, dest, 99, MPI_COMM_WORLD, &status);

printf("myrank %d: my_int = %d, \tget_int = %d\n", myrank,
my_int[0], get_int[0]);

MPI_Finalize();
return 0;
}


进程数为2时输出:



MPI_Sendrecv
将进程0与进程1的数据调换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: