0

我正在运行一个脚本,该脚本通过slurm s命令执行多个后续mpirun调用。每次调用都会将其输出写入自己的目录,但是它们之间存在依赖关系,即给定的运行将使用前一个运行输出目录中的数据。squeuempirun

mpi 程序在内部执行一些迭代优化算法,如果满足某些收敛条件,该算法将终止。每隔一段时间就会发生这种情况,算法会达到一个尚未完全满足这些标准的状态,但是通过绘制输出(连续写入磁盘),我们可以很容易地判断出重要的事情已经收敛,并且进一步的迭代不会再改变最终结果的性质。

因此,我正在寻找一种以受控方式手动终止运行并使外部脚本继续进行下一次mpirun调用的方法。实现这一目标的最佳方法是什么?我无法直接访问实际执行计算的节点,但我当然可以访问所有 slurms 命令和各个运行的工作目录。我可以访问 mpi 程序的完整源代码。

一种可行的解决方案如下:如果想要手动终止运行,可以将一个具有特殊名称的文件killme放在工作目录中,这可以很容易地用touch killme. mpi 程序会定期检查此文件是否存在,如果存在则以受控方式终止。这里根本不涉及外部脚本或 slurm,脚本将继续下一次mpirun调用。你觉得这个解决方案怎么样?你能想到更好的吗?

4

1 回答 1

1

这是获取 SIGUSR1 作为信号的简短代码片段。更详细的解释可以在这里找到。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>

void sighandler(int signum, siginfo_t *info, void *ptr) {
    fprintf(stderr, "Received signal %d\n", signum);
    fprintf(stderr, "Signal originates from process %lu\n",
            (unsigned long) info->si_pid);
    fprintf(stderr, "Shutting down properly.\n");
    exit(0);
}

int main(int argc, char** argv) {
    struct sigaction act;
    printf("pid %lu\n", (unsigned long) getpid());

    memset(&act, 0, sizeof(act));

    act.sa_sigaction = sighandler;
    act.sa_flags = SA_SIGINFO;

    sigaction(SIGUSR1, &act, NULL);

    while (1) {
    };

    return 0;
}
于 2013-06-10T12:19:22.690 回答