2013-05-21 4 views
8

Я написал пример кода ниже:Определение глобальных переменных в 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; 
} 

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

10.1 
0 
0 
0 

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

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

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

10.1 
10.1 
10.1 
10.1 
+2

Возможно, переменная имеет один и тот же адрес и другое значение, потому что это не потоки, а процессы? –

+0

@Joachim: Как я могу узнать, являются ли они процессами или потоками? – Mehrdad

+1

С текущими реализациями MPI каждый ранг является отдельным процессом. –

ответ

5

Вы можете использовать трансляцию:

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

Это будет отправлено значение й на процессе 0 для всех других процессов.

+1

0 в приведенном выше вызове функции - это ранг процесса, который инициирует широковещательную передачу. Как вы сказали, ваш корневой процесс изменяет значение x, поэтому этот параметр равен 0. Обратите внимание, что MPI_Bcast - это процедура блокировки. Каждый процесс внутри коммуникатора (MPI_COMM_WORLD в этом случае) должен вызвать MPI_BCast(), прежде чем любая функция будет продолжена. – Madsen

Смежные вопросы