问题标签 [mpi4py]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2280 浏览

python - 使用带有 mpi4py 的主机文件生成进程

我正在尝试使用 MPI4py 和 OpenMPI 在多个主机上生成一组工作进程,但 spawn 命令似乎忽略了我的主机文件。我已经发布了我的完整测试,但这里是关键部分:

基于论坛讨论,我的经理脚本调用 spawnhostfile选项:

worker_hosts文件中,我列出了 Scyld Beowulf 集群中的节点:

经理和工人都打电话MPI.Get_processor_name(),但他们都报告“myhead1”。如果我使用相同的主机文件,mpirun它可以工作:

如果我将主机文件的名称更改为不存在的名称,例如bogus_file,我会收到错误消息:

所以 OpenMPI 注意到了这个hostfile选项,它似乎没有使用它。该hostfile选项列在OpenMPI 文档中。

如何为生成请求指定主机文件?

0 投票
1 回答
2716 浏览

python - 使用 mpi4py 在脚本中调用子进程

我无法从我的 python 脚本调用外部程序,我想在其中使用 mpi4py 在不同处理器之间分配工作负载。

基本上,我想使用我的脚本,以便每个内核在单独的文件夹中准备一些用于计算的输入文件,然后在该文件夹中启动一个外部程序,等待输出,最后读取结果并收集它们。

但是,我根本无法让外部程序调用工作。在寻找解决这个问题的方法时,我发现我面临的问题似乎非常根本。下面的简单示例说明了这一点:

./script.py工作正常(两个调用都有效),而mpirun -np 1 ./script.py只有输出test. 这种情况有什么解决方法吗?该程序肯定在我的 PATH 中,但如果我使用绝对路径进行调用,它也会失败。

这个SO问题似乎是相关的,遗憾的是没有答案......

编辑:

在我的问题的原始版本中,我没有包含任何使用 mpi4py 的代码,即使我在标题中提到了这个模块。所以这里有一个更详细的代码示例:

不幸的是,除了它是启用 MPI 的 C++ 应用程序之外,我无法提供有关外部可执行文件 EXTERNAL_PROGRAM 的更多详细信息。正如下面评论部分所写,我怀疑这就是我的外部程序调用基本上被忽略的原因(或原因之一)。

请注意,我知道在这种情况下,没有人可以重现我的确切情况。但是,我仍然希望这里有人已经遇到过类似的问题并且可能能够提供帮助。

为了完整起见,操作系统是 Ubuntu 14.04,我使用的是 OpenMPI 1.6.5。

0 投票
1 回答
1185 浏览

python - 使用来自 Python 的 1 个进程使用 HDF5 和 MPI 写入/读取大文件

当通过 h5py 和 mpi4py 使用并行 HDF5 将大型数据集写入文件时(在直接从 C 中使用 HDF5 和 MPI 时也很有可能),如果将 mpio 驱动程序与单个进程一起使用,则会出现以下错误:

OSError: Can't prepare for write data (Can't convert from size to size_i)

似乎允许的数据集的限制是 4GB,至少当内容是双数组时。如果使用更多进程来共享工作负载,或者如果在没有 mpio 驱动程序的单个 CPU 上完成,则更大的数据集可以正常工作。

为什么是这样?是sizesize_i指针类型,前者不能保存大于对应于 4GB 的地址double[]吗?这个错误最终对我来说可能不会是一个严重的问题,因为我通常会使用多个进程,但我希望我的代码即使只使用一个进程也能工作。

0 投票
1 回答
165 浏览

mpi4py - mpi4py 组不能非集体地创建自己的通信器

我正在尝试让队伍组在 mpi4py 中创建自己的通信器。看起来这似乎是不可能的,但 MPI-3 标准支持此类操作。

谢谢

0 投票
0 回答
978 浏览

python - mpi4py 不会在优胜美地上运行

我正在尝试学习如何将 MPI 与 python 一起使用。

当我尝试使用安装了 Python 2.7.8 :: Anaconda 2.1.0 的 mpi4py 在此处运行 helloworld 脚本时,出现以下错误:

我卸载了 conda 打包的 mpi4py 并尝试使用 pip 安装。安装失败并显示以下错误消息:

搜索后,我尝试了此处显示的手动安装,但没有骰子。

请帮忙!

解决了:

Anaconda 尚未打包 mpi4py 以与 Yosemite 一起使用。您可以在此处使用 conda 命令进行安装

