-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 或 上arrarr1线程从其他数据中获取数据。

我将 pragma 放在“for”循环内的第 3 和第 4 位。#pragma但是,当我为崩溃(2)放置一个 omp 并行时,我得到了不正确的结果。

实际上,依赖项是针对“x”和“y”的。但无法弄清楚。

这里,“l”(最外层的 for 循环)的值的每次变化都不会将“x”设置为零。这导致了主要问题。

如果您可以提出任何建议,请这样做。

谢谢!阿迪提。

4

1 回答 1

0

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";
}

注意事项:

  1. l: 0->5 所以外循环总共有六次迭代。
  2. 对于lj 的每个值: 0->1所以x如果正确设置为0,那么 x 的最大值将是: 2 对于j的所有迭代。
  3. 我已经修改了索引长度,只有一个可见的输出。
  4. 我用 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
***********************************************************
于 2013-04-27T07:00:51.377 回答