Будет ли `mkl_set_num_threads` верхним пределом для числа потоков ЦП? - PullRequest
5 голосов
/ 15 февраля 2020

В OpenBLAS, если вы вызываете openblas_set_num_threads, запрашивая количество потоков, которое должно быть больше, чем количество потоков CPU, которое у вас есть, тогда фактическое количество потоков, которое будет установлено для использования, равно вашему количеству CPU Threads.

Это можно увидеть в исходном коде

Мне интересно, имеет ли MKL такое же поведение? В документах это явно не упоминается. но они говорят:

Указанное число является подсказкой, и Intel® MKL может фактически использовать меньшее число.

Ответы [ 2 ]

4 голосов
/ 19 февраля 2020

Кажется, ограничение на количество ядер (не количество потоков). Код ниже работал на 6-ядерном процессоре Intel Core i7:

julia> using MKL_jll

julia> get_max_threads() = ccall((:mkl_get_max_threads, libmkl_rt), Int32, ());

julia> set_max_threads(n) = ccall((:mkl_set_num_threads, libmkl_rt), Cvoid, (Ptr{Int32},), Ref(Int32(n)));

julia> get_max_threads()
6

julia> set_max_threads(4)

julia> get_max_threads()
4

julia> set_max_threads(8)

julia> get_max_threads() # maxed out at 6
6

julia> set_max_threads(24)

julia> get_max_threads() # maxed out at 6
6

julia> set_max_threads(1)

julia> get_max_threads()
1
1 голос
/ 21 февраля 2020

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 и установив максимальное число потоков, я действительно могу видеть снижение производительности из-за увеличения нагрузки.

...