Если вы правильно поняли, самым простым способом было бы перехватить вызовы до MPI_Init
и выполнить его только один раз. Для C MPI предоставляет интерфейс PMPI Profiling, который позволяет вам переопределить любой символ MPI и предоставить дополнительный символ PMPI. Например. вы определяете функцию MPI_Init
и в этой функции, в зависимости от того, вызвано ли она первым, вызовите PMPI_Init
. То же самое (в обратном порядке) для MPI_Finalize
.
Я не уверен насчет самого элегантного способа сделать это в Python. Я предполагаю, что вы можете просто взломать привязки python или LD_PRELOAD
простую библиотеку C, которая делает магию .
Все это только обходное решение, которое может иметь плохие побочные эффекты. Реализации MPI советуют вам не делать многое до MPI_Init
. Реальное решение было бы исправление кода для использования MPI соответствующим образом.
Возникает вопрос, можете ли вы добавить один или несколько процессов, вызвав 'MPI_init()' более одного раза? –
'MPI_Init' инициализирует среду, необходимую для выполнения вызовов MPI. Он имеет мало общего с 'fork()' или 'mpiexec'. В момент, когда 'MPI_Init' вызывается, все экземпляры/процессы MPI уже начались. Вы не называете это более одного раза просто потому, что процесс инициализации должен выполняться только один раз, а повторные вызовы могут привести к ошибочному поведению. –
Извините за отсутствие ясности, и я согласен, что fork() была красной селедкой. Что касается вопроса Стива, я не предполагал добавления процессов. Один очень простой пример, который может предупредить меня о потенциальных опасностях, - это повторная последовательность нескольких MPI_Init и завершение вызовов по другому коду. Я думаю, что Шон накрыл это. –