У меня была эта проблема раньше. ( Отказ от ответственности: Я работаю с 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 ++)?