2013-12-17 4 views
0

Когда я запускаю программу «Open MPI», она обычно назначает ранги в случайном порядке, я хочу знать, есть ли способ всегда назначать ранги по порядку?Открытые ряды 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 

EDIT

здесь код

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 раз)

+0

Отображение рангов на хосты/ядра является детерминированным в каждой реализации MPI. Точный прогресс каждого звания (в значительной степени) независим в ходе работы. Характер «не в порядке» отпечатков иллюстрирует, что каждый из процессов дошел до записи, и что запись передавалась через stdout обратно в команду mpirun для вывода на терминал в другом порядке. Это основной характер программ MPI. В лучшем случае существует «слабая» координация между рядами. Синхронизация по всем ранкам является одной из фундаментальных проблем параллельного программирования. –

+0

@StanGraves Спасибо большое –

ответ

2

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

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

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.

+0

Что делать, если у меня есть цикл от 1 до 3560, я делю работу в цикле на 5 процессоров, поэтому каждый процессор выполняет 730 итераций цикла. Теперь ряды не приходят (я пробовал), а Rank 0 выполняет итерации [731 - 1461], но я хочу, чтобы он выполнял итерации [1 - 730] –

+1

Ваш вопрос не имеет смысла. Просто попросите приложение сделать чек, 'if (rank == 0) {do 1 - 730}'. –

3

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

Смежные вопросы