2012-01-27 5 views
0

Я понимаю, что MPI_init можно вызывать только один раз для исполняемого экземпляра. Может ли кто-либо уточнить пределы этого языка: то есть:Вызов MPI_Init более одного раза

  1. Я знаю, что можно запустить несколько python exec на mpiexec.
  2. Есть ли что-то вроде fork() или потоков, которые могут привести к чему-то, что подходит? Является ли критерием, что они должны произойти первым, а затем вызвать mpiexec?

Спасибо!

+1

Возникает вопрос, можете ли вы добавить один или несколько процессов, вызвав 'MPI_init()' более одного раза? –

+2

'MPI_Init' инициализирует среду, необходимую для выполнения вызовов MPI. Он имеет мало общего с 'fork()' или 'mpiexec'. В момент, когда 'MPI_Init' вызывается, все экземпляры/процессы MPI уже начались. Вы не называете это более одного раза просто потому, что процесс инициализации должен выполняться только один раз, а повторные вызовы могут привести к ошибочному поведению. –

+0

Извините за отсутствие ясности, и я согласен, что fork() была красной селедкой. Что касается вопроса Стива, я не предполагал добавления процессов. Один очень простой пример, который может предупредить меня о потенциальных опасностях, - это повторная последовательность нескольких MPI_Init и завершение вызовов по другому коду. Я думаю, что Шон накрыл это. –

ответ

1

Если вы правильно поняли, самым простым способом было бы перехватить вызовы до MPI_Init и выполнить его только один раз. Для C MPI предоставляет интерфейс PMPI Profiling, который позволяет вам переопределить любой символ MPI и предоставить дополнительный символ PMPI. Например. вы определяете функцию MPI_Init и в этой функции, в зависимости от того, вызвано ли она первым, вызовите PMPI_Init. То же самое (в обратном порядке) для MPI_Finalize.

Я не уверен насчет самого элегантного способа сделать это в Python. Я предполагаю, что вы можете просто взломать привязки python или LD_PRELOAD простую библиотеку C, которая делает магию .

Все это только обходное решение, которое может иметь плохие побочные эффекты. Реализации MPI советуют вам не делать многое до MPI_Init. Реальное решение было бы исправление кода для использования MPI соответствующим образом.

+0

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

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