Лоша практика ли е да се извиква 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() са разрешени в структуриран блок.

MPI

От страница 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