MPI有时会卡住。(openmpi多线程)

MPI有时会卡住。(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项目中帮助了我很多。)

问题是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_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值

我不知道我的节目是怎么回事。我想:

  • openMPI中存在错误

  • 配置中有错误

  • 我的程序有错误。(但如果我的程序中有bug,为什么我在使用2个内核的1台机器上运行MPI时可以,但在使用1个内核的2台机器上运行MPI时失败)

  • 谁能给我一些提示吗

    ifconfig-a的输出为: 一个节点ip为10.1.1.112。另一个是10.1.1.113。ifconfig的输出与ip addr完全相同

    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的并行调试器,因为它使事情变得更简单。