Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading python中的并行化方法_Multithreading_Python 3.x_Mpi_Blas_Scientific Computing - Fatal编程技术网

Multithreading python中的并行化方法

Multithreading python中的并行化方法,multithreading,python-3.x,mpi,blas,scientific-computing,Multithreading,Python 3.x,Mpi,Blas,Scientific Computing,我正在一个科学集群上工作,管理员最近对其进行了升级,现在我的代码是超流的,而过去它是相当不错的。我正在使用python 3.4 这类事情的运作方式如下:我必须猜测管理员可能改变了什么,然后让他做出适当的改变,因为如果我直接问他一个问题,我们不会得出任何结论 因此,我使用探查器运行了我的代码,我发现有一些例程被多次调用,这些例程是: 内置方法数组(调用~10^5,执行时间0.003s) 有点像numpy.ndarray(~5000,0.03秒) uniformof mtrand.RandomSta

我正在一个科学集群上工作,管理员最近对其进行了升级,现在我的代码是超流的,而过去它是相当不错的。我正在使用python 3.4

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

因此,我使用探查器运行了我的代码,我发现有一些例程被多次调用,这些例程是:

  • 内置方法数组(调用~10^5,执行时间0.003s)
  • 有点像numpy.ndarray(~5000,0.03秒)
  • uniformof mtrand.RandomState(~2000,0.03s)
  • 我的猜测是,这些库中的一些在以前安装的python版本中是并行的,例如链接到mpi并行化或多重威胁的数学内核库

    我想知道我的猜测是否正确,或者我是否必须考虑其他问题,因为我的代码本身没有改变


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


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



    Numpy已经链接到atlas,我看到了libpthread.so的链接(所以我假设它已经是多线程的,是吗?)


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

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

    • numpy.dot
    • scipy.linalg.cholesky
    • scipy.linalg.svd
    如果你能跑

    import numpy.core._dotblas
    
    如果不获取导入程序,则可以使用优化的
    numpy.dot

    但是,数组创建速度不应受到此影响


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

    最可能的问题是,在更新
    numpy
    链接到用于向量矩阵操作的优化/多线程BLAS库(例如OpenBlas、BLAS Atlas、MKL等)之前,更新后,它使用较慢的引用实现。您是否愿意在分析中显示总时间?如果在那里花费的累积时间很低,那么一个例程被调用10^5次也没什么大不了的。只是想澄清一下,您的python代码本身并不是并行的,而是依赖于BLAS的多线程实现,对吗?@rth我已经编辑了我的问题,并回答了您的评论。。。以前的版本是什么?我猜它是2.x,那么很可能这个版本的python没有被删除。与其跟踪python中发生了什么变化(尽管python本身的变化不应使代码从2变为3变慢),也不必跟踪哪些库链接到了并行数学内核,而现在没有,只需使用python 2解释器可能会更容易。我打赌
    python
    现在链接到了
    python3
    ,但是应该还有
    python2
    可用。@simona:[这个问题]([)其答案提供了有关检查配置的良好信息。
    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)
    
    import numpy.core._dotblas