C - 并行化复发omp

时间:2017-02-16 11:51:38

标签: c openmp

我遇到了一个问题:我必须将这段代码与OMP并行化。

存在数据依赖性问题,我不知道如何解决它。 有什么建议?

for (n = 2; n < N+1; n++) {
  dz = *(dynamic_d + n-1)*z;
  *(dynamic_A + n) = *(dynamic_A + n-1) + dz * (*(dynamic_A + n-2));
  *(dynamic_B + n) = *(dynamic_B + n-1) + dz * (*(dynamic_B + n-2));
}

1 个答案:

答案 0 :(得分:1)

由于依赖性,您无法并行化循环迭代,但您可以使用以下部分拆分dynamic_A vs dynamic_B的计算:

#pragma omp parallel sections
{
    #pragma omp section
    {
        // NOTE: Declare n and dz locally so that it is private!
        for (int n = 2; n < N+1; n++) {
            my_type dz = dynamic_d[n-1] * z;
            dynamic_A[n] = dynamic_A[n-1] + dz * dynamic_A[n-2];
        }
    }
    #pragma omp section
    {
        for (int n = 2; n < N+1; n++) {
            my_type dz = dynamic_d[n-1] * z;
            dynamic_B[n] = dynamic_B[n-1] + dz * dynamic_B[n-2];
        }
    }
}

请使用数组索引而不是引用异常的unholy指针算法。