Влияет ли MPI_Scatter на MPI_Bcast? - PullRequest
0 голосов
/ 03 мая 2019

Я посылаю целое число, которое вызывает завершение через MPI_Bcast. Корень устанавливает переменную с именем «running» в ноль и отправляет BCast. Кажется, что Bcast завершен, но я не вижу, чтобы значение отправлялось другим процессам. Другие процессы, кажется, ожидают завершения MPI_Scatter. Они даже не должны быть в состоянии прибыть сюда.

Я много исследовал MPI_Bcast и, насколько я понимаю, он должен блокировать. Это сбивает меня с толку, поскольку MPI_Bcast из корня, кажется, завершается, хотя я не могу найти совпадающие (принимающие) MPI_Bcasts для других процессов. Я окружил все свои MPI_Bcasts printfs и вывод этих printfs 1) print и 2) распечатал правильные значения из корня.

Корень выглядит следующим образом:

while (running || ...) {
    /*Do stuff*/
    if (...) {
        running = 0;
        printf("Running = %d and Bcast from root\n", running);
        MPI_Bcast(&running, 1, MPI_INT, 0, MPI_COMM_WORLD);
        printf("Root 0 Bcast complete. Running %d\n", running);
        /* Do some more stuff and eventually reach Finalize */
        printf("Root is Finalizing\n");
        MPI_Finalize();
    }
}

Другие процессы имеют следующий код:

while (running) {
    doThisFunction(rank);
    printf("Waiting on BCast from root with myRank: %d\n", rank);
    MPI_Bcast(&running, 1, MPI_INT, 0, MPI_COMM_WORLD);
    printf("P%d received running = %d\n", rank, running);
    if (running == 0) { // just to make sure.
        break;
    }
}
MPI_Finalize();

У меня также есть следующее в функции "doThisFunction ()". Вот где процессы, кажется, ожидают процесса 0:

int doThisFunction(...) {
    /*Do stuff*/
    printf("P%d waiting on Scatter\n", rank);
    MPI_Scatter(buffer, 130, MPI_BYTE, encoded, 130, MPI_BYTE, 0, MPI_COMM_WORLD);
    printf("P%d done with Scatter\n", rank);
    /*Do stuff*/
    printf("P%d waiting on gather\n", rank);
    MPI_Gather(encoded, 1, MPI_INT, buffer, 1, MPI_INT, 0, MPI_COMM_WORLD);
    printf("P%d done with gater\n", rank);
    /*Do Stuff*/
    return aValue;
}

Вывод в командной строке выглядит следующим образом:

P0 waiting on Scatter
P0 done with Scatter
P0 waiting on gather
P0 done with gather
Waiting on BCast from root with myRank: 1
P1 received running = 1
P1 waiting on Scatter
P0 waiting on Scatter
P0 done with Scatter
P0 waiting on gather
P0 done with gather
P1 done with Scatter
P1 waiting on gather
P1 done with gather
Waiting on BCast from root with myRank: 1
P1 received running = 1
P1 waiting on Scatter
Running = 0 and Bcast from root
Root 0 Bcast complete. Running 0
/* Why does it say the Bcast is complete 
/* even though P1 didn't output that it received it?
Root is Finalizing
/* Deadlocked...

Я ожидаю, что P1 получает работу как ноль, а затем переходит в MPI_Finalize (), а скорее он застревает в разбросе, который не будет доступен для корня, который уже пытается завершить.

На самом деле, программа находится в тупике и не прерывает MPI.

Я сомневаюсь, что проблема в том, что scatter принимает значение Bcast, потому что это даже не имеет смысла, так как корень не вызывает scatter.

У кого-нибудь есть какие-либо советы по решению этой проблемы?

Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 03 мая 2019

Почему говорится, что Bcast завершен, даже если P1 не выдает, что он его получил?

Обратите внимание на следующие определения из стандарта MPI :

Коллективные операции могут (но не обязаны) завершать , как только участие вызывающего абонента в коллективном общении заканчивается . ... Завершение коллективной операции указывает , что вызывающая сторона может изменять местоположения в буфере связи . Это не означает, что другие процессы в группе завершили или даже начали операцию (если иное не подразумевается в описании операции). Таким образом, коллективная операция связи может или не может иметь эффект синхронизации всех вызывающих процессов. Это утверждение, конечно, исключает барьерную операцию.

Согласно этому определению, ваш MPI_Bcast в корневом процессе может завершиться, даже если не существует MPI_Bcast, вызываемых ведомыми.

(Для операций «точка-точка» у нас есть разные режимы связи, например, синхронный, для решения этих проблем. К сожалению, для коллективов синхронный режим отсутствует.)


Кажется, в вашем коде есть проблема с порядком операций. Корень вызвал MPI_Bcast, но процесс # 1 этого не сделал и ждал MPI_Scatter, как показывают выходные данные журнала.

...