Определение глобальных переменных в 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("%fn", x);

   MPI_Finalize(); 
   return 0; 
}

как можно заметить, эта программа фактически определяет глобальную переменную под названием x, и нулевой поток пытается присвоить ей некоторое значение. Когда я запускаю эту программу на SMP (симметричной многопроцессорной) машине с 4 ядрами, я получаю следующие результаты:

10.1
0
0
0

более интересно, когда я меняю свой код так, что каждый поток печатает адрес переменной x, т. е. &x, все они печатают то же самое вещь.

мой вопрос в том, как возможно, что несколько потоков в системе SMP имеют одно и то же значение для адреса переменной, в то время как они не имеют одного и того же значения?

и мой второй вопрос заключается в том, как я должен изменить приведенный выше код, чтобы получить следующие результаты?

10.1
10.1
10.1
10.1

1 ответов


вы можете использовать broadcast:

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

Это отправит значение x в процессе 0 всем другим процессам.