我正在研究一种算法,除了通过使用numpy / scipy之外,我没有尝试对其进行并行化。看htop
,有时代码使用了我所有的内核,有时只使用了一个。我正在考虑使用multiprocessing
或类似方法向单线程部分添加并行性。
假设我拥有所有并行的BLAS / MKL库,是否可以遵循一些经验法则来猜测numpy / scipy ufunc是否将是多线程的?更好的是,在某些地方有记录吗?
为了弄清楚这一点,我查看了:https://scipy.github.io/old-wiki/pages/ParallelProgramming,Python: How do you stop numpy from multithreading?,multithreaded blas in python/numpy。
答案 0 :(得分:1)
您可以尝试获取IDP软件包(Intel® Distribution for Python),其中包含NumPy *,SciPy *和scikit-learn *版本以及集成的英特尔®数学内核库。
这将使您自动对所有Lapack例程进行线程化,无论这样做是否有意义。 您可以在这里找到mkl线程的功能列表: https://software.intel.com/en-us/mkl-linux-developer-guide-openmp-threaded-functions-and-problems
答案 1 :(得分:0)
numpy
和scipy
固有的例程默认情况下允许单线程。您可以选择更改它。
# encoding: utf-8
# module numpy.core.multiarray
# from /path/to/anaconda/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-darwin.so
# by generator 1.145
# no doc
# no imports
# Variables with simple values
ALLOW_THREADS = 1
编译numpy
时,可以通过更改NPY_ALLOW_THREADS
来控制线程:
./core/include/numpy/ufuncobject.h:#if NPY_ALLOW_THREADS
./core/include/numpy/ndarraytypes.h: #define NPY_ALLOW_THREADS 1
对于外部库,我主要发现numpy
和scipy
可以环绕旧版Fortran代码(QUADPACK
,LAPACK
,FITPACK
)。 ..依此类推)。这些库中的所有子例程都在单个线程上计算。
关于MKL依赖性,您链接的SO帖子可以充分回答问题。