×変化
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";
}
注意事項:
- l: 0->5 なので、外側のループの反復回数は合計6回です。
- l、jの各値について: 0->1したがって、xが0に正しく設定されている場合、 x の最大値はjのすべての反復に対して 2 になります。
- インデックスの長さを変更しただけで、出力が表示されます。
- 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
***********************************************************