Networking 群集在C中执行简单MPI程序时挂起/显示错误

Networking 群集在C中执行简单MPI程序时挂起/显示错误,networking,network-programming,cluster-computing,mpi,openmpi,Networking,Network Programming,Cluster Computing,Mpi,Openmpi,我正在尝试运行一个简单的MPI程序(多阵列加法),它在我的PC上运行得很好,但只是挂起或在集群中显示以下错误。 我使用openmpi和以下命令来执行 群集的网络配置(主节点和节点1) eth0链路封装:以太网HWaddr 00:22:19:A4:52:74 inet地址:10.1.1.1 Bcast:10.1.255.255掩码:255.255.0.0 inet6地址:fe80::222:19ff:fea4:5274/64范围:链接 上行广播运行多播MTU:1500度量:1 接收数据包:1691

我正在尝试运行一个简单的MPI程序(多阵列加法),它在我的PC上运行得很好,但只是挂起或在集群中显示以下错误。 我使用openmpi和以下命令来执行

群集的网络配置(主节点和节点1)

eth0链路封装:以太网HWaddr 00:22:19:A4:52:74
inet地址:10.1.1.1 Bcast:10.1.255.255掩码:255.255.0.0 inet6地址:fe80::222:19ff:fea4:5274/64范围:链接 上行广播运行多播MTU:1500度量:1 接收数据包:16914错误:0丢弃:0溢出:0帧:0 发送数据包:7183错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:0 接收字节:2050581(1.9兆字节)发送字节:981632(958.6千字节)

eth1链路封装:以太网HWaddr 00:22:19:A4:52:76
inet地址:192.168.41.203 Bcast:192.168.41.255掩码:255.255.255.0 inet6地址:fe80::222:19ff:fea4:5276/64范围:链接 上行广播运行多播MTU:1500度量:1 接收数据包:701错误:0丢弃:0溢出:0帧:0 发送数据包:228错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:0 接收字节:75457(73.6kib)发送字节:25295(24.7kib)

lo Link encap:本地环回
inet地址:127.0.0.1掩码:255.0.0.0 inet6地址:1/128作用域:主机 上行环回运行MTU:16436公制:1 接收数据包:88362错误:0丢弃:0溢出:0帧:0 发送数据包:88362错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:0 接收字节:21529504(20.5 MiB)发送字节:21529504(20.5 MiB)

peth0链路封装:以太网HWaddr 00:22:19:A4:52:74
inet6地址:fe80::222:19ff:fea4:5274/64范围:链接 上行广播运行多播MTU:1500度量:1 接收数据包:17175错误:0丢弃:0溢出:0帧:0 发送数据包:7257错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:1000 接收字节:2373869(2.2 MiB)发送字节:1020320(996.4 KiB) 中断:16内存:da000000-da012800

peth1链路封装:以太网HWaddr 00:22:19:A4:52:76
inet6地址:fe80::222:19ff:fea4:5276/64范围:链接 上行广播运行多播MTU:1500度量:1 接收数据包:1112错误:0丢弃:0溢出:0帧:0 发送数据包:302错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:1000 接收字节:168837(164.8kib)发送字节:33241(32.4kib) 中断:16内存:D60000-d6012800

virbr0链路封装:以太网HWaddr 52:54:00:E3:80:BC
inet地址:192.168.122.1 Bcast:192.168.122.255掩码:255.255.255.0 上行广播运行多播MTU:1500度量:1 接收数据包:0错误:0丢弃:0溢出:0帧:0 发送数据包:0错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:0 接收字节:0(0.0B)发送字节:0(0.0B)

eth0链路封装:以太网HWaddr 00:22:19:53:42:C6
inet地址:10.1.255.253 Bcast:10.1.255.255掩码:255.255.0.0 上行广播运行多播MTU:1500度量:1 接收数据包:16559错误:0丢弃:0溢出:0帧:0 发送数据包:7299错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:0 接收字节:1898811(1.8兆字节)发送字节:1056294(1.0兆字节)

lo Link encap:本地环回
inet地址:127.0.0.1掩码:255.0.0.0 上行环回运行MTU:16436公制:1 接收数据包:25个错误:0丢弃:0溢出:0帧:0 发送数据包:25个错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:0 接收字节:3114(3.0千字节)发送字节:3114(3.0千字节)

