У меня есть цикл for, который использует (несколько сложный) объект счетчика sp_ct
для инициализации массива. Серийный код выглядит как
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
Мне не нравится это из-за беспорядка, который скрывает то, что действительно происходит, и из-за того, что у него есть ненужная ветвь внутри цикла (Да, я знаю, что это, вероятно, не окажет ощутимого влияния на время выполнения, потому что 1009 * так предсказуемо ...).
Я бы предпочел написать что-то вроде
#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
Возможно ли это?