MPI_Barrier funktioniert nicht ordnungsgemäß

In MPI.h versuche ich, MPI_Barrier zu verwenden, aber es funktioniert nicht gut. Hier ist ein Beispiel:

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;
}

Die Ausgabe ist:

(0)
0   

(1)
0   

(2)
0   

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

(ausgeführt mit 4 Prozessoren) Daher beginnen alle Prozessoren gleichzeitig mit dem Drucken von Werten, auch wenn eine Barriere vorhanden ist. Warum?

0

1 Antworten

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.

Um Ihr IO in der richtigen Reihenfolge anzuzeigen, fügen Sie fflush (stdout) vor der Barriere hinzu. Um vollständige Kontrolle über die E/A-Bestellung zu haben, widmen Sie einen Prozessor der Ausführung von E/A, da MPI keine E/A-Bestellgarantie bietet.

3
hinzugefügt