OpenMP依赖和同步查询

时间:2013-04-26 21:29:16

标签: parallel-processing openmp

我必须在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放在第3和第4个“for”循环中。但是当我将#pragma omp并行用于崩溃(2)时,我得到的结果不正确。

依赖性实际上是“x”和“y”。但无法弄清楚。

对于“l”的值的每次变化(循环最外面),“x”不设置为零。这是造成主要问题的原因。

如果你能提出任何建议,请这样做。

谢谢! 阿迪提。

1 个答案:

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

注意事项:

  1. l:0-&gt; 5所以外循环的总迭代。
  2. 对于 l 的每个值, j:0-&gt; 1 所以 x 如果正确设置为 0 ,那么对于 j 的所有迭代,x的最大值将为:2。
  3. 我修改了索引长度只是有一个可见的输出。
  4. 我使用3个线程运行代码,因此我有 k:0-&gt; 3 ,对于每个k,我们使用 i 为每个线程打印一次值。< / LI>

    我认为问题出在其他地方。祝你好运

    输出:

    ************************** 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
    ***********************************************************