在运行许多进程时缓解共享库瓶颈

时间:2019-10-21 17:04:23

标签: performance numpy shared-libraries intel-mkl numa

我正在使用2个Intel 6230(总共40个内核)的2插槽主板进行基准测试。该计算机正在运行RHEL-7.6,并使用NUMA。我的最终目标是确定在Intel机器与AMD机器上使用Intel的MKL库之间的性能差异。

我使用Anaconda安装了python-3.7.3。查看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个内核上运行它,则每个进程的平均运行时间为1200s。 answer试图提供解决此问题的解决方案。两种可能的解决方案甚至无法正常工作,而RHEL 7.6似乎不容易使用第三个选项(dplace)。

问题

  1. 是否有可能在运行40个进程时造成巨大的性能损失,是因为所有进程竞争访问仅位于内存中一个位置的共享库(可能是libmkl_rt.so)?

  2. 如果为true,是否存在现代解决方案来强迫每个内核使用其自己的共享库副本?我似乎找不到libmkl_rt.so的静态版本来构建numpy

编辑

按照Gennady.F.Intel的建议,我跑了:

$ 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并运行numpy_test.py的40个实例,则平均运行时间约为440秒。在计算机上运行numpy_test.py的单个实例需要240秒钟。我认为差异已得到解释,但问题尚待解答。

0 个答案:

没有答案
相关问题