【问题标题】:How does MPI allreduce workMPI allreduce 是如何工作的
【发布时间】:2013-12-03 17:09:54
【问题描述】:

我对 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 教程中一样。这里,就好像没有执行归约操作一样。这可能很简单,但我不太明白我做错了什么?

我用:

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

【问题讨论】:

  • 我想知道,与 python 教程不同,您使用 allrecude(小写-a)而他们使用 Allreduce(大写 a)这一事实是否重要?
  • 使用 Allreduce 会导致完全相同的问题。我在这里使用 allreduce 只是为了使示例更短。

标签: python mpi ipython mpich


【解决方案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

【讨论】:

  • 你是对的。使用ipcluster start -n 2 --engines MPI --profile=mpi 启动引擎可以解决问题。我之前做的是ipython profile create --parallel --profile=mpi,然后从 IPython 仪表板启动引擎(由于配置文件而命名为“MPI”的引擎,但默认情况下它们并不是真正的 MPI 引擎)。如果我在ipcluster_config.py 中添加c.IPClusterEngines.engine_launcher_class = 'MPI',它会起作用。无论如何,谢谢!这很有帮助。
猜你喜欢
  • 2020-09-07
  • 2015-11-08
  • 2022-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2018-09-10
  • 2014-07-01
  • 2012-01-18
相关资源
最近更新 更多