プログラム全体のさまざまなチェックポイント間で、同じコードを順次および並行して同時に実行するプログラムがあります。これを行うために、最初のプログラムは、親プロセスが並行して実行されている間に、順次実行される子プロセスをフォークします。どちらのプロセスが最初に次のチェックポイントに到達しても、他のプロセスを強制終了し、これが実行の最後まで繰り返されるため、可能な限り高速に実行されます (フォークとコピーのオーバーヘッドは無視されます)。
私はこれを実装しましたが、順次実行のみが最速の場合、または並列実行のみが最速の場合はすべて正常に動作しますが、最初のいくつかのセクションが並列で最速で実行され、続いて次のいくつかのセクションが最速で順次実行されると、両方のプロセスがスリープ状態でプログラムが停止します。何が原因なのかわかりません。分岐プロセスに課せられた制限に達しましたか? 親プロセスを強制終了すると、フォークされた子プロセスの実行に影響を与えることができますか?
以下のコードは、すべてのチェックポイントで実行される関数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();
}
ありがとう、
ダン