2013-05-21 16 views
8

Ich habe einen Beispielcode unten geschrieben:Definition globale Variablen in mpi

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

double x; 

int main (int argc, char **argv) { 
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    if (rank==0) x=10.1; 

    MPI_Barrier(MPI_COMM_WORLD); 
    printf("%f\n", x); 

    MPI_Finalize(); 
    return 0; 
} 

Wie man feststellen kann, ist dieses Programm definiert tatsächlich eine globale Variable namens x und der nullt Thread versucht, einen Wert zu ihm zuzuweisen. Wenn ich dieses Programm laufen auf einem SMP (Symmetric Multiprocessing) Maschine mit 4 Kernen erhalte ich folgende Ergebnisse:

10.1 
0 
0 
0 

Noch interessanter ist, wenn ich den Code ändern, so dass jeder Thread druckt die Adresse der Variablen x, dh & x, sie alle drucken die gleiche Sache.

Meine Frage ist, wie es möglich ist, dass mehrere Threads auf einem SMP-System den gleichen Wert für die Adresse einer Variablen teilen, während sie nicht den gleichen Wert teilen?

und meine zweite Frage ist, wie ich den obigen Code ändern sollte, damit ich die folgenden Ergebnisse bekomme?

10.1 
10.1 
10.1 
10.1 
+2

Die Variable haben wahrscheinlich die gleiche Adresse und anderen Wert, weil es nicht wirklich Threads aber Prozesse ist? –

+0

@Joachim: Wie kann ich herausfinden, ob es sich um Prozesse oder Threads handelt? – Mehrdad

+1

Bei aktuellen MPI-Implementierungen ist jeder Rang ein separater Prozess. –

Antwort

5

könnten Sie Broadcast verwenden:

MPI_Bcast(&x,1,MPI_DOUBLE,0,MPI_COMM_WORLD); 

Dies wird den Wert von x auf Prozess 0 auf alle anderen Prozesse gesendet.

+1

Die 0 im obigen Funktionsaufruf ist der Rang des Prozesses, der die Übertragung initiiert. Wie Sie gesagt haben, ist es Ihr Root-Prozess, der den Wert von x ändert. Deshalb ist dieser Parameter 0. Beachten Sie, dass MPI_Bcast eine blockierende Routine ist. Jeder Prozess im Communicator (in diesem Fall MPI_COMM_WORLD) muss MPI_BCast() aufrufen, bevor eine Funktion fortgesetzt werden kann. – Madsen