2013-02-21 2 views
2

В related question Недавно я узнал, что нужно быть очень осторожным, используя MPI с несколькими потоками. Поскольку реализация, которую я использую, не поддерживает MPI_THREAD_MULTIPLE, я просто завернул каждый звонок MPI::COMM_WORLD с помощью std::lock_guard<std::mutex>.Защита потока MPI-связь

Мой вопрос сейчас: Это перебор? Конкретно: могу ли я Send в точное время I Recv?

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

Дополнение: теперь - с сотнями тестовых прогонов - на самом деле произошла одна отвратительная ошибка сегментации , но я не уверен на 100%, если это связано с одновременным отправкой/возвратом.

+0

Вы пробовали это по сети? на тестовом компьютере локально он может вести себя по-разному, время отправки сообщения/recv не является детерминированным, и не является блокировкой/разблокировкой мьютекса – pyCthon

+0

@pyCthon Я сделал это только локально, но кажется, что даже это не удается. К сожалению, разные коммуникаторы тоже не являются решением. – stefan

ответ

0

Какой режим многопоточного MPI вы используете? Использование мьютекса недостаточно, если вы не используете MPI_THREAD_SERIALIZED, и в этом случае вам нужно будет использовать один мьютекс вокруг всех вызовов MPI. Это делает сериализацию их, как вы видите. Если вы не используете MPI_Init_thread с MPI_THREAD_SERIALIZED (т. Е. Вы используете MPI_Init или некоторые настройки нижнего потока), даже с использованием мьютекса недостаточно; см. стандарт MPI для точных ограничений. Если вы используете MPI_THREAD_SERIALIZED, правило состоит в том, что вы не можете одновременно вводить вызовы MPI из нескольких потоков, независимо от того, являются ли они одной и той же операцией или разными.

+0

Я не понимаю, почему 'std :: mutex' и' MPI_Init' не должно быть достаточно. Это эффективно сериализует вызовы MPI-связи, поэтому он не может отличаться от использования одного потока. По-другому говорить будет означать, что использовать MPI_Init всегда небезопасно. Не могли бы вы прояснить это? – stefan

+0

Небезопасно использовать простой «MPI_Init», если ваша программа использует потоки вообще (даже если она не использует MPI из других потоков). –

+0

См. Раздел 12.4.3 (начало страницы 486) стандарта MPI 3.0 (http://www.mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf) для правил для разных уровней потоков. –

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