使用OpenMP并行化解码功能

时间:2017-10-05 06:27:35

标签: loops openmp critical-section

我试图并行化以下解码函数(从二进制代码到int):

int decodePrimeFactorization(int code){
  int prod = 1;
  #pragma omp parallel for
  for (int j=0; j<PF_NUMBER ; j++){
      #pragma omp critical
      {
          if ((code & 1) == 1){
              prod = prod * prime_factors[j];
          }
          code = code / 2;
      }
   } 
   return(prod);
}

虽然循环部分很关键,但结果仍然是错误的。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

写入的循环不能并行,因为code变量的值取决于您所处的循环的迭代。当循环并行时,循环的每次迭代必须是独立的。对于像code这样的值,您需要重写以使循环外部值保持不变,并使用依赖于循环迭代器j的循环内部值。您还应该使关键部分尽可能小;这里唯一的关键行动是更新prod

int decodePrimeFactorization(int code){
int prod = 1;
#pragma omp parallel for
  for (int j=0; j<PF_NUMBER ; j++){
    int code_tmp = (code >> j); // replaces code = code / 2
    if ((code_tmp & 1) == 1){
      #pragma omp critical
      {
        prod = prod * prime_factors[j];
      }
    }
  } 
  return(prod);
}

我使用循环内部值code_tmp来使其更清晰,但您也可以用if (((code >> j) & 1) == 1)...替换if语句。

这是许多并行循环的典型特征,您必须在每个循环中执行更多计算,以替换串行版本中每次循环迭代之间传递的值。