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
Die Variable haben wahrscheinlich die gleiche Adresse und anderen Wert, weil es nicht wirklich Threads aber Prozesse ist? –
@Joachim: Wie kann ich herausfinden, ob es sich um Prozesse oder Threads handelt? – Mehrdad
Bei aktuellen MPI-Implementierungen ist jeder Rang ein separater Prozess. –