2014-12-27 25 views
0

我有一个使用MPI和OpenMP的程序。在OpenMP中的并行区域内调用exit()是不好的做法吗?

主人产生几个奴隶。 每个从站使用OpenMP多线程,一个线程专用于通信(MPI_THREAD_FUNNELED)。

当通信线程收到来自主服务器的消息,指示进程必须停止时,我不希望等待并行区域内的所有线程完成。

所以现在我调用并行区域内的exit()函数,但是我想知道这是否是一种错误的做法,以及是否有更优雅的方式退出并行区域内的进程?

回答

1

从操作系统的角度来看是安全的。 OS关闭所有句柄,终止线程并在退出进程时释放所有关联的内存。现代操作系统必须这样做,因为进程可能无意中退出,并且不会影响系统稳定性。

但是从您的应用程序的角度来看,这一切都取决于。您的应用可以在肮脏的状态下退出吗?如果你错过了一个磁盘写入会损坏你的数据文件?如果你不发送一个数据包,那么事务就会保持同步?这完全取决于您的应用正在做什么。

2

摘要

这是有效的OpenMP不正确MPI

OpenMP的

从OpenMP的4.0的第3页:

对于C/C++,可执行语句,可能化合物,在顶部的单个 条目和一个出口在底部,或OpenMP 构造。

...

在结构化块中允许调用exit()。

MPI

从MPI 3.1(的MPI_Finalize定义)的357页:

此例程清除所有的MPI状态。如果MPI程序正常终止(即不是由于调用MPI_ABORT或不可恢复的错误),则每个进程在退出之前必须调用MPI_FINALIZE。

实用consequencies

在实践中,通常对违反MPI标准的这一部分最小的不良后果。但是,在调用MPI_Finalize时,可能会导致某些实现中的资源泄漏,最终可能导致系统中的节点无法使用,直到重新引导为止。

因为MPI_Finalize是集体的,所以不能像exit那样使用,尽管您理论上可以使用MPI_Abort在本地退出。但是,这可能会破坏整个MPI环境,因为许多实施并不严格关于本地化故障,即使MPI_Abort被称为MPI_Abort(MPI_COMM_SELF,0)

相关问题