Как управлять глобальными настройками OpenMP из C/C++?
OpenMP не предоставляет API для настройки некоторых важных параметров во время выполнения, например, OMP_WAIT_POLICY или GOMP_SPINCOUNT (по крайней мере, в gcc 4.8.3). Такие настройки предназначены для изменения через переменные среды по некоторым причинам. Не очень удобно.
Есть ли способ изменить такие настройки во время выполнения с C/C++, используя gcc в Linux?
Например, будет ли достаточно изменить соответствующие переменные среды (например, putenv
из stdlib.h?). Примет ли ядро OpenMP новые настройки сразу или прочитает их только один раз при запуске процесса?
PS В Windows Intel C++/Fortran предусмотрены дополнительные функции для настроек (например, kmp_set_blocktime).
2 ответа
Стандарт OpenMP прямо говорит:
Изменения переменных среды после запуска программы, даже если они были изменены самой программой, игнорируются реализацией OpenMP. Однако настройки некоторых из ICV могут быть изменены во время выполнения программы OpenMP с помощью соответствующих положений директив или процедур OpenMP API.
Поэтому, если не дается никаких дескрипторов, либо через директиву компилятора, либо через подпрограмму библиотеки времени выполнения, вы не можете изменять эти значения после запуска кода.
Конечно, так как GOMP_SPINCOUNT
не является стандартизированной переменной среды, она может не соответствовать стандартным требованиям OpenMP... Но это все, что я могу сказать.
Стандарт OpenMP определяет набор переменных внутреннего контроля (ICV), которые влияют на работу среды выполнения. Эти ICV инициализируются из значений определенных переменных среды, а затем некоторые из них могут быть считаны и / или изменены с помощью набора стандартных вызовов API OpenMP.
Список ICV и их значение приведены в §2.3.1 ссылки OpenMP. Список вызовов API, которые можно использовать для извлечения или изменения значений определенных ICV, приведен в §2.3.3.
Все, что не указано в справочнике OpenMP, является нестандартным, и его использование приведет к непереносимым исходным кодам. Кроме того, жесткое кодирование определенных настроек OpenMP в программный код лишает конечного пользователя возможности изменять поведение среды выполнения без необходимости перекомпиляции. Предположение о том, что эти ICV контролируются переменными среды, состоит в том, что существует намного больше сред выполнения, чем вы, программист, можете себе представить.