x 变化
只需输入x = 0; 在循环的开头(最外层循环“ l ”)。内部循环(i 和 k)内的值(x 和 y)将由所有线程共享。
循环索引,需要声明为私有或在 for 循环中声明。
c++ 中数组中的数据沿列运行。假设你有 a[i][j][k],那么内存中的下一个元素是 a[i][j][k+1]。内部 for 循环(i 和 k)应相应安排。
当两个索引都非常小时,通常使用添加 collapse()。i*k = 400*24,假设您有 n 个线程,那么一个线程将完成 (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 所以外循环总共有六次迭代。
- 对于l,j 的每个值: 0->1所以x如果正确设置为0,那么 x 的最大值将是: 2 对于j的所有迭代。
- 我已经修改了索引长度,只有一个可见的输出。
- 我用 3 个线程运行代码,所以我有k:0->3并且对于每个 k,我们用i为每个线程打印一次值。
我认为问题出在其他地方。祝你好运
输出:
************************** 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
***********************************************************