Анаконда МКЛ не может установить количество потоков - PullRequest
0 голосов
/ 02 ноября 2018

Я использовал numpy от Anaconda для оценки большого умножения матриц (8192x8192 типа float32), например: (в jupyter)

import numpy as np
a = np.empty((8192, 8192), 'f')
%timeit a @ a

numpy строится против MKL. Делая умножение (непрерывно), я нахожу, что загрузка процессора Python всегда составляет 50%. Мне интересно, почему это не 100% (так как умножение матриц должно быть автоматически палатализировано). Поэтому я погуглил и нашел два способа установить количество потоков, используемых MKL.

Одним из способов является непосредственное использование DLL:

from ctypes import CDLL
mkl = CDLL('../conda/pkgs/mkl-2019.0-118/Library/bin/mkl_rt.dll')
print(mkl.MKL_Set_Num_Threads(4))
print(mkl.MKL_Get_Max_Threads())

, который, как мне кажется, дал мне какой-то неизвестный код ошибки и не смог установить:

-899695632
2

Другой способ - через mkl-service пакет:

import mkl
print(mkl.set_num_threads(4))
print(mkl.get_max_threads())

, который также не увенчался успехом.

None
2

Мне интересно, почему установка 4 потоков в MKL не работает и как заставить это работать. Я под Win7, 64bit. Мой процессор i5-2520M, который должен иметь 4 ядра. Моя среда анаконды выглядит так: (сокращенно)

mkl                       2019.0                      118
mkl-service               1.1.2            py36hb217b18_5
mkl_fft                   1.0.6            py36hdbbee80_0
mkl_random                1.0.1            py36h77b88f5_1
numpy                     1.15.3           py36ha559c80_0
numpy-base                1.15.3           py36h8128ebf_0
zeromq                    4.2.5                he025d50_1

1 Ответ

0 голосов
/ 05 ноября 2018

Пожалуйста, рассмотрите эту документацию: https://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-intel-mkl-100-threading

Ключевой переменной является MKL_NUM_THREADS, которую можно установить как глобальную переменную Windows.

Я категорически не согласен с @roro по этому поводу. Причина, по которой вы видите 50%, заключается в том, что вы не используете свои возможности гиперпоточности. Тем не менее, имейте в виду, что есть 2 фактора, ограничивающих скорость вычисления: мощность процессора и !! пропускная способность доступа к памяти. Часто вторая ограничивает скорость до 70% мощности вашего процессора, потому что ОЗУ / кэш не могут доставлять данные достаточно быстро алгоритму.

Правильный параллелизм - одна из самых сложных задач HPC.

...