直到最近,当我使用像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)
在我的另一台笔记本电脑上,它在单个核心上运行良好。这可能是由于一些新的图书馆?
今天早上我通过pip更新了matplotlib和cairocffi,但就是这样。
任何想法如何回归单核?
编辑:
当我跑步时
np.__config__.show()
我得到以下输出
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']
答案 0 :(得分:3)
这可能是因为numpy
正在链接多线程的openBLAS库。尝试设置全局环境变量以将线程关联设置为:
export OPENBLAS_MAIN_FREE=1
# Now run your python script.
另一种解决方法是使用ATLAS
代替OpenBLAS
。有关详细信息,请参阅此帖子(https://shahhj.wordpress.com/2013/10/27/numpy-and-blas-no-problemo/)。这篇文章提出了一些其他可能值得尝试的解决方法。
答案 1 :(得分:2)
如果您使用的是OpenBLAS,请尝试将OPENBLAS_NUM_THREADS环境变量设置为1。OpenBLAS使用所有CPU内核,并且在小型矩阵上效率低下。
export OPENBLAS_NUM_THREADS = 1
您可以在此处了解更多信息:https://github.com/numpy/numpy/issues/8120