当前位置: 首页 > 知识库问答 >
问题:

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

路昆杰
2023-03-14

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

        MASTER

eth0链路Encap:Ethernet HWaddr 00:22:19:A4:52:74
inet Addr:10.1.1.1 BCAST:10.1.255.255掩码:255.255.0.0inet6 Addr:FE80::222:19FF:FEA4:5274/64作用域:链路运行广播多播MTU:1500度量:1 RX数据包:16914错误:0丢弃:0溢出:0帧:0 TX数据包:7183错误:0丢弃:0溢出:0载波:0冲突:0 TX队列n:0 RX字节:2050581(1.9MiB)TX字节:981632(958.6KiB)

eth1链路Encap:Ethernet HWaddr 00:22:19:A4:52:76
inet ADDR:192.168.41.203 BCAST:192.168.41.255掩码:255.255.255 inet6 ADDR:FE80::222:19FF:FEA4:5276/64作用域:链路运行广播多播MTU:1500度量:1 RX数据包:701错误:0丢弃:0溢出:0帧:0 TX数据包:228错误:0丢弃:0溢出:0载波:0冲突:0 TX队列n:0 RX字节:75457(73.6KiB)TX字节:25295(24.7KiB)

lo链接Encap:本地环回
inet Addr:127.0.0.1掩码:255.0.0.0 inet6 Addr:::1/128作用域:主机上环回运行MTU:16436度量:1 RX数据包:88362错误:0丢弃:0溢出:0帧:0 TX数据包:88362错误:0丢弃:0溢出:0载波:0冲突:0 TX队列n:0 RX字节:21529504(20.5MiB)TX字节:21529504(20.5MiB)

peth0链路封装:以太网HWaddr 00:22:19:A4:52:74
inet6地址:FE80::222:19FF:FEA4:5274/64作用域:链路运行广播多播MTU:1500度量:1 RX数据包:17175错误:0丢弃:0溢出:0帧:0 TX数据包:7257错误:0丢弃:0溢出:0载波:0冲突:0 TX队列:1000 RX字节:2373869(2.2MiB)TX字节:1020320(996.4KiB)中断:16内存:DA000000-DA012800

peth1链路封装:以太网HWaddr 00:22:19:A4:52:76
inet6地址:FE80::222:19FF:FEA4:5276/64作用域:链路运行广播多播MTU:1500度量:1 RX数据包:1112错误:0丢弃:0溢出:0帧:0 TX数据包:302错误:0丢弃:0溢出:0载波:0冲突:0 TX队列:1000 RX字节:168837(164.8KiB)TX字节:33241(32.4KiB)中断:16内存:D6000000-D6012800

virbr0链路Encap:Ethernet HWaddr 52:54:00:E3:80:BC
inet Addr:192.168.122.1BCAST:192.168.122.255掩码:255.255.255.0上行广播运行多播MTU:1500度量:1 RX数据包:0错误:0丢弃:0溢出:0帧:0 TX数据包:0错误:0丢弃:0溢出:0载波:0冲突:0 TX队列:0 RX字节:0(0.0b)TX字节:0(0.0b)

            NODE 1

eth0链路Encap:Ethernet HWaddr 00:22:19:53:42:C6
inet Addr:10.1.255.253 BCAST:10.1.255.255掩码:255.255.0.0上行广播运行多播MTU:1500度量:1 RX数据包:16559错误:0丢弃:0溢出:0帧:0 TX数据包:7299错误:0丢弃:0溢出:0载波:0冲突:0 TX队列n:0 RX字节:1898811(1.8MiB)TX字节:1056294(1.0MiB)

lo链路Encap:本地环回
inet地址:127.0.0.1掩码:255.0.0.0上行环回运行MTU:16436度量:1 RX数据包:25错误:0丢弃:0溢出:0帧:0 TX数据包:25错误:0丢弃:0溢出:0载波:0冲突:0 TX队列n:0 RX字节:3114(3.0KiB)TX字节:3114(3.0KiB)

peth0链路Encap:Ethernet HWaddr 00:22:19:53:42:C6
上行广播运行多播MTU:1500度量:1 RX数据包:16913错误:0丢弃:0溢出:0帧:0 TX数据包:7276错误:0丢弃:0溢出:0载波:0冲突:0 TX队列:1000 RX字节:2221627(2.1MiB)TX字节:1076708(1.0MiB)中断:16内存:F8000000-F8012800

virbr0链路Encap:Ethernet HWaddr 52:54:00:E7:E5:FF
inet Addr:192.168.122.1bcast:192.168.122.255掩码:255.255.255.0上行广播运行多播MTU:1500度量:1 RX数据包:0错误:0丢弃:0溢出:0帧:0 TX数据包:0错误:0丢弃:0溢出:0载波:0冲突:0 TX队列n:0 RX字节:0(0.0b)TX字节: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;
}

共有1个答案

单修德
2023-03-14

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

$ mpiexec --mca btl_tcp_if_include eth0 ...

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

 类似资料:
  • 本文向大家介绍C语言实现简单扫雷小程序,包括了C语言实现简单扫雷小程序的使用技巧和注意事项,需要的朋友参考一下 扫雷是一款大众类的益智小游戏。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。 首先带大家简单来了解一下扫雷的游戏机制: 随便点一个格子,会有一块,上面的数字就代表数字周围八个格子会有几个雷,是1他周围就只有1个雷,2就有两个雷,以此类

  • 本文向大家介绍C语言实现简单三子棋程序,包括了C语言实现简单三子棋程序的使用技巧和注意事项,需要的朋友参考一下 使用C语言实现简单的三子棋程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现。 game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的三子棋程序,首先需要创建一个二维数组,并完成数

  • 我从另一个页面复制了以下JSP代码,但是当我从浏览器查看时,日期不显示。 我已将其保存为。

  • 前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中文网”,如下所示: #include <stdio.h> int main() { puts("C语言中文网"); return 0; } 本节我们就来看看如何通过 Dev C++ 来运行这段代码。 Dev C++ 支持单个源文件的编译,如果你的程序只有一个源文件(初学者基本都是在单个源文件下编写代码),那么不用创建

  • 我将创建一个可以插入并显示到现在的链接: 这是我的初始化函数,只会为第一个

  • 前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中文网”,如下所示: #include <stdio.h> int main(){ puts("C语言中文网"); return 0; } 本节我们就来看看如何通过 VS2015 来运行这段代码。 1) 创建项目(Project)在 VS2015 下开发程序首先要创建项目,不同类型的程序对应不同类型的