我正在尝试并行编码函数,我尝试在for周围添加一个简单的pragma
,但结果是错误的。我认为迭代是依赖的(通过code
变量),因此它们不能直接并行化。
int encodePrimeFactorization(int number){
int code = 0;
for (int i=PF_NUMBER-1; i>=0 ; i--){
code = code * 2;
int f = prime_factors[i];
if (number % f == 0){
code = code + 1;
}
}
return code;
}
有没有办法让code
变量独立于每次迭代?
答案 0 :(得分:1)
是。至少对我来说,如果你以这种方式看待算法,就更容易思考:
int code = 0;
for (int i=PF_NUMBER-1; i>=0 ; i--) {
code = code << 1;
int f = prime_factors[i];
if (number % f == 0){
// The last bit of code is never set here,
// because it has been just shifted to the left
code = code | 1;
}
}
现在您可以在设置时移动设置位:
int code = 0;
for (int i=PF_NUMBER-1; i>=0 ; i--) {
int f = prime_factors[i];
if (number % f == 0){
code = code | (1 << i);
}
}
现在它变得微不足道了。现在,您可以在设置时移动设置位:
int code = 0;
#pragma omp parallel for reduction(|,code)
for (int i=PF_NUMBER-1; i>=0 ; i--) {
int f = prime_factors[i];
if (number % f == 0){
code |= (1 << i);
}
}
那就是说,你不会获得任何性能提升。这最多只能工作31位,这远远不能从并行化开销中受益。如果这是您的代码中的一个热门部分,您必须找到它周围的东西来应用并行化。