Определение глобальных переменных в 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 всем другим процессам.