1

並列化のオーバーヘッドを最小限に抑えるために、並列領域内に while を保持しながら、反復プロセスのコードを作成しようとしています。

コードはこのようなものです 問題はそれが決して終了しないことです。可能であれば、これについてのあなたの考えを教えてください

#include <stdio.h>
#include <omp.h>
int main(int argc, char **argv)
{
    float error = 20;
#pragma omp parallel shared(error)
    {
        while (error > 5)
        {
#pragma omp for  reduction(-:error)
            for (int i=0; i<10; ++i)
            {
                error -= 1;
            }
        }

    }
    fprintf(stderr, "Program terminated\n");
    return 0;
}
4

2 に答える 2

2

これは面白い小さな問題です。私は圧倒的なopenmpの経験はありませんが、あなたのコードでいくつかの実験を行った後、並列forループに入るときの同期の欠如が問題の原因であると思います(コードを「監視」するために書き込みステートメントを挿入します)。

並列 for ループの直前にバリアを挿入することで、コードを機能させることができます。

#pragma omp barrier
#pragma omp for reduction(-:error)
   for(int i=0; i<10; ++i)

その障壁がなく、2 つのスレッドで実行されていると、1 つのスレッドが 2 回目の for ループに入り、error5 に減少します。そのとき、もう 1 つのスレッドは 2 番目の for ループにまったく入らず、システムは、並列 for という奇妙な状態になります。ループは 1 つのスレッドによって実行されましたが、他のスレッドは参加を拒否しています。これは、並列ループ内で共有変数に書き込み、それらを別の場所で制御変数として使用することに関する警告です

于 2011-12-03T15:06:36.183 に答える