Устранение узких мест в общей библиотеке при выполнении многих процессов - PullRequest
0 голосов
/ 21 октября 2019

Я провожу некоторые тесты на материнской плате с 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.

Вопрос

  1. Возможно ли, что огромный удар по производительности при запуске 40 процессов связан со всеми процессами, конкурирующими за доступ к общей библиотеке(предположительно libmkl_rt.so), который живет только в одном месте в памяти?

  2. Если это правда, существуют ли современные решения, заставляющие каждое ядро ​​использовать свою собственную копию общей библиотеки? Я не могу найти статическую версию 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 секунд. Я думаю, что расхождение объясняется, но на вопросы еще предстоит ответить.

...