优化:将大数组传递到ipyparallel中映射的替代方法?

时间:2018-01-09 05:15:43

标签: python multithreading parallel-processing hpc ipython-parallel

我最初在python中的测试3D数组上编写了一个嵌套for循环。由于我想将它应用于需要花费更多时间的大型数组,因此我决定使用ipyparallel进行并行化,将其作为函数编写并使用bview.map。这样我就可以利用超级计算机上的多个核心/节点。

然而,当发送到超级计算机时,代码实际上更慢。当我描述时,似乎花费的时间主要在

方法&#39>获得' of' thread.lock'对象

来自其他堆栈交换线程的

表明这是由于共享数据导致由于同步而导致速度减慢。

我尝试使用map而不是map_sync,但在这种情况下time.sleep占用大约相同的时间。

使用地图或替代方法的正确方法是什么?

问题代码如下所示:

    SSIMarray = numpy.zeros((imx,imy,imz))             
    cenx, ceny, cenz= zip(*itertools.product(range(0,imx), range(0,imy), range(0,imz)))
    amr= bview.map_sync(SSIMfunc, cenx, ceny, cenz)
    SSIMarray = (numpy.asarray(amr))

和分析器结果

 60823909 function calls (60593868 primitive calls) in 201.869 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
  1089003  113.937    0.000  113.937    0.000 {method 'acquire' of 'thread.lock' objects}
    64080    5.223    0.000    6.873    0.000 uuid.py:579(uuid4)
   384352    4.933    0.000    5.145    0.000 {cPickle.dumps}
   640560    4.526    0.000    6.064    0.000 threading.py:260(__init__)
    64019    3.704    0.000   16.941    0.000 asyncresult.py:95(_init_futures)
   640560    3.338    0.000    9.402    0.000 threading.py:242(Condition)
    64077    3.222    0.000   31.562    0.000 client.py:935(_send)
   320327    2.359    0.000    8.756    0.000 _base.py:287(__init__)

0 个答案:

没有答案