Во-первых, потоки не будут создаваться / уничтожаться на каждой итерации loop1. Обычно существует политика ожидания потока, которой вы можете управлять с помощью переменной окружения OMP_WAITY_POLICY
:
https://www.openmp.org/spec-html/5.0/openmpse55.html#x294 -20640006.7
Кроме того, ничего не происходит (в хотя бы в вашем псевдокоде), мешающем обернуть весь код в один параллельный регион Код вполне может быть:
#pragma omp parallel
for (...) //loop1
{
#pragma omp single
{
//section that needs to be executed only once
}
#pragma omp for
for (...) //loop2
{
...
}
#pragma omp single
{
//section that needs to be executed only once
}
#pragma omp for
for (...) //loop3
{
...
}
...
}
Неявные барьеры в конце каждой конструкции совместного использования (ie, первый сингл, loop2, второй сингл и loop) гарантируют порядок между итерациями. В случае, если эти барьеры не нужны, вы можете избежать их, используя предложение nowait
.