Не работает барьерная синхронизация. Делал это для того чтобы сделать все задания лабораторной работы в одном файле. Вот код:
#define TASK(num) MPI_Barrier(MPI_COMM_WORLD);\
if(rank == 0) printf("
Task %d:
", num);\
MPI_Barrier(MPI_COMM_WORLD)
int main(int argc, char *argv[]) {
int rank, rc;
rc = MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
TASK(2);
if (rank == 0)
printf("Root process : Hello, world
");
else
printf("Slave process : my rank is %d
", rank);
MPI_Finalize();
}
Вывод получился такой:
Slave process : my rank is 1
Slave process : my rank is 2
Task 2:
Root process : Hello, world
То есть порядок вывода неверный.
Ответ
https://stackoverflow.com/questions/5305061/ordering-output-in-mpi
Здесь ответ. Коротко переведу. stdout хранит вывод с разных потоков как попало. Данные с одного потока хранятся правильно, друг за другом, но вот данные разных потоков уже не будут гарантированно храниться в порядке поступления.
Если очень хочется вывести по порядку, то лучше самому выделить один поток для печати и отправлять ему все данные, то есть делать вывод не в нескольких потоках, а только в одном.
Комментариев нет:
Отправить комментарий