Два MPI_Bcast путают сообщения друг друга

139
09 июня 2019, 09:30

Задали нам на дом найти факториал 16!, используя MPI. Всё хорошо считается до тех пор, пока два MPI_Bcast не начинают отправлять сообщения всем потокам.

По идее, функция имеет следующие параметры: MPI_Bcast(&mes, count, datatype, root, comm), где mes-сообщение для всех потоков, count - число элементов в сообщении (обычно 1, >1 у массивов), datatype - тип данных сообщения, root - поток, который эти данные отправляет, comm - области видимости.

У меня есть 2 разных MPI_Bcast:

MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, MPI_COMM_WORLD);

И

MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 5, MPI_COMM_WORLD);

Как видно, сообщения берутся из разных потоков, а именно из 1 и 5, и отсылают сообщения в совсем разные потоки, которые никак не пересекаются друг с другом. Первый отправляет сообщение в 0-3 потоки, а второй в 4-7 потоки.

Но тут возникает проблема. Каждый MPI_Bcast в сумме отсылает 3 сообщения, 2 из которых у каждого правильно доходят до получателя, а вот 1 сообщение у каждого путается и отправляется к получателю другого MPI_Bcast.

На скриншоте неправильно считаются 5! и 13!, потому что эти сообщения были предназначены для них. 5! должна была получить 4! от 1 потока, а 13! должна была была получить 9*10*11*12=11880 от 5 потока. Но в итоге сообщения перепутались и пришли противоположным адресатам.

Как я понимаю, ошибка тут не в коде, а в специфике передачи сообщений. Ведь в другие потоки сообщения дошли правильно.

Answer 1

Проблему решил созданием для каждой MPI_Bcast отдельных областей видимости. Т.е. вместо MPI_COMM_WORLD использовал свои локальные группы.

READ ALSO
промахи в кэш L2 и попадание в кэш L3

промахи в кэш L2 и попадание в кэш L3

подскажите пожалуйста, на каком примере можно рассмотреть промахи в кэш L2 и попадание в кэш L3? я не могу найти примеров на c++, где на конкретном...

125
Проблема с кодом в c++

Проблема с кодом в c++

Не могу понять почему слово симметрична выводится 16 раз, n и m равны 4, и такое ощущение что код как то эти значения умножаетВ чем ошибка ? вот...

139
Qt5, Code::Blocks, undefined reference

Qt5, Code::Blocks, undefined reference

Пытаюсь добавить Qt5 в готовый проектВозникли две ошибки: undefined reference to "_imp___ZN12QApplicationC1ERiPPci' и undefined reference to "_imp___ZN12QApplicationD1Ev'

130
Наследование и перегрузка

Наследование и перегрузка

Есть базовый класс

117