MPI_Barrier werkt niet goed

In mpi.h probeer ik MPI_Barrier te gebruiken, maar het werkt niet goed. Hier is een voorbeeld:

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

De uitvoer is:

(0)
0   

(1)
0   

(2)
0   

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

(uitgevoerd met 4 processors) Dus alle processors beginnen met het afdrukken van waarden tegelijkertijd, zelfs als er een barrière is. Waarom?

0

1 antwoord

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.

Als u uw IO op volgorde wilt zien, voegt u fflush (stdout) toe vóór de barrière. Voor volledige controle over I/O-bestellingen, besteedt u één processor aan het uitvoeren van I/O, omdat MPI geen I/O-bestelgarantie biedt.

3
toegevoegd