我有一个for循环,使用(有点复杂)的计数器对象sp_ct
来初始化一个数组。串行代码看起来像优雅地初始化循环openmp线程
sp_ct.depos(0);
for(int p=0;p<size; p++, sp_ct.increment()) {
in[p]=sp_ct.parable_at_basis();
}
我的计数器支持并行化,因为它可以后p
增量初始化状态,导致下面的工作代码片段:
int firstloop=-1;
#pragma omp parallel for \
default(none) shared(size,in) firstprivate(sp_ct,firstloop)
for(int p=0;p<size;p++) {
if(firstloop == -1) {
sp_ct.depos(p); firstloop=0;
} else {
sp_ct.increment();
}
in[p]=sp_ct.parable_at_basis();
} // end omp paralell for
我不喜欢因为这混乱,它掩盖了真正发生的事情,并且因为它在循环中有一个不必要的分支(是的,我知道这对于运行时间可能没有可测量的影响,因为它是,所以可预测......)。
我宁愿写类似
#pragma omp parallel for default(none) shared(size,in) firstprivate(sp_ct,firstloop)
for(int p=0;p<size;p++) {
#prgma omp initialize // or something
{ sp_ct.depos(p); }
in[p]=sp_ct.parable_at_basis();
sp_ct.increment();
}
} // end omp paralell for
这可能吗?
有没有理由不能在循环之外进行初始化? – 2011-01-05 23:56:36
是的,初始化取决于分配给该线程的第一个“p”值。这在循环之外是未知的。 – 2011-01-06 00:05:38