OpenMP не определяет, что реализация OpenMP делает с рабочими потоками. Способ реализации многопоточности полностью зависит от целевой ОС и качества реализации OpenMP.
Разумная реализация OpenMP будет использовать пул потоков, как упомянуто в комментариях. Это означает, что после того, как потоки были порождены для первой параллельной области (что может произойти даже до вызова main()
), потоки будут как можно дольше поддерживаться. Внедрения LL VM и Intel OpenMP поддерживают потоки активными в цикле вращения после завершения параллельной области, так что среда выполнения спасает дорогостоящий запуск потока из ОС.
Если вы дадите более подробную информацию о том, на какую реализацию OpenMP вы нацеливаетесь, я мог бы порекомендовать еще несколько параметров настройки.
РЕДАКТИРОВАТЬ: Добавлена дополнительная информация о том, как в целом контролировать поведение ожидания.
В OpenMP версии 3.0 появилась переменная окружения OMP_WAIT_POLICY
, которая определяет, должны ли потоки вводить ожидание вращения после окончания параллельной области. Если для переменной задано значение active
, потоки вращаются в ожидании и, таким образом, потребляют циклы ЦП. Установите passive
, чтобы потоки не вращались, а ожидали сигнала ОС, не давали процессору или чему-то подобному проснуться для следующей параллельной области. Переменная также влияет на ожидание блокировок и завершение барьера.
OpenMP версии 5.0 определяет API-процедуры omp_pause_resource()
и omp_pause_resource_all()
. Идея состоит в том, чтобы «отключить» достаточно OpenMP, чтобы реализация OpenMP не отбирала ресурсы у потоков, которые были созданы другими параллельными библиотеками или языками. Одно примерное приложение состоит в том, что после окончания параллельных областей OpenMP OpenMP можно отключить, а новая параллельная область с потоками C ++ может занять всю машину. Процедура omp_pause_resource()
останавливает OpenMP на определенном устройстве, тогда как omp_pause_resource_all()
останавливает OpenMP на всех устройствах. Вызовы определяют два уровня: omp_pause_soft
, для которого сохраняется состояние OpenMP, когда позднее OpenMP возобновляет выполнение, и omp_pause_hard
, для которого реализация OpenMP должна быть заново инициализирована с нуля при возобновлении OpenMP.