MPI_Barrier и рекурсия - PullRequest
       13

MPI_Barrier и рекурсия

2 голосов
/ 30 июня 2011

Я пытаюсь использовать MPI_Barrier (OpenMPI), чтобы заставить весь процесс быть на одной глубине рекурсивного вызова.

Это код

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <mpi.h>

using namespace std;

void recursive_function(int,int,int);

int main(int argc, char *argv[]) {
    int rank, size;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    recursive_function(0,3,rank);

    MPI_Finalize();
}

void recursive_function(int depth, int limit, int rank) {
    printf("depth: %d, processor %d\n", depth, rank);

    MPI_Barrier(MPI_COMM_WORLD);
    if(depth == limit) return;
    else recursive_function(depth+1,limit,rank);
}

Что яget is (работает с барьером mpirun -np 2)

depth: 0, processor 0
depth: 1, processor 0
depth: 2, processor 0
depth: 3, processor 0
depth: 0, processor 1
depth: 1, processor 1
depth: 2, processor 1
depth: 3, processor 1  

В то время как я ожидал бы что-то вроде

depth: 0, processor 0
depth: 0, processor 1
depth: 1, processor 0
depth: 1, processor 1
depth: 2, processor 1
depth: 2, processor 0
depth: 3, processor 1
depth: 3, processor 0 

1 Ответ

3 голосов
/ 30 июня 2011

Нет гарантии, что stdout среди процессов MPI упорядочен каким-либо образом.

То есть процессы должны взаимодействовать, чтобы доказать, что все они имеют одинаковую глубину рекурсии.Например, после барьера каждый процесс! = 0 отправляет сообщение с рангом 0, которое что-то печатает.

...