MPI Barrier C ++ - PullRequest
       55

MPI Barrier C ++

0 голосов
/ 13 января 2010

Я хочу использовать MPI (MPICH2) в Windows.Я пишу эту команду:

MPI_Barrier(MPI_COMM_WORLD);  

И я ожидаю, что она блокирует все процессоры, пока все члены группы не вызовут ее.Но этого не случилось.Я добавляю схему своего кода:

int a;  
if(myrank == RootProc)  
   a = 4;  
MPI_Barrier(MPI_COMM_WORLD);  
cout << "My Rank = " << myrank << "\ta = " << a << endl;  

(с 2 процессорами :) Корневой процессор (0) работает правильно, но процессор с рангом 1 не знает переменную a, поэтомудисплей -858993460 вместо 4.

Может ли кто-нибудь мне помочь?
С уважением

Ответы [ 3 ]

7 голосов
/ 13 января 2010

Вы только назначаете a в процессе 0. MPI не разделяет память, поэтому если вы хотите, чтобы a в процессе 1 получил значение 4, вам нужно вызвать MPI_Send из процесса 0 и MPI_Recv из процесса 1.

1 голос
/ 04 мая 2010

Недостаточно блокировки , необходимо отправить данные другим процессам ( память в нераспределенной между процессами).

Для обмена данными между ВСЕМИ процессами используйте :

int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )

так в вашем случае:

MPI_Bcast(&a, 1, MPI_INT, 0, MPI_COMM_WORLD);

здесь вы отправляете одно целое число, на которое указывает & процесс формы 0, всем остальным. // MPI_Bcast - отправитель для корневого процесса и получатель для некорневых процессов

Вы также можете отправить некоторые данные в указанный процесс:

int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, 
              int tag, MPI_Comm comm )

и затем получить по:

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)
1 голос
/ 13 января 2010

Переменная a не инициализирована - возможно, поэтому она отображает это число. В MPI переменная a дублируется между процессами, поэтому есть два значения для a, одно из которых неинициализировано. Вы хотите написать:

int a = 4;
if (myrank == RootProc)
...

Или, альтернативно, выполните MPI_send в корне (id 0) и MPI_recv в ведомом устройстве (id 1), чтобы значение в корне также было установлено в ведомом устройстве.

Примечание: этот код вызывает небольшую тревогу в моей голове, поэтому мне нужно кое-что проверить, и я отредактирую это с дополнительной информацией. Однако до тех пор неинициализированное значение, безусловно, является для вас проблемой. Хорошо, я проверил факты - ваш код не был правильно заполнен, и я пропустил пропущенный {}. Теперь барьер выглядит хорошо, хотя размещенный вами фрагмент не делает слишком много, и это не очень хороший пример барьера, потому что ведомый вводит его напрямую, тогда как корень установит значение переменной на 4, а затем введите это. Чтобы проверить, действительно ли он работает, вам, вероятно, понадобится какой-то механизм сна в одном из процессов - который будет приводить (надеюсь, что это правильный термин) к другому процессу, не позволяя ему печатать cout до тех пор, пока сон более.

...