2016-05-29 5 views
0

Я бы хотел отправить два массива: double A и int B используя широковещательную рассылку в MPI (я использую C++). Обычно communicator.Bcast блокирует для читателей, но не для писателя. Так, если бы я сделал:два MPI транслируются один за другим

communicator.Bcast(A, a_len, ...) 
communicator.Bcast(B, b_len, ...) 

Это может случиться так, что какой-то процесс будет первым получить второе сообщение и все будет беспорядок.

Интересно, какое хорошее, чистое решение для этой проблемы? Должен ли я использовать производные типы данных/MPI_Pack? Это кажется уродливым. Могу ли я каким-то образом использовать TAG в трансляции?

ответ

4

MPI гарантирует, что коллективные вызовы коммуникатора обрабатываются в том порядке, в котором они выданы. Таким образом, нет, читатели не получат второе сообщение сначала - этот пример - это спасение.

FYI, интерфейс MPI C++ устарел - лучше использовать API C непосредственно для нового кода.

+0

Следует отметить, что гарантия существует только до тех пор, пока последовательность коллективных вызовов одинакова во всех рядах. В противном случае поведение не определено. –