在OpenMP中调用并行区域内的exit()是不好的做法吗?

时间:2014-12-27 23:08:07

标签: c multithreading openmp

我有一个使用MPI和OpenMP的程序。

主人产生了几个奴隶。 每个从属设备都使用OpenMP进行多线程处理,一个线程专用于通信(MPI_THREAD_FUNNELED)。

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

所以现在我在并行区域内调用exit()函数,但是我想知道这是不是很糟糕的做法,是否有更优雅的方法来退出并行区域内的进程?

2 个答案:

答案 0 :(得分:2)

摘要

这是有效的OpenMP ,但错误的MPI

的OpenMP

来自OpenMP 4.0的第3页:

  

对于C / C ++,一个可执行语句,可能是复合语句,只有一个   顶部的入口和底部的单个出口,或OpenMP   构造

     

...

     

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

MPI

来自MPI 3.1的第​​357页(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)

答案 1 :(得分:1)

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

但从您的应用程序的角度来看,这一切都取决于。您的应用可以退出脏状态吗?如果您错过了磁盘写入会破坏您的数据文件吗?如果你不发送数据包将是交易干净,一切仍然保持同步?这完全取决于您的应用正在做什么。