Можно ли заставить OpenMP вернуться к идеальному количеству потоков после использования omp_set_num_threads? - PullRequest
2 голосов
/ 10 июля 2019

Есть ли способ заставить OpenMP вернуть количество потоков (при следующем использовании) обратно к значению по умолчанию после приложение уже вызвало omp_set_num_threads() с конкретный номер?

Например, есть ли специальный код (например, 0 или -1), который я предоставляю omp_set_num_threads?

Или я должен просто попробовать сделать что-то вроде omp_set_num_threads(omp_get_max_threads())?

Я делаю предположение, что по умолчанию используется то число, которое реализация OpenMP считает «оптимальным». Но я не знаю, что, по крайней мере, гарантированно будет по умолчанию или даже каким оно должно быть. Все, что я знаю, это то, что у меня есть приложение, которое вызывает omp_set_num_threads(4) для одного конкретного блока OpenMP, который я не должен редактировать (пока). Но я бы хотел, чтобы этот параметр не влиял на другие блоки OpenMP в моем коде.

1 Ответ

3 голосов
/ 10 июля 2019

У меня была эта проблема раньше. ( Отказ от ответственности: Я работаю с MSVC, который в настоящее время реализует только стандарт OpenMP 2.0). Насколько мне известно, в стандарте OpenMP 2.0 нет ничего, что позволяло бы узнать это значение по умолчанию. omp_get_max_threads() не требуется его возвращать (все последующие акценты мои):

Функция omp_get_max_threads возвращает целое число, которое гарантированно будет по крайней мере равным числу потоков, которое будет использовано для формирования команды, если параллельная область без предложения num_threads была встречаться в этой точке кода.

Другими словами, он может вернуть число, которое больше, чем текущее установленное (или значение по умолчанию).

Специального значения для omp_set_num_threads также нет:

Функция omp_set_num_threads устанавливает количество потоков по умолчанию, которое будет использоваться для последующих параллельных областей, в которых не указано предложение num_threads. [...] Значение параметра num_threads должно быть положительным целым числом .

И если вы ошиблись, то все зависит от реализации:

Если обнаружена параллельная область, в то время как динамическая регулировка количества потоков отключена, и число потоков, запрошенных для параллельной области , превышает число, которое может предоставить система времени выполнения, поведение программы определяется реализацией . Реализация может, например, прервать выполнение программы или сериализовать параллельную область.

Вы можете найти более точную (и менее тревожную) информацию в документации вашей реализации OpenMP. Однако в случае MSVC эта документация является просто дословной копией стандарта OpenMP 2.0 ...


Поскольку вы занимаетесь модификацией количества потоков таким образом, я хотел бы предупредить о взаимодействии omp_set_dynamic с omp_get_num_threads в MSVC:
Почему omp_set_dynamic (1) никогда не регулирует количество потоков (в Visual C ++)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...