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

时间:2013-03-05 15:40:00

标签: networking network-programming cluster-computing mpi openmpi

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

群集的Netwok配置(master& node1)

        MASTER

eth0链接封装:以太网HWaddr 00:22:19:A4:52:74
          inet addr:10.1.1.1 Bcast:10.1.255.255掩码:255.255.0.0           inet6 addr:fe80 :: 222:19ff:fea4:5274/64范围:链接           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:16914错误:0丢弃:0超限:0帧:0           TX数据包:7183错误:0丢弃:0溢出:0载波:0           碰撞:0 txqueuelen:0           RX字节:2050581(1.9 MiB)TX字节:981632(958.6 KiB)

eth1链接封装:以太网HWaddr 00:22:19:A4:52:76
          inet addr:192.168.41.203 Bcast:192.168.41.255 Mask:255.255.255.0           inet6 addr:fe80 :: 222:19ff:fea4:5276/64范围:链接           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:701错误:0丢弃:0超限:0帧:0           TX数据包:228个错误:0丢弃:0超出:0载波:0           碰撞:0 txqueuelen:0           RX字节:75457(73.6 KiB)TX字节:25295(24.7 KiB)

lo link encap:Local Loopback
          inet addr:127.0.0.1掩码:255.0.0.0           inet6 addr::: 1/128范围:主机           UP LOOPBACK RUNNING MTU:16436公制:1           RX数据包:88362错误:0丢弃:0超限:0帧:0           TX数据包:88362错误:0丢弃:0溢出:0载波:0           碰撞:0 txqueuelen:0           RX字节:21529504(20.5 MiB)TX字节:21529504(20.5 MiB)

peth0链接封装:以太网HWaddr 00:22:19:A4:52:74
          inet6 addr:fe80 :: 222:19ff:fea4:5274/64范围:链接           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:17175错误:0丢弃:0超限:0帧:0           TX数据包:7257错误:0丢弃:0溢出:0载波:0           碰撞:0 txqueuelen:1000           RX字节:2373869(2.2 MiB)TX字节:1020320(996.4 KiB)           中断:16内存:da000000-da012800

peth1链接封装:以太网HWaddr 00:22:19:A4:52:76
          inet6 addr:fe80 :: 222:19ff:fea4:5276/64范围:链接           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:1112错误:0丢弃:0超限:0帧:0           TX数据包:302错误:0丢弃:0超出:0载波:0           碰撞:0 txqueuelen:1000           RX字节:168837(164.8 KiB)TX字节:33241(32.4 KiB)           中断:16内存:d6000000-d6012800

virbr0链接封装:以太网HWaddr 52:54:00:E3:80:BC
          inet addr:192.168.122.1 Bcast:192.168.122.255掩码:255.255.255.0           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:0错误:0丢弃:0超限:0帧:0           TX数据包:0错误:0丢弃:0溢出:0载波:0           碰撞:0 txqueuelen:0           RX字节:0(0.0 b)TX字节:0(0.0 b)

            NODE 1

eth0链接封装:以太网HWaddr 00:22:19:53:42:C6
          inet addr:10.1.255.253 Bcast:10.1.255.255掩码:255.255.0.0           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:16559错误:0丢弃:0超限:0帧:0           TX数据包:7299错误:0丢弃:0超出:0载波:0           碰撞:0 txqueuelen:0           RX字节:1898811(1.8 MiB)TX字节:1056294(1.0 MiB)

lo link encap:Local Loopback
          inet addr:127.0.0.1掩码:255.0.0.0           UP LOOPBACK RUNNING MTU:16436公制:1           RX数据包:25个错误:0丢弃:0超限:0帧:0           TX数据包:25个错误:0丢弃:0溢出:0载波:0           碰撞:0 txqueuelen:0           RX字节:3114(3.0 KiB)TX字节:3114(3.0 KiB)

peth0链接封装:以太网HWaddr 00:22:19:53:42:C6
          UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:16913错误:0丢弃:0超限:0帧:0           TX数据包:7276错误:0丢弃:0溢出:0载波:0           碰撞:0 txqueuelen:1000           RX字节:2221627(2.1 MiB)TX字节:1076708(1.0 MiB)           中断:16内存:f8000000-f8012800

virbr0链接封装:以太网HWaddr 52:54:00:E7:E5:FF
          inet addr:192.168.122.1 Bcast:192.168.122.255掩码:255.255.255.0           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1           RX数据包:0错误:0丢弃:0超限:0帧:0           TX数据包:0错误:0丢弃:0溢出:0载波:0           碰撞:0 txqueuelen:0           RX字节:0(0.0 b)TX字节:0(0.0 b)

错误

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;
}

1 个答案:

答案 0 :(得分:8)

告诉Open MPI不要使用虚拟网桥接口virbr0接口通过TCP / IP发送消息。或者最好告诉它只使用eth0来达到目的:

$ mpiexec --mca btl_tcp_if_include eth0 ...

这来自Open MPI的tcp BTL组件的贪婪行为,该组件使用TCP / IP传输消息。它尝试使用每个节点上的所有可用网络接口,以便最大化数据带宽。两个节点都virbr0配置了相同的子网地址。 Open MPI可以识别两个地址相同,但由于子网匹配,它假设它应该能够通过virbr0进行通信。因此,进程A正在尝试向进程B发送消息,进程B驻留在另一个节点上。进程B侦听端口P,进程A知道这一点,因此它尝试连接到192.168.122.1:P。但这实际上是进程A所在节点上virbr0接口的地址,因此节点尝试在不存在的端口上与自身通信,因此“连接被拒绝”错误。