【问题标题】:Aborting execution of all processes in MPI中止 MPI 中所有进程的执行
【发布时间】:2012-02-22 06:13:31
【问题描述】:

问题是使用 MPI 将密码搜索到大小约为 10GB 的大文件中。我在块大小为(Total number of bytes in file / P) 的不同进程之间划分了文件,其中 p 是要创建的进程数,并通过并行循环在每个进程中应用我的搜索逻辑。当一个进程找到解决方案时,我想停止其他进程。

所以要中止所有其他进程,我使用以下两种方法。

  1. 第一种方法是在找到解决方案时从进程中调用 MPI_Abort() 函数。
  2. 第二种方法是使用一个标志并在任何进程找到它的解决方案时设置它。设置此标志后,使用非阻塞发送/接收/Iprobe 功能将其发送到所有其他进程。然后每个进程使用if(flag == 1) break检查这个标志;并这样做..

我的第一个问题是上述两种方法中哪一种更好,为什么?
第二个是当我使用第二种方法时,我在成功完成执行后得到了以下 msg...

* MPI_Finalize 发生错误 * MPI 完成后*** MPI_ERRORS_ARE_FATAL(再见) [abc:19150] 在 MPI_INIT 成功完成之前中止;无法保证所有其他进程都被杀死!

* MPI_Finalize 发生错误 * 在 MPI 完成后 * MPI_ERRORS_ARE_FATAL(再见) [abc:19151] 在 MPI_INIT 成功完成之前中止;无法保证所有其他进程都被杀死!

【问题讨论】:

  • 第一种方法远非优雅,但对于快速而肮脏的解决方案可能很实用。为了调试您的第二种方法,您必须提供更详细的问题描述,例如一些代码,其中 MPI 实现,设置。
  • @Zulan 好的先生,从性能的角度来看,哪个更好,为什么第二种方法会出现错误消息
  • @jonathandursi 先生,请给我一些线索!!!
  • 第一种方法通常具有良好的性能(搜索期间没有开销),第二种方法也可以用微不足道的开销实现(可能不是那么简单)。对于错误,您需要提供上下文。
  • @Zulan "对于错误,您需要提供上下文" 我无法阻止错误。上下文是什么意思?

标签: c parallel-processing mpi


【解决方案1】:

MPI_Abort 用于异常工作终止。 The standard 说:

int MPI_Abort(MPI_Comm comm, int errorcode)

这个例程做了一个“最好的尝试”来中止 comm 组中的所有任务。 此函数不需要调用环境对错误代码执行任何操作。

所以它真的应该只作为最后的手段用于退出 MPI 作业,而不是作为正常的退出标志。

对于第二个问题,检查是否有任何进程以某种方式调用MPI_Finalize 两次。此外,一旦调用了MPI_Finalize,就不能使用其他 MPI 函数。

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 2012-04-04
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2016-02-08
    • 2012-12-13
    相关资源
    最近更新 更多