MPI学习-MPI_Sendrecv and MPI_Sendrecv_replace
2015-11-27 11:57
357 查看
死锁现象:点对点通信中存在死锁现象:
![](http://img.blog.csdn.net/20151126111457680)
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
可以自动实现数据交换,解除死锁问题.
语法规范:
举例:
进程数为2时输出:
![](http://img.blog.csdn.net/20151127115550145)
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的数据调换。
相关文章推荐
- java.lang.NoClassDefFoundError: javax/mail/Address解决方法
- ganglia监控hadoop各项指标含义
- ASP.NET MVC 学习之路由(URL Routing)
- saltstack命令结果return处理
- 接口---interface
- C#比较二个数组并找出相同或不同元素的方法
- 如何让360打开时默认使用极速模式?
- 关于block使用的5点注意事项
- NoSuchMethodError 集合
- drawInRect: withFont: lineBreakMode:弃用
- 让我等菜鸟炸锅的自定义ListView
- android-studio add jar
- Java编写掷骰子游戏
- getResource()函数的路径问题
- 关于蓝桥杯训练题任务目标
- android RadioGroup和RadioButton使用注意
- MAC下用unity进行开发书写中文-Visual Studio Code
- mybatis 使用resultMap实现关联数据的查询(association 和collection )
- 按回车键自动跳到下一个文本框
- java 网络传输