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

8

我正在开发一种算法,除了使用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


对于未来的读者,joblib维护者有一个很酷的包,用于控制blas / etc中的线程:https://github.com/joblib/threadpoolctl - mostsquares
3个回答

2

你在回答中为什么在包名旁边加了一个星号?英特尔的文档(以及其他文档)也使用相同的方式,但我从未看到过解释。 - Kalo

1
< p > 与 numpyscipy 相关的例程默认只允许单线程。如果您愿意,可以更改这一设置。 < /p >
# 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帖子已经足够回答问题。

0
请尝试设置全局变量OMP_NUM_THREADS。这对我的scipy和numpy有效。我使用的函数是, ling.inv()A.dot(B)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接