-1

我们使用带有Perceus (warewulf) 软件的集群来进行一些计算。该软件包具有wwmpirun准备主机文件并执行的程序(Perl 脚本)mpirun

# ...
system("$mpirun -hostfile $tmp_hostfile -np $mpirun_np @ARGV");
# ...

我们使用此脚本在多个节点上运行数学程序 (CODE),通常应该通过 Ctrl+C 停止 CODE,并提供一个带有选项的简短菜单:状态、停止和暂停。但是,使用 MPI 运行时,按 Ctrl+C 会严重杀死 CODE 并丢失数据。

CODE 的开发人员提出了一种解决方法 - 可以通过创建一个名为 的文件来停止程序stop%s,其中%s是 CODE 正在执行的任务文件的名称。这允许停止,但我们无法获得计算状态。有时需要很长时间才能恢复此功能,我们将不胜感激。

您怎么看 - 问题出在 CODE 还是mpirun

有人能找到一种与 CODE 执行的通信的方法mpirun吗?

更新1

在单次运行中,通过按 Ctrl+C 并status通过输入在提供的菜单中选择选项来获取计算状态s。CODE 在 STDOUT 中打印状态信息并继续进行计算。

4

1 回答 1

1
  1. “我们无法获得计算状态” - 这是什么意思?您是否希望以某种方式获得状态但不是?或者该软件不是为了给你地位而设计的?

    您的system调用不会在任何地方重定向标准错误/输出,是状态应该在的位置(在这种情况下,通过打开管道或重定向到日志并让包装器读取日志来捕获它)。

    此外,您不会通过评估systemcall 的返回值来处理返回代码 - 这可能是程序通信的另一种方式。

  2. 您的 Ctrl+C 问题可能是因为 Ctrl+C 被 Perl 包装器捕获,该包装器死掉了,而不是被具有一些不错的 Ctrl+C 中断处理程序的 CODE 捕获。解决方案可能是添加中断处理程序mpirun- 请参阅 Perl Cookbook Recipe 16.18 for $SIG{INT}or http://www.wellho.net/resources/ex.php4?item=p216/sigint;您可能希望 Perl 包装器捕获Ctrl+C并将 INT 信号发送到它启动的 CODE。

于 2010-09-06T21:22:43.333 回答