-1

OpenMP のシリアル数値メソッド コードで関数を並列化する必要があります。その構造は次のとおりです。

int x = 0,y;
for(l=0;l <= 1 ;l++){
    y = 0;
    for(j = Xarr[l];j < Xarr[1+l];j++){
        y = y+1;
        x = x+1;
        a = func1(y,l);
        b = func2(y,l);
        for(i = 1; i < 400 ; i++){
            for(k = 1 ; k < 24 ; k ++){ 
                arr[k][i][j] = arr[k][i][j] + .other data.. ;
                arr1[k][**x**][j] = arr1[k][**x**][j] + .other data..; 
        }
     }
  }
}

RHS またはarrではarr1、スレッドは他のデータからデータをフェッチします。

for ループ内の 3 番目と 4 番目にプラグマを配置しました。#pragmaただし、collapse(2) に対して omp を並列に配置すると、誤った結果が得られます。

依存関係は、実際には「x」と「y」です。しかし、把握できません。

ここで、「l」の値が変化するたびに「x」がゼロに設定されるわけではありません (最も外側の for ループ)。それが主な問題を引き起こしています。

何か提案できることがあれば、ぜひそうしてください。

ありがとう!アディティ。

4

1 に答える 1

0

×変化

x = 0;を置くだけです。ループの開始時 (最も外側のループ " l ")。内側のループ (i と k) 内の値 (x と y) は、すべてのスレッドで共有されます。

ループ インデックスは、private として宣言するか、for ループ内で宣言する必要があります。

C++ の配列に沿ったデータは、列に沿って実行されます。a[i][j][k] があるとすると、メモリに沿った次の要素は a[i][j][k+1] です。内側の for ループ (i および k) は、それに応じて配置する必要があります。

collapse() の追加は、通常、両方のインデックスが非常に小さい場合に使用されます。i*k = 400*24、n 個のスレッドがあるとすると、1 つのスレッドが (i*k) の作業負荷を実行し、n-1 個のスレッドは作業なしになります。

可能であれば、jを最も内側のループとして配置してみてください。

int x = 0,y;
for(l=0;l <= 1 ;l++)
{
    x = 0;
    y = 0;
    for(j = Xarr[l];j < Xarr[1+l];j++)
    {
        y = y+1;
        x = x+1;
        a = func1(y,l);
        b = func2(y,l);
        #pragma omp parallel for shared(x, y, j, a, b) private(i, k)
        for(k = 1 ; k < 24 ; k++)
        {
            for(i = 1; i < 400 ; i++)
            { 
                arr[k][i][j] = arr[k][i][j] + .other data.. ;
                arr1[k][**x**][j] = arr1[k][**x**][j] + .other data..; 
            }
        }
    }
}

各「l」に x = 0 が設定されていないことは非常に疑わしいです。次のコードを見てみましょう。

int x, y;
for(int l = 0; l <= 5; l++)
{
    cout << "************************** L = "<< l << " ****************************\n";
    x = 0;
    y = 0;
    for(int j = 0;j < 2;j++)
    {
        y = y+1;
        x = x+1;
        //  a = func1(y,l);
        //  b = func2(y,l);
        #pragma omp parallel for  shared(x, y, j)
        for(int k = 0; k < 3; k++)
        {
            for(int i = 0; i < 1 ; i++)
            { 
                #pragma omp critical
                {
                    cout << "tid:   " << omp_get_thread_num() << " out of " << omp_get_num_threads() <<  "| x:  " << x << " | y: " << y << endl;
                }
                //  arr[k][i][j] = arr[k][i][j] + .other data.. ;
                //  arr1[k][**x**][j] = arr1[k][**x**][j] + .other data..; 
            }
        }
    }
    cout << "***********************************************************\n";
}

注意事項:

  1. l: 0->5 なので、外側のループの反復回数は合計6回です。
  2. ljの各値について: 0->1したがって、xが0に正しく設定されている場合、 x の最大値はjのすべての反復に対して 2 になります。
  3. インデックスの長さを変更しただけで、出力が表示されます。
  4. 3 つのスレッドでコードを実行するので、k:0->3があり、kごとにスレッドごとにiを使用して値を 1 回出力します。

問題は別のところにあると思います。幸運を

出力:

************************** L = 0 ****************************
tid:   0 out of 3| x:  1 | y: 1
tid:   1 out of 3| x:  1 | y: 1
tid:   2 out of 3| x:  1 | y: 1
tid:   2 out of 3| x:  2 | y: 2
tid:   1 out of 3| x:  2 | y: 2
tid:   0 out of 3| x:  2 | y: 2
***********************************************************
************************** L = 1 ****************************
tid:   2 out of 3| x:  1 | y: 1
tid:   1 out of 3| x:  1 | y: 1
tid:   0 out of 3| x:  1 | y: 1
tid:   2 out of 3| x:  2 | y: 2
tid:   1 out of 3| x:  2 | y: 2
tid:   0 out of 3| x:  2 | y: 2
***********************************************************
************************** L = 2 ****************************
tid:   2 out of 3| x:  1 | y: 1
tid:   1 out of 3| x:  1 | y: 1
tid:   0 out of 3| x:  1 | y: 1
tid:   1 out of 3| x:  2 | y: 2
tid:   2 out of 3| x:  2 | y: 2
tid:   0 out of 3| x:  2 | y: 2
***********************************************************
************************** L = 3 ****************************
tid:   2 out of 3| x:  1 | y: 1
tid:   1 out of 3| x:  1 | y: 1
tid:   0 out of 3| x:  1 | y: 1
tid:   2 out of 3| x:  2 | y: 2
tid:   1 out of 3| x:  2 | y: 2
tid:   0 out of 3| x:  2 | y: 2
***********************************************************
************************** L = 4 ****************************
tid:   2 out of 3| x:  1 | y: 1
tid:   1 out of 3| x:  1 | y: 1
tid:   0 out of 3| x:  1 | y: 1
tid:   2 out of 3| x:  2 | y: 2
tid:   1 out of 3| x:  2 | y: 2
tid:   0 out of 3| x:  2 | y: 2
***********************************************************
************************** L = 5 ****************************
tid:   2 out of 3| x:  1 | y: 1
tid:   1 out of 3| x:  1 | y: 1
tid:   0 out of 3| x:  1 | y: 1
tid:   2 out of 3| x:  2 | y: 2
tid:   1 out of 3| x:  2 | y: 2
tid:   0 out of 3| x:  2 | y: 2
***********************************************************
于 2013-04-27T07:00:51.377 に答える