我对MPI没有多少经验,我试着了解allreduce的工作原理。以下是受此IPython tutorial启发的简单示例。 2台MPI引擎在本地计算机上从IPython笔记本虚拟机板启动:
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
我希望每个引擎都能打印“6.0”,就像在IPython教程中一样。这里,好像没有进行还原操作。这可能很简单,但我不太明白我做错了什么?
我用:
答案 0 :(得分:1)
如果您的引擎实际上没有使用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'
或者只是在没有任何配置的情况下手动完成(无论如何这都是以上配置):
mpiexec -n 4 ipengine