我试图在Numpy的Anaconda安装中启用多线程/多处理。我的测试程序如下:
import os
import numpy as np
from timeit import timeit
size = 1024
A = np.random.random((size, size)),
B = np.random.random((size, size))
print 'Time with %s threads: %f s' \
%(os.environ.get('OMP_NUM_THREADS'),
timeit(lambda: np.dot(A, B), number=4))
我更改了环境变量OMP_NUM_THREADS
,但无论其值如何,运行代码所需的时间始终相同,并且始终使用单核。
看来我的Numpy与OpenBlas有关联:
numpy.__config__.show()
lapack_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/home/myuser/anaconda3/envs/py2env/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blas_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/home/myuser/anaconda3/envs/py2env/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/home/myuser/anaconda3/envs/py2env/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blis_info:
NOT AVAILABLE
openblas_lapack_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/home/myuser/anaconda3/envs/py2env/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
这是conda list
中与我相关部分:
conda list | grep blas
blas 1.1 openblas conda-forge
libblas 3.9.0 1_h6e990d7_netlib conda-forge
libcblas 3.9.0 3_h893e4fe_netlib conda-forge
numpy 1.14.6 py27_blas_openblashd3ea46f_200 [blas_openblas] conda-forge
openblas 0.2.20 8 conda-forge
scikit-learn 0.19.2 py27_blas_openblasha84fab4_201 [blas_openblas] conda-forge
我也尝试过设置OPENBLAS_NUM_THREADS
,但确实有什么不同。我在conda 4.12.0
中使用了python 2. 7环境。
1条答案
按热度按时间e0bqpujr1#
如果你想构建并行处理,你将不得不分解这个问题,并使用python的多线程或多处理工具来实现它。
如果你需要做更复杂的计算,你也可以考虑使用mpi4py。如果你的大多数计算都是numpy计算,我也会考虑使用dask。它有助于分块和并行化你的代码,而且很多numpy函数已经被支持了。