peth0链路封装:以太网HWaddr 00:22:19:53:42:C6
上行广播运行多播MTU:1500度量:1 接收数据包:16913错误:0丢弃:0溢出:0帧:0 发送数据包:7276错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:1000 接收字节:2221627(2.1 MiB)发送字节:1076708(1.0 MiB) 中断:16内存:f8000000-f8012800

virbr0链路封装:以太网HWaddr 52:54:00:E7:E5:FF
inet地址:192.168.122.1 Bcast:192.168.122.255掩码:255.255.255.0 上行广播运行多播MTU:1500度量:1 接收数据包:0错误:0丢弃:0溢出:0帧:0 发送数据包:0错误:0丢弃:0溢出:0载波:0 冲突:0 txqueuelen:0 接收字节:0(0.0B)发送字节:0(0.0B)

错误

mpirun -machinefile machine -np 4 ./query
error code:
[[22877,1],0][btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_complete_connect] connect() to 192.168.122.1 failed: Connection refused (111)
代码

#include    <mpi.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#define     group           MPI_COMM_WORLD
#define     root            0
#define     size            100

int main(int argc,char *argv[])
{
int no_tasks,task_id,i;
MPI_Init(&argc,&argv);
MPI_Comm_size(group,&no_tasks);
MPI_Comm_rank(group,&task_id);
int arr1[size],arr2[size],local1[size],local2[size];
if(task_id==root)
{
    for(i=0;i<size;i++)
    {
        arr1[i]=arr2[i]=i;
    }
}
MPI_Scatter(arr1,size/no_tasks,MPI_INT,local1,size/no_tasks,MPI_INT,root,group);
MPI_Scatter(arr2,size/no_tasks,MPI_INT,local2,size/no_tasks,MPI_INT,root,group);
for(i=0;i<size/no_tasks;i++)
{
    local1[i]+=local2[i];
}
MPI_Gather(local1,size/no_tasks,MPI_INT,arr1,size/no_tasks,MPI_INT,root,group);
if(task_id==root)
{       
    printf("The Array Sum Is\n");
    for(i=0;i<size;i++)
    {
        printf("%d  ",arr1[i]);
    }
}
MPI_Finalize();
return 0;
}
#包括
#包括
#包括
#包括
#定义组MPI_COMM_WORLD
#定义根0
#定义大小100
int main(int argc,char*argv[])
{
int no_tasks,task_id,i;
MPI_Init(&argc,&argv);
MPI通信大小(组和无任务);
MPI通信等级(组和任务id);
int arr1[size]、arr2[size]、local1[size]、local2[size];
如果(任务id==根)
{

对于(i=0;i告诉Open MPI不要使用虚拟网桥接口
virbr0
通过TCP/IP发送消息。或者最好告诉它仅使用
eth0
用于以下目的:

$ mpiexec --mca btl_tcp_if_include eth0 ...
这源于OpenMPI的
tcp
BTL组件的贪婪行为,该组件使用tcp/IP传输消息。它尝试使用每个节点上的所有可用网络接口,以最大限度地提高数据带宽。两个节点都使用相同的子网地址配置了
virbr0
。OpenMPI将无法识别两个地址相等,但由于子网匹配,它假定它应该能够通过
virbr0
进行对话。因此进程A试图向位于另一个节点上的进程B发送消息。进程B侦听端口
P
,进程A知道
#include    <mpi.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#define     group           MPI_COMM_WORLD
#define     root            0
#define     size            100

int main(int argc,char *argv[])
{
int no_tasks,task_id,i;
MPI_Init(&argc,&argv);
MPI_Comm_size(group,&no_tasks);
MPI_Comm_rank(group,&task_id);
int arr1[size],arr2[size],local1[size],local2[size];
if(task_id==root)
{
    for(i=0;i<size;i++)
    {
        arr1[i]=arr2[i]=i;
    }
}
MPI_Scatter(arr1,size/no_tasks,MPI_INT,local1,size/no_tasks,MPI_INT,root,group);
MPI_Scatter(arr2,size/no_tasks,MPI_INT,local2,size/no_tasks,MPI_INT,root,group);
for(i=0;i<size/no_tasks;i++)
{
    local1[i]+=local2[i];
}
MPI_Gather(local1,size/no_tasks,MPI_INT,arr1,size/no_tasks,MPI_INT,root,group);
if(task_id==root)
{       
    printf("The Array Sum Is\n");
    for(i=0;i<size;i++)
    {
        printf("%d  ",arr1[i]);
    }
}
MPI_Finalize();
return 0;
}
$ mpiexec --mca btl_tcp_if_include eth0 ...