Заказ вывода в MPI

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

for(int i=0;i<10;i++)
{
    for(int k=0;k<numprocs;k++)
    {
        if (my_id==k){
            for(int j=1;j<10;j++)
                printf("%d",data[i][j]);
        }
        MPI_Barrier(com);
    }
    if(my_id==0)
        printf("\n");
}

Кажется, что каждый процесс имеет свой собственный stdout, и поэтому невозможно заказать упорядоченные строки без отправки всех данных одному хозяину, который будет распечатываться. Мое предположение верно? Или что я делаю неправильно?

Ответ 1

Вы правильно поняли. В стандарте MPI не указывается, как собирать stdout из разных узлов для печати в процессе создания. Часто бывает, что при выполнении несколькими процессами печати выходные данные будут объединены неопределенным способом. fflush не помогает.

Если вы хотите, чтобы результат упорядочивался определенным образом, самый переносимый метод должен был отправить данные в главный процесс для печати. ​​

Например, в псевдокоде:

if (rank == 0) {
    print_col(0);
    for (i = 1; i < comm_size; i++) {
        MPI_Recv(buffer, .... i, ...);
        print_col(i);
    }
} else {
    MPI_Send(data, ..., 0, ...);
}

Другим методом, который может иногда работать, является использование барриков для блокировки шагов, чтобы каждый процесс печатал по очереди. Это, конечно, зависит от реализации MPI и того, как она обрабатывает stdout.

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

Конечно, в производственном коде, где данные слишком велики, чтобы печатать разумно в любом случае, данные в конечном итоге объединяются, когда каждый процесс записывается в отдельный файл и объединяется отдельно или с помощью MPI I/O (определенные в стандартах MPI2) для координации параллельной записи.

Ответ 2

Я создал упорядоченный вывод в файл перед тем, как использовать тот же самый метод. Вы можете попробовать распечатать временный файл, распечатать содержимое указанного файла и затем удалить его.

Ответ 3

Попросите корневой процессор выполнить всю печать. Используйте MPI_Send/MPI_Recv или MPI_Gather (или что-то еще) для отправки данных поочередно от каждого процессора к корню.

Ответ 4

Чтобы решить эту проблему, вы можете использовать короткий сон. Я использую, а затем он работает в 99%

printf("text nr 1\n");
MPI_Barrier(MPI_COMM_WORLD);
usleep(100);
printf("text nr 2\n");

Это не очень элегантно, но работает.