我试图并行化以下解码函数(从二进制代码到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);
}
虽然循环部分很关键,但结果仍然是错误的。
任何帮助将不胜感激。
答案 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语句。
这是许多并行循环的典型特征,您必须在每个循环中执行更多计算,以替换串行版本中每次循环迭代之间传递的值。