Открытые ранги MPI не в порядке

Когда я запускаю программу «Open MPI», она обычно назначает ранги в случайном порядке. Я хочу знать, есть ли способ всегда назначать ранги по порядку?

Так что вместо этого

Hello, World. I am 2 of 3
Hello, World. I am 0 of 3
Hello, World. I am 1 of 3 

могу я получить это

Hello, World. I am 0 of 3
Hello, World. I am 1 of 3
Hello, World. I am 2 of 3 

РЕДАКТИРОВАТЬ

вот код

    PROGRAM hello
INCLUDE 'mpif.h'
INTEGER*4 :: numprocs, rank, ierr
CALL MPI_INIT(ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
write(*,*) 'Hello World. I am', rank, 'of', numprocs
CALL MPI_FINALIZE(ierr)
    END PROGRAM hello

Я тестировал его на процессоре i5 (4 потока) при запуске

    mpirun -np 4 myprog

он работает так, как я хочу, ранги печатаются в порядке 0-3, в противном случае (например, с 3, как показано выше) он просто не будет этого делать (проверено это как 100 раз)


person Jovi Dsilva    schedule 17.12.2013    source источник
comment
Отображение рангов на хосты/ядра является детерминированным в каждой реализации MPI. Точный прогресс каждого ранга (в значительной степени) не зависит от выполнения задания. Неупорядоченный характер отпечатков показывает, что каждый из процессов получил запись, и эта запись была передана через стандартный вывод обратно в команду mpirun для вывода на терминал в другом порядке. Это фундаментальная природа программ MPI. В лучшем случае существует слабая координация между рядами. Синхронизация всех рангов — одна из фундаментальных проблем параллельного программирования.   -  person Stan Graves    schedule 19.12.2013
comment
@StanGraves Большое спасибо   -  person Jovi Dsilva    schedule 19.12.2013


Ответы (2)


Порядок, в котором назначаются ранги, никогда не бывает случайным в большинстве реализаций MPI, и обычно существуют механизмы для его точного управления. Что является случайным, так это порядок, в котором выходные данные различных рангов поступают в модуль запуска MPI (mpirun, mpiexec и т. д.) через механизм перенаправления ввода-вывода. Из-за обычно используемой буферизации никогда нельзя быть уверенным, что если, например. ранг 0 выводит некоторый текст перед рангом 1, тогда выходные данные ранга 0 обязательно поступят раньше, чем выходные данные ранга 1. Единственный переносимый способ гарантировать упорядоченность текстового вывода состоит в том, чтобы все ранги направляли свои сообщения через один ранг, который не ИО.

В некоторых реализациях можно сделать что-то вроде линейной передачи маркера или последовательности барьеров, например:

int rank, size;

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

for (int i = 0; i < size; i++)
{
   if (i == rank)
      printf("Hello world! I am %d of %d\n", rank, size);
   MPI_Barrier(MPI_COMM_WORLD);
}

Обоснование такого кода заключается в том, что MPI_Barrier может выполнять ожидающие операции связи до своего завершения, включая те, которые несут перенаправленный стандартный вывод. Тем не менее, нет никакой гарантии, что вывод printf() сразу же отобразится в выводе консоли mpirun/mpiexec.

person Hristo Iliev    schedule 17.12.2013
comment
Что, если у меня есть цикл, скажем, от 1 до 3560, я делю работу в цикле на 5 процессоров, поэтому каждый процессор выполняет 730 итераций цикла. Теперь ранги не идут по порядку (я пробовал), и ранг 0 выполняет итерации [731 - 1461], но я хочу, чтобы он выполнял итерации [1 - 730] - person Jovi Dsilva; 17.12.2013
comment
Ваш вопрос не имеет смысла. Просто попросите ваше приложение выполнить проверку, if (rank == 0) {do 1 - 730}. - person Wesley Bland; 17.12.2013

Многие реализации mpi позволяют добавлять к выходным данным ранг этого процесса. тогда вы можете отсортировать его постфактум. В MPICH это --prepend-rank или -l. В OpenMPI это --tag-output

person Rob Latham    schedule 18.12.2013