MPI_Barrier não está funcionando corretamente

Em mpi.h, estou tentando usar MPI_Barrier, mas não está funcionando bem. Aqui está um exemplo:

int main(int argc, char **argv)
{
    MPI_Init(&argc,&argv);
    int i,j,rank,np;
    MPI_Comm_size(MPI_COMM_WORLD,&np);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    for(i=0;i<5;j++)
            {
                printf("%d\t",j);
                if((j%10)==0)
                    printf("\n");
            }
        }
        MPI_Barrier(MPI_COMM_WORLD);
    }
    MPI_Finalize();
    return 0;
}

A saída é:

(0)
0   

(1)
0   

(2)
0   

(3)
0   
1       2       3       4       1       2       3       4       1       2       3       4
1       2       3       4   

(executado com 4 processadores) Assim, todos os processadores começam a imprimir valores ao mesmo tempo, mesmo se houver uma barreira. Por quê?

0

1 Respostas

printf to stdout is buffered, and by default flushes the buffer at each \n. So each processor in turn prints its rank and flushes the buffer with \n, then prints 0 and flushes the buffer. Each processor then uses printf to load "1 2 3 4" into the output buffer, but doesn't flush. The flush happens the the end of the program, so all the final lines appear at once.

Para ver seu IO em ordem, adicione fflush (stdout) antes da barreira. Para controle total sobre a ordem de E/S, dedique um processador a E/S, já que o MPI não fornece nenhuma garantia de E/S.

3
adicionado