OpenMP тема респауна - PullRequest
0 голосов
/ 10 мая 2019

У меня есть класс с большим количеством математических функций, которые используют OpenMP, чтобы парализовать циклы.Каждый раз, когда я вызываю одну из этих функций класса, создается группа потоков, которые выполняют свою работу и будут удалены.Есть ли возможность избежать разрушения нити и возрождения?Могу ли я сохранить потоки живыми и назначить их другой функции или чему-то еще?Количество потоков не изменяется во время выполнения.

1 Ответ

3 голосов
/ 11 мая 2019

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.

...