Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Барьерная синхронизация в MPI

Не работает барьерная синхронизация. Делал это для того чтобы сделать все задания лабораторной работы в одном файле. Вот код:
#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 хранит вывод с разных потоков как попало. Данные с одного потока хранятся правильно, друг за другом, но вот данные разных потоков уже не будут гарантированно храниться в порядке поступления.
Если очень хочется вывести по порядку, то лучше самому выделить один поток для печати и отправлять ему все данные, то есть делать вывод не в нескольких потоках, а только в одном.

Комментариев нет:

Отправить комментарий