0

OpenMP を使用してネストされたループを並列化しようとすると問題が発生します。これは、遊んで慣れるための単なるデモ コードです。

int* myresults = new int[1000]   
#pragma omp parallel
{
    #pragma omp for 
    for(int z=0; z<=mainCount;z++)
    {
        results[n++] = myfunc(z,0); //compute something


        for(int i=0;i<=secondCount;i+=5)
        {
            results[n++]=myfunc(z,i);
        }
    }
}

私の問題は、結果配列のインデックス付けです。OpenMP が最初の for ループを並列化しているため、未定義の動作が発生するため (n が正しくインクリメントされているとは保証できないため)、彼はresults[]2 倍以上の位置を使用していると思いますが、正しいでしょうか?results[n++]

結果を正しくインデックス化して保存するにはどうすればよいですか?

4

1 に答える 1

1

nmyfunc(z,0)は に対しておよび1 + secondCount/5回 に対して1 回インクリメントされmyfunc(z,i)ます。これは、外側のループの各反復の最初にあるn必要があることを意味します。z * (2 + secondCount/5)次のようにコードを書き直す必要があります。

#pragma omp parallel for private(n)
for (int z = 0; z <= mainCount; z++)
{
    n = z * (2 + secondCount/5);

    results[n++] = myfunc(z, 0);

    for (int i = 0; i <= secondCount; i += 5)
        results[n++] = myfunc(z, i);
}
于 2012-06-04T06:26:41.360 に答える