Инициализация и завершение По крайней мере один тред в процессе
вызывает MPI_FINALIZE
и это должно произойти в том треде, который
инициализировал MPI. Мы называем этот тред основным тредом.
Вызов должен произойти только после того, как все треды процесса завершили
их вызовы MPI, и не имеют никакой незаконченной связи или операций
ввода-вывода.
Объяснение: Это ограничение может упростить реализацию. []
Множественные треды, завершающие тот же самый запрос
Программа, в которой блокированы два треда, ожидающие по тому же самому
запросу, является ошибочной. Аналогично, тот же самый запрос не может
появляться в массиве запросов двух параллельных вызовов
MPI_WAIT{ANY,SOME,ALL}
. В MPI, запрос может быть закончен
только однажды. Любая комбинация ожидания или проверки, которая нарушает
это правило, ошибочна.
Объяснение:
Это совместимо с представлением, что многопоточное выполнение соответствует
чередованию вызовов MPI. В однопоточной реализации, когда ожидание
зарегистрировано по запросу, указатель запроса будет аннулирован прежде, чем
возможно пройдет секунда ожидания на том же самом указателе. С тредами,
MPI_WAIT{ANY,SOME,ALL}
может быть блокирована, не аннулировав ее
запрос, так что это становится ответственностью пользователя избегать
использования того же самого запроса в MPI_WAIT
на другом треде. Это
ограничение также упрощает реализацию, так как только один тред будет
блокирован на любой связи или случае ввода-вывода. []
Исследование Получающий вызов, который использует источник и
значения идентификатора, возвращенные предшествующим вызовом к
MPI_PROBE
или MPI_IPROBE
, получит сообщение, согласованное
вызовом исследования только, если не имелось никакого другого соответствия
получить после исследования и прежде, чем получить. В многопоточной среде,
это - обязанность пользователя, чтобы предписать это условие (состояние),
используя подходящую взаимную логику исключения. Это может быть
предписано, убеждаясь, что каждый коммуникатор используется только одним
тредом в каждом процессе.
Коллективные вызовы Соответствие коллективных вызовов на коммуникатор, окно, или указатель файла сделано согласно порядку, в котором вызовы выданы в каждом процессе. Если параллельные треды выполняют такие вызовы на том же самом коммуникаторе, окне или указателе файла, это - обязанность пользователя, чтобы удостовериться, что вызовы правильно упорядочиваются, используя межтредовую синхронизацию.
Обработчики исключительных ситуаций Обработчик исключительных ситуаций не обязательно выполняется в контексте треда, который выполнил вызывающий исключение вызов MPI; обработчик особых ситуаций может быть выполнен тредом, который является отличным от треда, который возвратит код ошибки.
Объяснение: Реализация MPI может быть многопоточная, так, чтобы часть протокола связи могла выполняться на треде, который является отличным от треда, который сделал вызов MPI. Оформление позволяет обработчику особых ситуаций быть выполненным тредом, где произошло исключение. []
Взаимодействие с сигналами и отменами Результат неопределен, если тред, который выполняет вызов MPI, отменен (другим тредом), или если тред захватывает сигнал при выполнении вызова MPI. Однако, тред процесса MPI может закончить, и может захватить сигналы или быть отмененным другим тредом при не выполнении вызовов MPI.
Объяснение: Немного библиотечных функций Си безопасны по отношению к сигналам, и многие имеют точки отмены - точки, где тред, выполняющий их, может быть отменен. Вышеупомянутое ограничение упрощает реализацию (нет никакой потребности в библиотеке MPI, чтобы быть ``async-cancel-safe'' или ``async-signal-safe''). []
Совет пользователям:
Пользователи могут захватывать сигналы в отдельных, не-MPI тредах
(например, маскируя сигналы на вызывающих тредах MPI, и демаскируя их
в одном или более не-MPI тредов). Хорошая практика программирования
должна блокировать отличный тред в вызове к sigwait
для каждого
ожидаемого сигнала пользователя. Пользователи не должны захватывать
сигналы, используемые реализацией MPI; поскольку каждая реализация
MPI требует документировать сигналы, используемые внутри, а
пользователи могут избегать использования этих сигналов. []
Совет разработчикам: Библиотека MPI не должна использовать вызовы из библиотек, которые не тредо-безопасны, если выполняются множественные треды. []