numpy / scipy中的哪些操作是多线程的?

时间:2019-02-07 16:05:23

标签: python multithreading numpy scipy

我正在研究一种算法,除了通过使用numpy / scipy之外,我没有尝试对其进行并行化。看htop,有时代码使用了我所有的内核,有时只使用了一个。我正在考虑使用multiprocessing或类似方法向单线程部分添加并行性。

假设我拥有所有并行的BLAS / MKL库,是否可以遵循一些经验法则来猜测numpy / scipy ufunc是否将是多线程的?更好的是,在某些地方有记录吗?

为了弄清楚这一点,我查看了:https://scipy.github.io/old-wiki/pages/ParallelProgrammingPython: How do you stop numpy from multithreading?multithreaded blas in python/numpy

2 个答案:

答案 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)

numpyscipy固有的例程默认情况下允许单线程。您可以选择更改它。

# 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

对于外部库,我主要发现numpyscipy可以环绕旧版Fortran代码(QUADPACKLAPACKFITPACK)。 ..依此类推)。这些库中的所有子例程都在单个线程上计算。

关于MKL依赖性,您链接的SO帖子可以充分回答问题。