在深入研究并将问题发布在Scipy
GitHub网站上之后,我找到了解决方案。
在我开始之前,这是记录非常好这里-我只是给出一个概述。
这个问题 不
涉及到SciPy的版本,或numpy的,我用。它起源于Numpy和Scipy用于各种线性代数例程的系统BLAS库。您可以通过运行来确定Numpy链接到哪些库
python -c 'import numpy; numpy.show_config()'
如果在Linux中使用OpenBLAS,则可能会发现CPU关联性设置为1,这意味着一旦这些算法以Python(通过Numpy /
Scipy)导入了Python,则最多可以访问CPU的一个核心。要测试这一点,请在Python终端中运行
import osos.system('taskset -p %s' %os.getpid())如果CPU亲和力返回
f的
ff,您可以访问多个内核。就我而言,它是这样开始的,但是在导入numpy或scipy.any_module时,它将切换到
1,因此是我的问题。
我找到了两种解决方案:
更改CPU关联
您可以在main函数的顶部手动设置主进程的CPU亲和力,以使代码如下所示:
import multiprocessingimport numpy as npimport mathimport timeimport osdef compute_something(t): a = 0. for i in range(10000000): a = math.sqrt(t) return aif __name__ == '__main__': pool_size = multiprocessing.cpu_count() os.system('taskset -cp 0-%d %s' % (pool_size, os.getpid())) print "Pool size:", pool_size pool = multiprocessing.Pool(processes=pool_size) inputs = range(10) tic = time.time() builtin_outputs = map(compute_something, inputs) print 'Built-in:', time.time() - tic tic = time.time() pool_outputs = pool.map(compute_something, inputs) print 'Pool :', time.time() - tic请注意,选择一个高于内核数的值
taskset似乎无关紧要-它仅使用最大可能数。
切换BLAS库
解决方案记录在上面链接的站点上。基本上:安装libatlas,然后
update-alternatives将numpy指向ATLAS,而不是OpenBLAS。



