使用 OpenMP 并行解码功能

Parallelize decoding function with OpenMP

我正在尝试并行化以下解码函数(从二进制代码到 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);
}

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

如有任何帮助,我们将不胜感激。

所写的循环不能并行,因为您的 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 语句替换为 if (((code >> j) & 1) == 1)...

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