MKL ведет себя иначе, и фактически у вас может быть больше потоков, чем есть ядер.
Причина, по которой @Kristoffer не видит этого в своем ответе, заключается в том, что настройка Dynami c включено по умолчанию :
По умолчанию Intel® MKL может динамически настраивать указанное количество потоков. [...] Если регулировка числа потоков Dynami c отключена, Intel® MKL пытается использовать указанное количество потоков во внутренних параллельных областях (для получения дополнительной информации см. Руководство разработчика Intel® MKL). Используйте функцию mkl_set_dynami c для управления настройкой динамического числа c числа потоков.
Так что, если мы используем mkl_set_dynamic(0)
для отключения регулировки динамического c, мы увидим следующее:
>>> set_max_threads(44)
>>> get_max_threads()
6
>>> mkl_set_dynamic(0)
>>> get_max_threads()
44
Итак, мы видим, что без настройки Dynami c MKL может использовать 44 потока. Является ли это действительно так, другой вопрос, объясняет справка к mkl_get_dynamic
(даже если информация кажется мне несколько устаревшей, так как get_max_threads
уже учтена в get_max_threads
):
Предположим, что функция mkl_get_max_threads
возвращает число потоков, равное N. [...] Если динамическая настройка отключена, Intel ® MKL запрашивает ровно N потоков для внутренних параллельных областей ( [...]). Однако библиотека времени выполнения OpenMP * может быть сконфигурирована для предоставления * на 1024 * меньше потоков , чем запросы Intel® MKL, в зависимости от параметра динамической настройки OpenMP *.
Метод OpenMP дано в алгоритме 2.1 спецификация OpenMP-5.0 (что я не претендую на понимание).
На моей машине важными значениями являются omp_get_thread_limit()=2147483647
и omp_get_dynamic()=0
, поэтому, отключив MKL_DYNAMIC
и установив максимальное число потоков, я действительно могу видеть снижение производительности из-за увеличения нагрузки.