使用 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)...
。
这是许多并行循环的典型特征,您必须在每个循环中进行可能更多的计算,以替换串行版本中每个循环迭代之间携带的值。
我正在尝试并行化以下解码函数(从二进制代码到 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)...
。
这是许多并行循环的典型特征,您必须在每个循环中进行可能更多的计算,以替换串行版本中每个循环迭代之间携带的值。