我必须在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
线程从其他数据中获取数据。
我把pragma放在第3和第4个“for”循环中。但是当我将#pragma
omp并行用于崩溃(2)时,我得到的结果不正确。
依赖性实际上是“x”和“y”。但无法弄清楚。
对于“l”的值的每次变化(循环最外面),“x”不设置为零。这是造成主要问题的原因。
如果你能提出任何建议,请这样做。
谢谢! 阿迪提。
答案 0 :(得分:0)
x更改
只需在循环开头放置 x = 0; (最外圈“ l ”)。内部循环(i和k)内的值(x和y)将由所有线程共享。
循环索引需要声明为private或在for循环中声明。
c ++中数组中的数据沿着列运行。假设你有[i] [j] [k]那么沿着记忆的下一个元素是[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 ****************************
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
***********************************************************