numpy 水蟒麻木:如何启用多重处理?

6vl6ewon  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(121)

我试图在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环境。

e0bqpujr

e0bqpujr1#

如果你想构建并行处理,你将不得不分解这个问题,并使用python的多线程或多处理工具来实现它。
如果你需要做更复杂的计算,你也可以考虑使用mpi4py。如果你的大多数计算都是numpy计算,我也会考虑使用dask。它有助于分块和并行化你的代码,而且很多numpy函数已经被支持了。

相关问题