1

100000000 の整数配列内の要素を検索し、それを i+1 (i は要素のインデックス) に初期化するプログラムを作成しました。ここで、私は 73500320 を探しており、見つかった場合は整数 'me' を 1 に更新します。'me' は -1 に初期化されました。しかし、私が私を印刷すると、時々 -1 として印刷され、時には 1 として印刷されます (常に見つかるはずです!) エラーがわかりません...

#pragma omp parallel 
{
    int thread = omp_get_thread_num();
    int num_thread=omp_get_num_threads();
    int beginpos = (thread + 0) * (100000000 / num_thread);
    int endpos   = (thread + 1) * (100000000 / num_thread);
    for (i = beginpos; i < endpos; i++)
    {
        #pragma omp flush(done)
        if (done == 1)
        {
            break;
        }

        if (a[i] == 73500320)
        { 
            /* Inform the other threads that we found the element. */
            done = 1;
            #pragma omp flush(done)
            me = 1;
            break;
        }
    }
}
4

1 に答える 1

0

break ステートメントは実際にはオープン mp ループで使用できるものではないため、次のコードを検討してください。

OpenMP 静的スケジュールを使用します (並列領域の最初に追加したロジックに似ています)。

したがって、私は暗黙的にプライベートであり、私と完了は明示的に共有され、すべてのスレッドが作業を終了する必要があり、すぐに終了できないことに同意します。しかし、たとえば VS'2012 では、[並列 for ループ] コンストラクトにブレークを入れようとすると、「エラー C3010: 'break': OpenMP 構造化ブロックからのジャンプは許可されていません」というメッセージが表示されます。

#pragma omp parallel for shared(me, done)
for (int i = 0; i <  100000000; i++)
{
    if (done == -1)
    {
    if (a[i] == 73500320)
    { 
        cout << "thread " << omp_get_thread_num() << " found at i=" << i << endl;
        me = 1;
        done = 1;          
    }
    }
}

cout << me << endl;
于 2013-07-10T07:12:48.523 に答える