2012-05-05 3 views
2

Я строю распределенный веб-сервер в C/MPI, и кажется, что связь «точка-точка» полностью прекращает работу после первого MPI_BARRIER в моем коде. Стандартный код C работает после барьера, поэтому я знаю, что каждая из нитей проходит через барьер. Коммуникация точка-точка также отлично работает перед барьером. Однако, когда я копирую-вставляю тот же код, который работал над линией до барьера в линию после того, как барьер полностью перестает работать. SEND будет просто ждать вечно. Когда я пытаюсь использовать ISEND вместо этого, он делает это через строку, но сообщение так и не получено. Я много разбираюсь в этой проблеме, и всем, у кого есть проблемы с MPI_BARRIER, говорят, что барьер работает правильно, а их код неправильный, но я не могу в жизни понять, почему мой код неправильный. Что может вызвать такое поведение?MPI_SEND перестает работать после MPI_BARRIER

Вот пример программы, которая демонстрирует это:

#include <mpi.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int procID; 
    int val; 
    MPI_Status status; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &procID); 
    MPI_Barrier(MPI_COMM_WORLD); 

    if (procID == 0) 
    { 
    val = 4; 
    printf("Before send\n"); 
    MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD); 
    printf("after send\n"); 
    } 

    if (procID == 1) 
    { 
    val = 1; 
    printf("before: val = %d\n", val); 
    MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
    printf("after: val = %d\n", val); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

Перемещение двух if заявления до барьера вызывает эту программу, чтобы правильно работать.

EDIT - Похоже, что первое сообщение, независимо от типа, работы и всех будущих сообщений, не срабатывает. Это гораздо более общее, что я думал сначала. Не имеет значения, является ли первое сообщение барьером или каким-либо другим сообщением, никакие будущие коммуникации не работают должным образом.

+0

Код, который вы отправили, выглядит хорошо для меня. Какую версию MPI вы используете? – suszterpatt

+0

С openmpi 1.5.5 отлично работает для меня. – chemeng

+0

Я знаю, что это openmpi, но я не могу понять, какой номер версии. Есть ли команда, которая вам говорит? – TEOUltimus

ответ

5

Открытый MPI имеет функцию уведомления при использовании протокола TCP/IP для связи: он пытается использовать все настроенные сетевые интерфейсы, находящиеся в состоянии «UP». Это представляет собой проблему, если некоторые из других узлов недоступны через все эти интерфейсы. Это часть жадной оптимизации коммуникации, которую использует Open MPI, а иногда, как и в вашем случае, приводит к проблемам.

Кажется, что по меньшей мере второй узел имеет более одного интерфейс, которые и что этот факт был введен в первый узел на этапе согласования:

  • один сконфигурированный с 128.2.100.167
  • один настроен с 192.168.109.1 (у вас есть туннель или Xen работает на машине?)

барьер связь происходит по первой сети, а затем следующий MPI_Send пытается отправить на второй адрес OV второй сети, которая, очевидно, не соединяет все узлы.

Самое простое решение - открыть Open MPI только для использования nework, который соединяет ваши узлы. Вы можете сказать, что это сделать это, используя следующий параметр MCA:

--mca btl_tcp_if_include 128.2.100.0/24 

(или что-то ваша сеть связи)

Вы также можете указать список сетевых интерфейсов, если это одно и то же на всех машинах, например,

--mca btl_tcp_if_include eth0 

или вы можете сказать Open MPI специально исключить определенные интерфейсы (но вы всегда должны сказать ему, чтобы исключить обратную петлю «Lo», если вы так):

--mca btl_tcp_if_exclude lo,virt0 

Надежда, что помогает вам и многие другие, которые, как представляется, имеют те же проблемы, что и здесь, в SO.Похоже, что в последнее время почти все дистрибутивы Linux начали создавать различные сетевые интерфейсы по умолчанию, и это может вызвать проблемы с Open MPI.

P.S. Поместите эти узлы за брандмауэр, пожалуйста!

+0

Спасибо! Второе исправление, которое вы рекомендовали (с указанием сетевого интерфейса), прекрасно работало. Кроме того, кластер, в котором я работаю, находится за брандмауэром моей школы. Я уверен, что они знают, что они делают. : D – TEOUltimus