我有一个问题:我必须将这段代码与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));
}

最佳答案

由于依赖性,您无法并行化循环迭代,但是可以使用以下部分拆分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];
        }
    }
}


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

关于c - C-并行化递归运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42273169/

10-11 12:20