Кластер зависает / показывает ошибку при выполнении простой программы MPI на C
Я пытаюсь запустить простую программу MPI (добавление нескольких массивов), она отлично работает на моем ПК, но просто зависает или показывает следующую ошибку в кластере. Я использую Open MPI и следующую команду для выполнения
Конфигурация сети кластера (master & node1)
MASTER
eth0 Link encap:Ethernet HWaddr 00: 22:19: A4: 52: 74
inet addr: 10.1.1.1 Bcast:10.1.255.255 Маска: 255.255.0.0 inet6 адрес: 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 МиБ) байт TX:981632 (958,6 КиБ)
eth1 Link encap:Ethernet HWaddr 00: 22:19: A4: 52: 76
inet addr:192.168.41.203 Bcast:192.168.41.255 Маска: 255.255.255.0 inet6 адрес: 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 КиБ) байт TX:25295 (24,7 КиБ)
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 МиБ) байтов TX:21529504 (20,5 МиБ)
peth0 Link encap:Ethernet HWaddr 00: 22:19: A4: 52: 74
inet6 адрес: fe80::222:19ff:fea4:5274/64 Область:Link UP РАБОТА С ВЕЩАМИ MULTICAST MTU: 1500 Метрика: 1 RX-пакетов: 17175 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0 пакетов TX: 7257 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0 коллизий:0 txqueuelen:1000 байтов RX: 2373869 (2,2 МиБ) байтов TX: 1020320 (996,4 КиБ) Прерывание: 16 Память: da000000-da012800
peth1 Link encap:Ethernet HWaddr 00: 22:19: A4: 52: 76
inet6 адрес: 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 КиБ) байтов TX: 33241 (32,4 КиБ) Прерывание: 16 Память: d6000000-d6012800
virbr0 Link encap:Ethernet 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 Link encap:Ethernet 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 МиБ) TX байтов:1056294 (1,0 МиБ)
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 КиБ) байтов TX:3114 (3,0 КиБ)
peth0 Link encap:Ethernet HWaddr 00: 22:19: 53: 42: C6
ВВЕРХ РАДИОВЕЩАНИЕ РАБОТАЕТ MULTICAST MTU: 1500 Метрика: 1 пакеты RX: 16913 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0 пакетов TX: 7276 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0 коллизий:0 txqueuelen:1000 RX байтов: 2221627 (2,1 МиБ) TX байт: 1076708 (1,0 МиБ) Прерывание: 16 Память: f8000000-f8012800
virbr0 Link encap:Ethernet 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 ответ
Скажите Open MPI не использовать интерфейс виртуального моста virbr0
интерфейс для отправки сообщений по TCP/IP. Или лучше скажи это использовать только eth0
с целью:
$ mpiexec --mca btl_tcp_if_include eth0 ...
Это происходит от жадного поведения Open MPI tcp
Компонент BTL, который передает сообщения с использованием TCP/IP. Он пытается использовать все доступные сетевые интерфейсы на каждом узле, чтобы максимизировать пропускную способность данных. Оба узла имеют virbr0
настроен с тем же адресом подсети. Открытый MPI падает, чтобы признать, что оба адреса равны, но, поскольку подсети совпадают, он предполагает, что он должен иметь возможность обмениваться данными virbr0
, Таким образом, процесс A пытается отправить сообщение процессу B, который находится на другом узле. Процесс B прослушивает порт P
и процесс А знает это, поэтому он пытается подключиться к 192.168.122.1:P
, Но это на самом деле адрес, данный virbr0
интерфейс на узле, где находится процесс A, поэтому узел пытается связаться с самим собой по несуществующему порту, поэтому возникает ошибка "отказано в соединении".