我们使用Ananconda python环境安装了mpi4py和petsc。它运行mpi适用于mpi4py和petsc喜欢的测试代码
$ mpirun -n 4 python ./test.py
但是当我们运行OpenMdao v2.2.0的测试mpi代码时,我们总是会收到错误
$ mpirun -n 4 python ./test_proc_alloc.py
ERROR: test_4_subs_max2 (__main__.ProcTestCase5)
----------------------------------------------------------------------
Traceback (most recent call last):
File "./test_proc_alloc.py", line 186, in test_4_subs_max2 p = _build_model(nsubs=4, max_procs=[2,2,2,2]) File "./test_proc_alloc.py", line 47, in _build_model p.setup(vector_class=vector_class, mode=mode, check=False)
File "anaconda2/5.0.0/lib/python2.7/site-packages/openmdao/core/problem.py", line 409, in setup model._setup(comm, 'full', mode)
File "anaconda2/5.0.0/lib/python2.7/site-packages/openmdao/core/system.py", line 714, in _setup.self._setup_var_sizes(recurse=recurse)
File "anaconda2/5.0.0/lib/python2.7/site-packages/openmdao/core/group.py", line 466, in _setup_var_sizes subsys._setup_var_sizes(recurse)
File "anaconda2/5.0.0/lib/python2.7/site-packages/openmda /core/component.py", line 233, in _setup_var_sizes self.comm.Allgather(sizes[type_][iproc, :], sizes[type_])
File "MPI/Comm.pyx", line 640, in mpi4py.MPI.Comm.Allgather (src/mpi4py.MPI.c:98562) Exception: Invalid buffer pointer, error stack: PMPI_Allgather(1093): MPI_Allgather(sbuf=0x5629c3c809e8, scount=1, MPI_LONG, rbuf=0x5629c3c809e0, rcount=1, MPI_LONG, MPI_COMM_WORLD) failed
PMPI_Allgather(1026):缓冲区不能有别名
错误是什么?感谢。
答案 0 :(得分:0)
在使用MPI4py v3.0.0,基于Intel MPI构建的PETSc v3.8.1的OpenMDAO v2.6运行时,我遇到了完全相同的错误。问题似乎是,在较新版本的MPI4py上,不允许在同一缓冲区(在这种情况下,使用AllGather函数)中发送和接收数据。简单的解决方法是深度复制snd缓冲区,这似乎可以解决问题。我已经在我们自己的工作流程之一中对此进行了测试,并尝试并行运行一些现在看来有效的OpenMDAO测试脚本。
您可以在此处查看MR:https://github.com/OpenMDAO/OpenMDAO/pull/904。请尝试检出我的叉子上的分支,看看它是否还能解决您的问题。