Python MPI如何减少工作量

Python MPI如何减少工作量,python,mpi,ipython,mpich,Python,Mpi,Ipython,Mpich,我没有太多的MPI经验,我试图了解如何减少工作。下面是一个受此启发的简单示例。从IPython笔记本电脑数据板在本地计算机上启动2个MPI引擎,如下所示: In [1]: import numpy as np from IPython.parallel import Client In [2]: c = Client(profile='mpi') In [3]: view = c[:] In [4]: view.scatter('a', np.arange(4.)) Out

我没有太多的MPI经验,我试图了解如何减少工作。下面是一个受此启发的简单示例。从IPython笔记本电脑数据板在本地计算机上启动2个MPI引擎,如下所示:

In [1]: import numpy as np
        from IPython.parallel import Client

In [2]: c = Client(profile='mpi')

In [3]: view = c[:]

In [4]: view.scatter('a', np.arange(4.))
Out[4]: <AsyncResult: scatter>

In [5]: %%px
        from mpi4py import MPI
        import numpy as np

        print MPI.COMM_WORLD.allreduce(np.sum(a), op=MPI.SUM)
[stdout:0] 1.0
[stdout:1] 5.0
[1]中的
:将numpy作为np导入
从IPython.parallel导入客户端
在[2]中:c=Client(profile='mpi')
在[3]中:视图=c[:]
在[4]中:view.scatter('a',np.arange(4.))
出[4]:
在[5]中:%%px
从mpi4py导入MPI
将numpy作为np导入
打印MPI.COMM\u WORLD.allreduce(np.sum(a),op=MPI.sum)
[stdout:0]1.0
[stdout:1]5.0
我希望每个引擎都能打印“6.0”,就像IPython教程中那样。这里,好像没有执行还原操作。这可能很简单,但我不太明白我做错了什么

我使用:

  • Ubuntu 12.04
  • Python 2.7.3 32位
  • IPython 1.1.0
  • mpi4py 1.2.2
  • mpich2

如果您的发动机不是用MPI启动的,您会看到这种行为。由于您的引擎没有MPI对等点,allreduce什么都不做——它只返回每个引擎上的
np.sum(a)
值,这就是您看到的

最好检查MPI是否正确设置:

%px print MPI.COMM_WORLD.Get_rank(), MPI.COMM_WORLD.Get_size()
如果您的引擎不在同一MPI世界中,您的输出将如下所示:

[stdout:0] 0 1
[stdout:1] 0 1
如果是:

[stdout:0] 0 2
[stdout:1] 1 2
确保使用MPI启动发动机。例如:

ipcluster start --engines MPI
或添加到ipcluster_config.py:

c.IPClusterEngines.engine_launcher_class = 'MPI'
或者只需手动执行,无需任何配置(以上配置都会执行此操作):


我想知道,与python教程不同,您使用的是allrecude(小写-a),而他们使用的是Allreduce(大写a),这一事实是否重要?使用Allreduce会导致完全相同的问题。我在这里使用allreduce只是为了使示例更短。你说得对。使用
ipcluster start-n2--engines MPI--profile=MPI启动发动机可以解决此问题。我之前所做的是
ipythonprofile-create--parallel--profile=mpi
,然后从ipython仪表板启动引擎(由于配置文件名为“mpi”,但默认情况下它们不是真正的mpi引擎)。如果我在
ipcluster\u config.py
中添加
c.IPClusterEngines.engine\u launcher\u class='MPI'
,它就会工作。无论如何,谢谢!这很有帮助。
mpiexec -n 4 ipengine