OpenMP |使用依赖迭代并行化循环

时间:2017-10-21 11:19:50

标签: c parallel-processing openmp pragma

我正在尝试并行编码函数,我尝试在for周围添加一个简单的pragma,但结果是错误的。我认为迭代是依赖的(通过code变量),因此它们不能直接并行化。

int encodePrimeFactorization(int number){
    int code = 0;
    for (int i=PF_NUMBER-1; i>=0 ; i--){
      code = code * 2;
      int f = prime_factors[i];
      if (number % f == 0){
        code = code + 1;
      }
    }
    return code;
}

有没有办法让code变量独立于每次迭代?

1 个答案:

答案 0 :(得分:1)

是。至少对我来说,如果你以这种方式看待算法,就更容易思考:

int code = 0;
for (int i=PF_NUMBER-1; i>=0 ; i--) {
  code = code << 1;
  int f = prime_factors[i];
  if (number % f == 0){
    // The last bit of code is never set here,
    // because it has been just shifted to the left
    code = code | 1;
  }
}

现在您可以在设置时移动设置位:

int code = 0;
for (int i=PF_NUMBER-1; i>=0 ; i--) {
  int f = prime_factors[i];
  if (number % f == 0){
    code = code | (1 << i);
  }
}

现在它变得微不足道了。现在,您可以在设置时移动设置位:

int code = 0;
#pragma omp parallel for reduction(|,code)
for (int i=PF_NUMBER-1; i>=0 ; i--) {
  int f = prime_factors[i];
  if (number % f == 0){
    code |= (1 << i);
  }
}

那就是说,你不会获得任何性能提升。这最多只能工作31位,这远远不能从并行化开销中受益。如果这是您的代码中的一个热门部分,您必须找到它周围的东西来应用并行化。