Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 使用OpenMP并行化解码功能_Loops_Openmp_Critical Section - Fatal编程技术网

Loops 使用OpenMP并行化解码功能

Loops 使用OpenMP并行化解码功能,loops,openmp,critical-section,Loops,Openmp,Critical Section,我正在尝试并行化以下解码函数(从二进制代码到int): int分解(int代码){ int prod=1; #pragma-omp并行 对于(int j=0;j写入的循环不能并行,因为code变量的值取决于所处循环的哪个迭代。使循环并行时,循环的每个迭代必须是独立的。对于code之类的值,需要重写以保持循环外部值不变,并使用loop内部值,该值依赖于循环迭代器j。您还应该使临界部分尽可能小;这里唯一的关键操作是更新prod int decodePrimeFactorization(int cod

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

int分解(int代码){
int prod=1;
#pragma-omp并行

对于(int j=0;j写入的循环不能并行,因为
code
变量的值取决于所处循环的哪个迭代。使循环并行时,循环的每个迭代必须是独立的。对于
code
之类的值,需要重写以保持循环外部值不变,并使用loop内部值,该值依赖于循环迭代器
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);
}
int分解(int代码){
int prod=1;
#pragma-omp并行
对于(int j=0;j>j);//替换code=code/2
如果((代码tmp&1)==1){
#pragma-omp-critical
{
prod=prod*素数因子[j];
}
}
} 
返回(prod);
}
我使用一个循环内部值
code\u tmp
来更清楚地说明需要什么,但是您也可以用
if(((code>>j)&1)==1)替换if语句。


这是许多并行循环中的典型例子,在每个循环中,你必须做更多的计算来替换串行版本中每个循环迭代之间所携带的值。

而不是下注的问题,请解释我如何改进它。我没有投票,但我认为把一个关键的语用涵盖所有的PAR行。allel循环是胡说八道。那么应该并行什么呢?我同意。我开始在这两条指令上使用两个原子指令,但都不起作用。所以我尝试了这个(尽管它没有带来任何好处)只是为了检查它是否会给出正确的结果,它仍然不起作用!这太有道理了,我不应该引发依赖迭代。谢谢!