MPI有时会卡住。(openmpi多线程)
(首先,我要感谢赫里斯托·伊利耶夫。他在我目前的MPI项目中帮助了我很多。) 问题是MPI_Irecv有时会卡住(卡住概率接近1/2)。我的程序有两万多行。所以我不能在这里列出 它卡住的代码是: MPI id:0MPI有时会卡住。(openmpi多线程),mpi,openmpi,Mpi,Openmpi,(首先,我要感谢赫里斯托·伊利耶夫。他在我目前的MPI项目中帮助了我很多。) 问题是MPI_Irecv有时会卡住(卡住概率接近1/2)。我的程序有两万多行。所以我不能在这里列出 它卡住的代码是: MPI id:0 MPI_Ssend(id=1,tag=1); MPI_Ssend(id=1,tag=x); MPI_Recv(id=1,tag=x+1); MPI id:1 MPI_Recv(id=0,tag=1); pthread_create(fun_A()); void fun_A() {
MPI_Ssend(id=1,tag=1);
MPI_Ssend(id=1,tag=x);
MPI_Recv(id=1,tag=x+1);
MPI id:1
MPI_Recv(id=0,tag=1);
pthread_create(fun_A());
void fun_A()
{
MPI_Recv(id=0,tag=x);
MPI_Ssend(id=0,tag=x+1);
}
为了调试它,我在每个MPI函数之后添加了一些标志。这些标志包括printf和将一些标志写入文件
我的程序的几点如下
1.(重要)当我在一台使用两个内核的机器上运行我的mpi程序时,它是正常的。但当我在两台机器(每台机器使用一个内核)中运行它时,有时在MPI id:1中,会返回MPI_Ssend(id=0,tag=x+1)(和MPI_wait()),但MPI id:0卡在MPI_Recv(id=1,tag=x+1)上
2.(重要)当MPI_Recv(id=1,tag=x+1)时;(MPI id:0)stucks,MPI_id:1中的前2个MPI_函数应该已经完成。但有时根本没有MPI_id:1的标志,有时有MPI id:1的所有3个MPI函数的标志
3.(重要)当发送器线程卡在MPI_Recv(id=1,tag=x+1)时,没有发送器线程;在MPI id中:0
4.vWork在我的程序中用于分叉其他作业。这些作业中不使用MPI函数。这些作业使用消息队列与MPI_comm_world中的线程通信
5.我在配置时启用了多线程支持。MPI_Init_线程(多线程支持)用于初始化MPI。检查它的Ret值
我不知道我的节目是怎么回事。我想:
eth0 Link encap:Ethernet HWaddr 00:21:5E:2F:62:8A
inet addr:10.1.1.113 Bcast:10.1.1.255 Mask:255.255.255.0
inet6 addr: 2001:da8:203:eb1:221:5eff:fe2f:628a/64 Scope:Global
inet6 addr: fe80::221:5eff:fe2f:628a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3402577 errors:0 dropped:0 overruns:0 frame:0
TX packets:208064 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:291778729 (278.2 MiB) TX bytes:25343147 (24.1 MiB)
eth1 Link encap:Ethernet HWaddr 00:21:5E:2F:62:8C
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1770 errors:0 dropped:0 overruns:0 frame:0
TX packets:1770 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:798595 (779.8 KiB) TX bytes:798595 (779.8 KiB)
你能发布你的程序运行的两个节点的网络配置(ifconfig的输出)吗?还有,你到底为什么要立即调用
MPI\u-Isend
和MPI\u-Wait
,这完全等同于调用MPI\u-Send
?同样的情况也适用于MPI\u Irecv
之后的MPI\u Wait
。我添加了ifconfig的输出-我使用MPI\u Isend&MPI\u Wait的原因是我想在每个MPI\u函数之后添加调试标志。通过这种方式,我可以获得有关我的程序当前位置的信息。有时MPI_只将复制数据发送到缓冲区,然后不等待接收方的响应就返回。尝试使用GDB连接到挂起的列组,并检查线程堆栈以查看它们挂起的位置。或者更好的方法是,如果您有权访问TotalView,使用类似于TotalView的并行调试器,因为它使事情变得更简单。