シミュレーションのインスタンスを並行して実行するために openMP を使用しています。
#pragma omp parallel for private(part) shared(P,lfcc,temp)
for (part = 0; part < P->Parts; part++)
ループの一部は、インデックス番号「part」の出力ファイルが既に存在するかどうかをチェックします (そのため、「Parts」の特定の値に対してシミュレーションを実行し、後で既存の結果を上書きせずに値を増やすことができます)。ただし、これには反復を順番に実行する必要があります。つまり、n スレッドの場合、最初に (1) から (n) の部分を同時に実行し、次に (n+1) から (2n) の部分を実行する必要があります。現在 (3 つのスレッドが並行して実行されており、"parts" が N に設定されている)、最初の部分 (0),(N/3),(2N/3) に続いて (1),(N) が実行され、動作が異なります。 /3+1)、(2N/3+1) など。
ここで、最初に 30 個のパーツがすべて完成したとします。次に、さらにパーツが必要であると判断し、「パーツ」を 45 に変更します。次に、最初のスレッドがパーツ (1)-(15)、2 番目のスレッド (16)-(30)、3 番目のスレッド (31-45) を取得します。最初の 2 つのスレッドは、割り当てられたすべての部分が既に完了していることをすぐに確認し、最後のスレッドをそのままにしておきます (プログラムが終了する前にバリア句を配置した場合)。
簡単な解決策の 1 つは、"part" 変数を 0 ではなく m+1 で開始することです。ここで、m は以前に完了したパーツの数です。しかし、openMP に上記の太字で示されている順序で反復を実行させることができるかどうか疑問に思っていました。