我有一個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