0

slurm sコマンドを使用して複数の後続のmpirun呼び出しを行うスクリプトを実行しています。への各呼び出しは、その出力を独自のディレクトリに書き込みますが、特定の実行が以前の実行出力ディレクトリからのデータを使用する方法で、それらの間に依存関係があります。squeuempirun

mpi プログラムは、何らかの収束基準が満たされた場合に終了する反復最適化アルゴリズムを内部的に実行します。時折、アルゴリズムがこれらの基準がまだ完全に満たされていない状態に達することがありますが、出力 (ディスクに継続的に書き込まれます) をプロットすることで、重要なことが収束したことを非常に簡単に知ることができます。さらに反復しても、最終結果の性質が変わることはありません。

したがって、私が探しているのは、制御された方法で実行を手動で終了し、外側のスクリプトを次のmpirun呼び出しに進める方法です。これを達成するための最良の方法は何ですか?計算が実際に実行されるノードに直接アクセスすることはできませんが、もちろん、すべての slurms コマンドと個々の実行の作業ディレクトリにアクセスできます。mpi プログラムの完全なソース コードにアクセスできます。

動作する 1 つの解決策は次のとおりです。実行を手動で終了したい場合killmeは、作業ディレクトリなどに特別な名前のファイルを配置しますtouch killme。mpi プログラムは定期的にこのファイルの存在をチェックし、存在する場合は制御された方法で終了します。ここでは外側のスクリプトまたはスラームはまったく関与せず、スクリプトは次の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 に答える