直到最近,当我使用像np.dot(A,B)这样的numpy方法时,只使用了一个核心.但是,从今天开始,我的linux机器的所有8个核心都在使用,这是一个问题.
最小的工作示例:
import numpy as np
N = 100
a = np.random.rand(N,N)
b = np.random.rand(N,N)
for i in range(100000):
a = np.dot(a,b)
Run Code Online (Sandbox Code Playgroud)
在我的另一台笔记本电脑上,它在单个核心上运行良好.这可能是由于一些新的图书馆?
今天早上我通过pip更新了matplotlib和cairocffi,但这就是全部.
任何想法如何回到单核心?
编辑:
我跑的时候
np.__config__.show()
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
openblas_info:
libraries = ['openblas', 'openblas']
define_macros = [('HAVE_CBLAS', None)]
language = c
library_dirs = ['/usr/local/lib']
openblas_lapack_info:
libraries = ['openblas', 'openblas']
define_macros = [('HAVE_CBLAS', None)]
language = c
library_dirs = ['/usr/local/lib']
lapack_opt_info:
libraries = ['openblas', 'openblas']
define_macros = [('HAVE_CBLAS', None)]
language = c
library_dirs = ['/usr/local/lib']
blas_mkl_info:
NOT AVAILABLE
blas_opt_info:
libraries = ['openblas', 'openblas']
define_macros = [('HAVE_CBLAS', None)]
language = c
library_dirs = ['/usr/local/lib']
Run Code Online (Sandbox Code Playgroud)
这可能是因为numpy链接到多线程openBLAS库。尝试设置全局环境变量以将线程关联性设置为:
export OPENBLAS_MAIN_FREE=1
# Now run your python script.
Run Code Online (Sandbox Code Playgroud)
可以使用另一种替代方法来ATLAS代替OpenBLAS。请参阅此帖子以了解更多信息(https://shahhj.wordpress.com/2013/10/27/numpy-and-blas-no-problemo/)。这篇文章还提出了一些其他的解决方法,可能值得尝试。