0

プログラム全体のさまざまなチェックポイント間で、同じコードを順次および並行して同時に実行するプログラムがあります。これを行うために、最初のプログラムは、親プロセスが並行して実行されている間に、順次実行される子プロセスをフォークします。どちらのプロセスが最初に次のチェックポイントに到達しても、他のプロセスを強制終了し、これが実行の最後まで繰り返されるため、可能な限り高速に実行されます (フォークとコピーのオーバーヘッドは無視されます)。

私はこれを実装しましたが、順次実行のみが最速の場合、または並列実行のみが最速の場合はすべて正常に動作しますが、最初のいくつかのセクションが並列で最速で実行され、続いて次のいくつかのセクションが最速で順次実行されると、両方のプロセスがスリープ状態でプログラムが停止します。何が原因なのかわかりません。分岐プロセスに課せられた制限に達しましたか? 親プロセスを強制終了すると、フォークされた子プロセスの実行に影響を与えることができますか?

以下のコードは、すべてのチェックポイントで実行される関数checkPoint()を提供し、いくつかのカスタム コードが最終セクションの最後を処理します。並列コードは OpenMP を使用して実装され、シーケンシャル コードは OpenMP プラグマ ステートメントに遭遇することはありません。

pid_t parent = 0;
pid_t child = 0;

void checkPoint() {

    if (parent == 0) {

        // First Time
        parent = getpid();

    } else if (child == 0) {

        // Child Process
        kill(parent, SIGKILL);
        parent = getpid();

    } else {

        // Parent Process
        kill(child, SIGKILL);

    }

    child = fork();

}

ありがとう、

ダン

4

1 に答える 1

0

これは、gcc、OpenMP、およびフォークを使用するときに発生するバグであることが判明しました。

http://bisqwit.iki.fi/story/howto/openmp/#OpenmpAndForkから取得

プログラムが daemonize() または他の同様の手段を使用してバックグラウンド プロセスになることを意図している場合、フォークの前に OpenMP 機能を使用してはなりません。OpenMP 機能が使用された後、フォークは、子プロセスが OpenMP 機能を使用しない場合、または完全に新しいプロセスとして使用する場合 (exec() の後など) にのみ許可されます。

于 2013-03-02T21:38:00.483 に答える