【问题标题】:Is it a bad practice to call exit() inside a parallel region in OpenMP?在 OpenMP 的并行区域内调用 exit() 是一种不好的做法吗?
【发布时间】:2015-12-28 23:25:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c multithreading openmp


    【解决方案1】:

    总结

    这是有效的 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)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        相关资源
        最近更新 更多