2016-08-12 5 views
1

Ich teste einen sehr grundlegenden MPI-Code:warum immer Rang 1 ist?

int main(int argc, char** argv){ 

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

    if(rank == 0) 
    cout << "world size" << size << " my rank " << rank; 
    else 
    cout << rank << endl; 
    MPI_Finalize(); 
    return 1; 
} 

Dieser Code druckt:

world size1324 my rank                                              
0 

, die in Ordnung ist.

Wenn ich den Code wie folgt ändern:

int main(int argc, char** argv){ 

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

    if(rank == 0) 
    cout << "world size" << size << " my rank " << rank; 
    if(rank =! 0)                                               
    cout << rank << endl; 
    MPI_Finalize(); 
    return 1; 
} 

Ausgang ist:

world size111                                                
4 
my rank 
01 

Ich betreibe den Code mit -np 4

Warum, im zweiten Ansatz, wird der Rang immer als 1 gedruckt?

Antwort

1

Wie Sie vielleicht bemerkt haben oder nicht, rank ist ursprünglich 0 und dann auf 1 gesetzt. Schauen Sie genau auf Ihre Ausgabe. Wenn rank 1 ist, wird 01 nicht ausgedruckt. Es ist das Drucken der ersten Zeile cout << "world size" << size << " my rank " << rank; wo rank 0 ist, dann cout << rank << endl; die zweite Zeile ausdrucken, wo rank ist 1.

Die hier Problem mit dieser Linie ist:

if(rank =! 0) 

Du bist gerade nicht, wenn rank ist nicht 0, Sie setzen rank auf !0. Es wird effektiv als eine Zuweisung von booleschen Werten behandelt, und das Gegenteil von 0 (falsch) ist 1 (wahr). Die if wertet dann das Ergebnis dieser Zuweisung aus. So ist die Linie ist im Wesentlichen die gleiche wie:

rank = !0; // ie. set rank = 1 
if (rank) // 1 is true 

Was sollten Sie haben, ist:

if (rank != 0)