MPI: блокировка стандартного вывода - 1 процесс за раз? - PullRequest
0 голосов
/ 02 апреля 2009

Я хочу распечатать содержимое целочисленного массива каждого процесса. Проблема в том, что это все загромождено из-за состояния гонки.

Какое самое простое решение? Я не хочу отлаживать. Я хочу показать содержимое, потому что я делаю алгоритм сортировки. Поэтому полезно показывать до и после сортировки.

Я добавил это в lock.c:

#include <stdio.h>
static int lock=0;   //Don't use if timing execution
void capture(int rank) {
    while(lock!=0);
    lock = 1;
    printf("\nCaptured by %d\n", rank);
}
void release() {
    lock = 0;
}

И вызовите метод capture () перед печатью, затем отпустите () после печати. Да, это подобный семафору хак. Но это не работает, есть идеи?

Ответы [ 3 ]

5 голосов
/ 07 апреля 2009

Предполагая, что вы используете MPI, который собирает STDOUT всех процессов, вы можете использовать MPI_Barrier () для обеспечения порядка, например:

for( int i = 0; i < size; ++i ) {
    MPI_Barrier( MPI_COMM_WORLD );
    if ( i == rank ) {
         printf( "..." );
    }
 }

Конечно, это неэффективно, но может быть немного проще, чем организовать отправку всей информации обратно на ранг 0.

3 голосов
/ 02 апреля 2009

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

Оставьте другие ряды, чтобы выполнять настоящую работу. Я не думаю, что ваше решение будет работать, потому что я локальный для каждого ранга.

Вы также не хотите использовать обмен сообщениями для остановки отдельных рангов (пока они не смогут выводить данные), поскольку они не смогут выполнять свою сортировочную работу в это время.

Просто пусть каждый ранг с 1 по N выполняет свою работу и отправляет строки на ранг 0. Строки могут иметь форму "NNN:SSSSSS", где N - ранг, а S - строка. Затем ранг 0 может отфильтровывать определенные сообщения или записывать разные сообщения в разные файлы, а затем объединять их (сортировать) после закрытия всех рабочих рангов.

1 голос
/ 02 апреля 2009

Каждый процесс имеет свою собственную копию переменной. Таким образом, он не является общим и его нельзя использовать для синхронизации.

...