Является ли вызов exit() внутри параллельного региона в OpenMP плохой практикой?

У меня есть программа, использующая как MPI, так и OpenMP.

Мастер порождает несколько рабов. Каждое ведомое устройство является многопоточным с OpenMP, и один поток предназначен для обмена данными (MPI_THREAD_FUNNELED).

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

Итак, пока я вызываю функцию exit() внутри параллельной области, но мне интересно, является ли это плохой практикой и есть ли более элегантный способ выхода из процесса внутри параллельной области?


person Walt    schedule 27.12.2014    source источник


Ответы (2)


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

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

person Sedat Kapanoglu    schedule 27.12.2014

Резюме

Это действительный OpenMP, но неправильный MPI.

OpenMP

Со страницы 3 OpenMP 4.0:

Для C/C++ исполняемый оператор, возможно, составной, с одной записью вверху и одним выходом внизу, или конструкция OpenMP.

...

Вызовы exit() разрешены в структурированном блоке.

ИМБ

Со страницы 357 MPI 3.1 (определение MPI_Finalize):

Эта процедура очищает все состояние MPI. Если программа MPI завершается нормально (т. е. не из-за вызова MPI_ABORT или неисправимой ошибки), то каждый процесс перед завершением должен вызвать MPI_FINALIZE.

Практические последствия

На практике нарушение этой части стандарта MPI обычно имеет минимальные неблагоприятные последствия. Однако возможно, что отсутствие вызова MPI_Finalize вызовет утечку ресурсов в некоторых реализациях, которые могут в конечном итоге накапливаться, делая узлы в вашей системе непригодными для использования до тех пор, пока они не будут перезагружены.

Поскольку MPI_Finalize является коллективным, его нельзя использовать как exit, хотя теоретически вы можете использовать MPI_Abort для локального выхода. Однако это может разрушить всю среду MPI, поскольку многие реализации не очень строго локализуют сбои, даже если MPI_Abort вызывается как MPI_Abort(MPI_COMM_SELF,0).

person Jeff Hammond    schedule 28.12.2015