MPI_Barrier в разных потоках, поведение? [Дубликат]

0

Допустим, у меня есть 2 процесса с двумя потоками (1 поток IO, 1 поток вычислений)

Меня интересует использование библиотеки IO (adios).
Я спрашиваю, что произойдет, если я буду писать что-то вроде этого?:

  • позволяет сказать, что потоки ввода-вывода в двух процессах выполняют некоторые MPI_Barrier(MPI_COMM_WORLD) ввода-вывода, и они используют MPI_Barrier(MPI_COMM_WORLD) в некоторой точке B для синхронизации ввода-вывода!

  • потоки вычислений в двух процессах также используют MPI_Barrier(MPI_COMM_WORLD) в некоторой точке A для синхронизации вычисления (в то время как потоки ввода-вывода работают).

---> Я точно не знаю, что может случиться, возможен следующий случай:

  • Процесс 1, IO Thread ждет при B
  • Процесс 2, вычисление потока ждет на A

=>, а процесс 1 и 2 синхронизируются (так что процесс 1 оставляет барьер в B и процесс 2 в A (также процесс 2 не имеет той же точки, где он синхронизируется!)

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

Или барьер действительно зависит от линии кода? Но как это реализуется, если это так?

Это смущает!

Большое спасибо!

Теги:
multithreading
mpi
synchronization

1 ответ

4
Лучший ответ

Вероятно, произойдет первый сценарий (вызовы баррелей из разных потоков, соответствующие друг другу). С точки зрения MPI барьер должен вводиться всеми рядами внутри коммуникатора, независимо от того, какой поток вызывает барьерный вызов и на какой строке кода находится вызов. MPI по-прежнему не имеет понятия идентичности потоков, и все потоки обрабатываются вместе как единый объект - ранг. Единственное специальное лечение заключается в том, что когда MPI_THREAD_MULTIPLE уровень поддержки потока MPI_THREAD_MULTIPLE, библиотека должна внедрять надлежащие блокировки, чтобы вызовы MPI могли быть сделаны из любого потока и в любое время.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню