Имеется следующая структура программы:
while(true){
bool cond;
#pragma omp parallel
{
#pragma omp single
{
cond = true;
}
while(cond){
int n = omp_get_thread_num();
do_stuff(n);
#pragma omp barrier
#pragma omp single
{
sync_stuff();
cond = is_end();
}
}
}
}
Вопрос: как гарантировать что каждая итерация внутреннего цикла будет запускаться синхронно всеми тредами? В текущей реализации, несмотря на барьер, похоже, что циклы рассинхронизируются и код зависает.
В конечном итоге, нужно просто циклически параллельно запускать do_struff(), а вся эта свистопляска с синхронизацией циклов вылезла из за того, что если написать просто:
while(true){
bool cond = true;
while(cond){
#pragma omp parallel
{
int n = omp_get_thread_num();
do_stuff(n);
}
sync_stuff();
cond = is_end();
}
}