我正在运行一个脚本,通过slurm mpirun
命令执行多个后续squeue
调用。每次调用mpirun
都会将其输出写入自己的目录,但它们之间存在依赖关系,因为给定的运行将使用前运行输出目录中的数据。
mpi程序在内部执行一些迭代优化算法,如果满足某些收敛标准,它将终止。每隔一段时间它就会发生,算法达到一个尚未完全满足这些标准的状态,但是通过绘制输出(连续写入磁盘)可以很容易地说明重要事物已经收敛了进一步的迭代不会再改变最终结果的性质。
我正在寻找的是一种以受控方式手动终止运行并让外部脚本继续进行下一次mpirun
调用的方法。 实现此目的的最佳方法是什么?我没有直接访问实际执行计算的节点,但我当然可以访问所有slurms命令和工作目录个人跑。我可以访问mpi程序的完整源代码。
一个可行的解决方案如下:如果手动想要终止运行,则可以在工作目录中放置一个带有killme
等特殊名称的文件,这可以通过{{1}轻松完成}。 mpi程序会定期检查是否存在此文件,并以受控方式终止(如果存在)。外部脚本或slurm在这里根本不会涉及,脚本将继续下一个touch killme
调用。 您如何看待这个解决方案?你能想到更好的东西吗?
答案 0 :(得分:1)
这是一个简短的代码片段,用于将SIGUSR1作为信号。 可以找到更详细的解释here。
#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;
}