【问题标题】:How to write a file after a given run time with MPI?如何使用 MPI 在给定的运行时间后写入文件?
【发布时间】:2012-11-09 07:51:35
【问题描述】:

我有一个用 C 语言编写的模拟代码,与 MPI 并行,在 linux 集群上运行,在 12 小时的挂墙时间后终止作业。然后必须从程序写入的文件中重新启动持续时间超过 12 小时的作业。

我的代码目前在我的模拟的每 N 步中编写这些“重启文件”。在写入重启文件之前,每个节点都处于相同的模拟步骤是很重要的。

在我的情况下,这些文件很大(> 1GB/进程),因此我无法根据需要经常写入(占用大量时间和空间)。

此外,一个模拟步骤的执行时间取决于模拟中发生的情况,因此很难预测我的模拟将在 12 小时内完成的许多步骤。所以我不能决定在我认为将在运行时间 12 小时之前完成的步骤数之后写入重启文件。

因此,当我的作业被终止时,最后一个重新启动文件可能是在几个小时前写入的,这迫使我重做最后 12 小时执行的大部分内容。

因此,我正在寻找一种方法来编写重新启动文件作为运行时间的函数。我曾考虑过使用 MPI_Wtime(),但是对于给定的运行时间,比如 11:50:00,所有处理器不一定都处于同一阶段……这不好。这个问题有简单的解决方案吗?

【问题讨论】:

  • 我认为这个问题太模糊了,无法正确回答。能否详细介绍一下代码的结构?
  • 一些 MPI 实现支持检查点。例如,Open MPI 可以用BLCR 编译。可以指示大多数工作负载管理器在作业运行接近其请求的运行时间结束之前的某个时间传递信号,并且信号处理程序可能会调用 BLCR 检查点。

标签: c mpi hpc


【解决方案1】:

一旦您的流程达到 11:50:00 标记(或其他一些合适的截止日期),使用 MPI_MAX 让它们 AllReduce 完成的迭代次数。然后他们可以准确地赶上迭代次数,并等待其他人用一个简单的屏障做同样的事情。然后他们就可以开始编写重启文件了。

【讨论】:

  • 我看到的问题是,您无法确保在剩余时间(比如 10 分钟)内所有进程都有足够的时间来赶上该迭代次数。
  • 一般来说你是对的 Genis。我没有说但可能很重要的是,我的模拟中的每个时间步都涉及全局通信,因此处理器在每个时间步的某个时间点仍然保持同步。但是,它们可能不会在我要写入重启文件的位置同步。
  • 基本上,代码结构如下: TimeLoop iter=0..end SomeSolving() // 这里涉及到全局通信 if(iter%N ==0) write_restart_file() EndTimeLoop And I '想通过检查经过的时间来替换 if(iter%N==0) 。因为 SomeSolving() 例程涉及全局通信。我确信某些处理器不会比我猜的其他处理器领先超过 1 步。但是,我不能简单地将 if(iter%N==0) 替换为 if(elapsedTime>11:50:00),因为对于同一 iter 上的所有进程而言,情况并非如此。
  • 这是一个我认为模仿我所说的代码:pastebin.com/0hDhYK9g你同意吗?
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多