2013-05-21 18 views
8

Ho scritto un codice di esempio riportato di seguito:Definizione di variabili globali 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; 
} 

Come si può notare, questo programma definisce in realtà una variabile globale chiamata x e il filo zeroth cerca di assegnare un valore ad esso. Quando ho questo programma eseguito su un (Symmetric multiprocessing) macchina SMP con 4 core ottengo i seguenti risultati:

10.1 
0 
0 
0 

Più interessante, quando cambio il mio codice in modo che ogni stampe filo l'indirizzo di variabile x, vale a dire & x, tutti stampano la stessa cosa.

La mia domanda è come è possibile che un numero di thread su un sistema SMP condivida lo stesso valore per l'indirizzo di una variabile mentre non condividono lo stesso valore?

e la mia seconda domanda è come dovrei cambiare il codice sopra in modo da ottenere i seguenti risultati?

10.1 
10.1 
10.1 
10.1 
+2

La variabile probabilmente ha lo stesso indirizzo e un valore diverso perché non è realmente thread ma processi? –

+0

@Joachim: Come posso sapere se sono processi o thread? – Mehrdad

+1

Con le implementazioni MPI correnti ogni rango è un processo separato. –

risposta

5

Si potrebbe utilizzare di broadcast:

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

Questa volontà ha inviato il valore di x il processo da 0 a tutti gli altri processi.

+1

Lo 0 nella chiamata di funzione sopra è il grado del processo che avvia la trasmissione. Come hai detto, è il tuo processo di root che altera il valore di x, che il motivo per cui questo parametro è 0. Nota che MPI_Bcast è una routine di blocco. Ogni processo all'interno del communicator (in questo caso MPI_COMM_WORLD) deve chiamare MPI_BCast() prima che qualsiasi funzione possa continuare. – Madsen