python

时间:2015-04-28 21:47:53

标签: multithreading python-3.x mpi blas scientific-computing

我正在研究一个最近由管理员升级的科学集群,现在我的代码是超级的,而它曾经是体面的。我正在使用python 3.4

这种事情的工作方式如下:我必须猜测管理员可能已经改变了什么,然后让他做出适当的改变,因为如果我问他一个直接的问题,我们就不会做出任何结论。

所以,我用一个分析器运行我的代码,我发现有一些例程被多次调用,这些例程是:

  1. 内置方法数组(称为~10 ^ 5,执行时间0.003s)
  2. numpy.ndarray(~5000,0.03s)
  3. mofnd.RandomState的统一(~2000,0.03s)
  4. 我的猜测是,其中一些库在以前安装的python版本中进行了并行化,例如链接到mpi-parallelized或多线程数学内核库。

    我想知道我的猜测是否正确,或者我是否需要考虑其他因素,因为我的代码本身并没有改变。

    我在这里引用的例程是最相关的,因为它们占总时间的85%。特别是,如果总时间,数组占55%。我的代码效率降低了10倍。在与系统管理员交谈之前,我想确认这些例程确实有并行版本。

    当然,我无法在群集的新旧配置上测试我的代码,因为旧的配置已经消失。但是我可以看到在这个集群上numpy.array需要8分钟,而在另一个集群上我需要2秒。从top我可以看到所使用的内存总是非常低(~0.1%),而单个CPU的使用率为100%。

     In [3]: numpy.__config__.show()
     lapack_info:
         libraries = ['lapack']
         library_dirs = ['/usr/lib64']
         language = f77
     atlas_threads_info:
         libraries = ['satlas']
         library_dirs = ['/usr/lib64/atlas']
         define_macros = [('ATLAS_WITHOUT_LAPACK', None)]
         language = c
         include_dirs = ['/usr/include']
     blas_opt_info:
         libraries = ['satlas']
         library_dirs = ['/usr/lib64/atlas']
         define_macros = [('ATLAS_INFO', '"\\"3.10.1\\""')]
         language = c
         include_dirs = ['/usr/include']
     atlas_blas_threads_info:
         libraries = ['satlas']
         library_dirs = ['/usr/lib64/atlas']
         define_macros = [('ATLAS_INFO', '"\\"3.10.1\\""')]
         language = c
         include_dirs = ['/usr/include']
     openblas_info:
       NOT AVAILABLE
     lapack_opt_info:
         libraries = ['satlas', 'lapack']
         library_dirs = ['/usr/lib64/atlas', '/usr/lib64']
         define_macros = [('ATLAS_WITHOUT_LAPACK', None)]
         language = f77
         include_dirs = ['/usr/include']
     lapack_mkl_info:
       NOT AVAILABLE
     blas_mkl_info:
       NOT AVAILABLE
     mkl_info:
       NOT AVAILABLE            
    
    ldd /usr/lib64/python3.4/site-packages/numpy/core/_dotblas.cpython-34m.so
         linux-vdso.so.1 =>  (0x00007fff46172000)
         libsatlas.so.3 => /usr/lib64/atlas/libsatlas.so.3 (0x00007f0d941a0000)
         libpython3.4m.so.1.0 => /lib64/libpython3.4m.so.1.0 (0x00007f0d93d08000)
         libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0d93ae8000)
         libc.so.6 => /lib64/libc.so.6 (0x00007f0d93728000)
         libgfortran.so.3 => /lib64/libgfortran.so.3 (0x00007f0d93400000)
         libm.so.6 => /lib64/libm.so.6 (0x00007f0d930f8000)
         libdl.so.2 => /lib64/libdl.so.2 (0x00007f0d92ef0000)
         libutil.so.1 => /lib64/libutil.so.1 (0x00007f0d92ce8000)
         /lib64/ld-linux-x86-64.so.2 (0x00007f0d950e0000)
         libquadmath.so.0 => /lib64/libquadmath.so.0 (0x00007f0d92aa8000)
         libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0d92890000)
    

    Numpy已经链接到地图册,我看到了一个到libpthread.so的链接(所以我认为它已经被多处理,是吗?)。

    另一方面,我将numpy的版本从1.8.2更新到1.9.2,现在array方法只需要5秒而不是300秒。我想这可能是我的代码放慢速度的原因(也许是系统管理员降级了numpy版本?谁知道呢!)

1 个答案:

答案 0 :(得分:1)

并行BLAS仅对有限数量的numpy / scipy函数有帮助(参见这些test scripts);

  • numpy.dot
  • scipy.linalg.cholesky
  • scipy.linalg.svd

如果可以运行

import numpy.core._dotblas

没有获得ImportError,您就可以使用优化的numpy.dot

您可以发布您的代码以及如何使用它吗?或者是一个有问题的最小例子?您的代码如何在群集上运行?