0 投票
1 回答
1715 浏览

python - MPI:如何让一个进程终止所有其他进程-python-> fortran

我有一些启用 MPI 的 python MCMC 采样代码,可以触发对单独内核的并行可能性调用。因为它(必然 - 不要问)拒绝采样,所以我只需要一个 np 样本就可以成功开始下一次迭代,并且过去通过这种方法非常高兴地实现了 ~ np x 加速。

我已将此应用于一个新问题,其中可能性调用 f2py 包装的 fortran 子例程。在这种情况下,在每次迭代中,其他 np-1 进程等待最慢(有时非常慢)的结果返回,即使其中一个 np-1 已经可以接受。

所以我怀疑我需要将一条消息传递给所有非获胜(在速度方面)的进程以终止,以便下一次迭代可以开始,并且我需要明确执行此操作的最佳方法的一些细节,如下所示。

python代码是这样的。采样器是 PyMultiNEST。

广播应该通过主进程吗?

现在,棘手的部分是如何在 F90 代码中接收终止信号。大概如果代码总是在监听(while循环?)它会减慢很多 - 但我无论如何应该使用类似的东西:

然后如何在收到消息后最好地终止该进程?

最后,我是否需要在 F 代码中做任何事情以使下一次迭代重新启动 OK/产生新进程?

谢谢!

0 投票
1 回答
466 浏览

python - Wrap C++ function that returns MPI communicator using Cython

I am trying to wrap a C++ function that doesn't take any input and returns the MPI communicator.

Foo.h

I have tried that following:

source.pyx

This code compiled and I was able to write a python code that inherits this class. However, when I tried to access getMPIComm at the python level, I encountered a segmentation fault and the error given by valgrind is:

Does that mean that I did not wrap getMPIComm() properly? Does anyone know how I should approach it?

0 投票
0 回答
1166 浏览

python - 进程之间的 mpi4py spawn 通信在 Windows 7 上失败

我的目标是让 python 脚本能够在不同的进程上启动另一个 python 脚本,即我想将脚本分布在 n 个进程上。为了实现这一点,我正在尝试运行文档中给出的 mpi4py spawn 示例(请参阅http://mpi4py.scipy.org/docs/usrman/tutorial.html)。但是此示例失败并显示以下消息:

至少一对 MPI 进程无法相互联系以进行 MPI 通信。这意味着......这个错误有时可能是忘记指定'self' BTL的结果。...您的 MPI 作业现在将中止。

我的安装是在带有 openMPI 1.6.1 和最新 mpi4py 安装的 Windows 7 机器上。

就我而言,代码是:master.py:

工人.py:

产生错误的行是:

运行脚本的命令在 cmd 提示符下:

0 投票
1 回答
118 浏览

python - 对recvbuf 进行操作的MPI_Sendrecv?

我使用MPI_SendrecvMPI 函数在进程之间传递数据数组。我使用 mpi4py 在 Python 中执行此操作,但我很确定我的问题与使用的语言无关。

我真正想要的是将驻留在另一个进程上的数组添加到现有的本地数组中。这应该对所有进程都完成,所以我使用该MPI_Sendrecv函数一次性发送和接收数组。然后我可以将接收到的数组添加recvbuf到本地数组中,我就完成了。

recvbuf但是,如果我可以保存拥有一个单独数组的步骤,并且简单地将数据直接接收到本地数组中而不覆盖现有数据,而是使用一些操作(在我的情况下是添加)来更新它,那就太好了。

我想我正在寻找的是一个组合MPI_Sendrecv/MPI_Reduce功能。MPI中是否存在这样的功能?

0 投票
0 回答
614 浏览

python - Python 使用 multiprocessing.pool 和 mpi4py 生成无法分配内存错误

我正在研究一组计算机,最近开始使用 python 进行并行编程。

我目前的理解是:mpi4py 帮助管理不同节点之间的工作,而 multiprocessing 管理节点核心中的工作。

我根据运行的 procs 的数量将一个大的 for 循环分成几部分,

然后尝试通过节点的cpu_count生成一个进程池,然后给它们工作。代码如下:

我的问题是代码到达 p = Pool(processes=cpu_count()) 的那一刻,它会生成错误“无法分配内存”。Traceback 与Python 无法使用 multiprocessing.pool 分配内存相同,但解决方案无济于事。

任何提示/帮助/解释表示赞赏