Я провожу некоторые тесты на материнской плате с 2 сокетами и 2 Intel 6230 (всего 40 ядер). Компьютер работает под управлением RHEL-7.6 и использует NUMA. Моя конечная цель - определить разницу в производительности между использованием библиотеки Intel MKL на процессорах Intel и AMD.
Я установил python-3.7.3
с помощью Anaconda. Просмотр общей библиотеки numpy
:
ldd /home/user/local/python/3.7/lib/python3.7/site-packages/numpy/linalg/lapack_lite.cpython-37m-x86_64-linux-gnu.so
linux-vdso.so.1 => (0x00002aaaaaacc000)
libmkl_rt.so => /home/user/local/python/3.7/lib/python3.7/site-packages/numpy/linalg/../../../../libmkl_rt.so (0x00002aaaaaccf000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002aaaab3b6000)
libc.so.6 => /lib64/libc.so.6 (0x00002aaaab5d2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002aaaab995000)
/lib64/ld-linux-x86-64.so.2 (0x00002aaaaaaab000)
Вы видите, что она зависит от libmkl_rt.so
. Предположительно, от этого зависят процедуры линейной алгебры, такие как np.dot()
. Поэтому я запускаю следующий код: numpy_test.py
:
import numpy as np
matrixSize = 5000 # outer dim of mats to run on
N = 50 # num of trials
np.random.seed(42)
Ax = matrixSize
Ay = 10000
Bx = 10000
By = matrixSize
A=np.random.rand(Ax,Ay)
B=np.random.rand(Bx,By)
npStartTime = time.time()
for i in range(N):
AB = np.dot(A,B)
print("Run time : {:.4f} s".format((time.time() - npStartTime)))
Запуск с одним ядром (неверно, см. Ниже) занимает около 17,5 секунд. Если я запускаю его на всех 40 ядрах одновременно, среднее время выполнения составляет 1200 с для каждого процесса. Этот ответ пытается предоставить решение для смягчения этой проблемы. Два из возможных решений даже не работают, а третий вариант (dplace
), по-видимому, недоступен для RHEL 7.6.
Вопрос
Возможно ли, что огромный удар по производительности при запуске 40 процессов связан со всеми процессами, конкурирующими за доступ к общей библиотеке(предположительно libmkl_rt.so
), который живет только в одном месте в памяти?
Если это правда, существуют ли современные решения, заставляющие каждое ядро использовать свою собственную копию общей библиотеки? Я не могу найти статическую версию libmkl_rt.so
для сборки numpy
.
РЕДАКТИРОВАТЬ
Следуя совету Геннадия Ф.Интеля, я побежал:
$ export MKL_VERBOSE=1; python3 src/numpy_attempt.py
Numpy + Intel(R) MKL: THREADING LAYER: (null)
Numpy + Intel(R) MKL: setting Intel(R) MKL to use INTEL OpenMP runtime
Numpy + Intel(R) MKL: preloading libiomp5.so runtime
MKL_VERBOSE Intel(R) MKL 2019.0 Update 4 Product build 20190411 for Intel(R) 64 architecture Intel(R) Advanced Vector Extensions 512 (Intel(R) AVX-512) with support of Vector Neural Network Instructions enabled processors, Lnx 2.10GHz lp64 intel_thread
MKL_VERBOSE SDOT(2,0x555555c71cc0,1,0x555555c71cc0,1) 2.58ms CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:40
MKL_VERBOSE DGEMM(N,N,5000,5000,10000,0x7fffffffc870,0x2aaad834b040,5000,0x2aaac05d2040,10000,0x7fffffffc878,0x2aaaf00c4040,5000) 370.98ms CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:40
.
.
Так что я думаюборьба за ресурсы больше связана с тем фактом, что каждый из 40 моих экземпляров запрашивает 40 потоков в каждом, что в общей сложности составляет 1600 потоков. Если я export MKL_NUM_THREADS=1
и запускаю мои 40 экземпляров numpy_test.py
, среднее время выполнения составляет ~ 440 секунд. Запуск одного экземпляра numpy_test.py
на машине занимает 240 секунд. Я думаю, что расхождение объясняется, но на вопросы еще предстоит ответить.