Продублирую тему, вдруг тут кто имел дело с openmp, или подскажут как лучше сделать.
Иимеется следующая структура программы:
C++ Source Code:
1
while(true){
2
bool cond;
3
#pragma omp parallel
4
{
5
#pragma omp single
6
{
7
cond = true;
8
}
9
while(cond){
10
int n = omp_get_thread_num();
11
do_stuff(n);
12
#pragma omp barrier
13
14
#pragma omp single
15
{
16
sync_stuff();
17
cond = is_end();
18
}
19
}
20
}
21
}
Есть внешний бесконечный цикл, внутри него параллельная секция. В каждом треде необходимо циклически обрабатывать независимый массив данных. Логика такова, что после каждой внутренней итерации запускается некоторый последовательный код, проверяющий, не выполнено ли условие выхода из цикла.
Вопрос: как гарантировать что каждая итерация внутреннего цикла будет запускаться синхронно всеми тредами? В текущей реализации, несмотря на барьер, похоже, что циклы рассинхронизируются и код зависает.
В конечном итоге, нужно просто циклически параллельно запускать do_struff(), а вся эта свистопляска с синхронизацией циклов вылезла из за того, что если написать просто:
C++ Source Code:
1
while(true){
2
bool cond = true;
3
while(cond){
4
#pragma omp parallel
5
{
6
int n = omp_get_thread_num();
7
do_stuff(n);
8
}
9
sync_stuff();
10
cond = is_end();
11
}
12
}
то, временные затраты на спавн тредов оказываются слишком большими.