问题标签 [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.
python - MPI 中的设计模式:阻塞发送和适当负载平衡的睡眠根进程
我正在使用 mpi4py 在 Python 中运行 MPI 代码,如下所示:
我注意到根进程总是很忙(CPU 为 100%)。我更喜欢根进程休眠,直到工作进程准备好接收下一条消息。MPI 编程中有哪些促进这种行为的模式?也许根进程也应该工作?
这种设计的另一个缺陷如下......如果worker proc 4 在3 之前完成,那么4 必须等待3 完成,然后才能从root 获取新消息以继续工作。有关如何设计始终尝试将下一条消息发送到空闲进程的根进程的任何建议?这对我来说基本没问题,因为接收消息的第一个进程通常是第一个完成的进程。但是,如果每条消息的工作负载都发生变化,则情况并非总是如此。
谢谢,凯文
python - 使用 mpi4py 将进程发送到不同的节点
我有一个函数,我想在集群中的多个节点上进行评估。我已经获得了在我们的集群上使用 运行的简单示例,MPI4py
但希望找到一个 python 包,它可以让事情变得更加用户友好(比如实现在哪个节点上。我见过一些实现但没有控制每个节点上产生多少进程的包。map
multiprocessing
map
以下代码接近说明我的意思。MPI4py
但是,我没有像使用map
函数那样编写它,而是以典型的方式编写它。我这样写是因为这最终是我想要实现代码的方式(使用模拟的模块map
)并且因为我不太确定如何使用 MPI 编写它来实现我想要做的.
我想控制发送到每个节点的进程数的原因是其中的一些指令foo
可以是多线程的(比如dot
也可以链接到 MKL 库)。
如果我有一个由 12 台计算机组成的集群,每台计算机有 2 个内核,我只想向 12 个节点中的每一个发送一个作业,它会隐式地利用两个内核。我不想生成 24 个作业(每个内核一个),因为我担心当两个进程都尝试使用两个内核时可能出现线程抖动。我也不能只产生 12 个进程,因为我不能确定它会向每个节点发送一个,而不是向前 6 个节点发送 2 个。
首先,这应该是一个主要问题吗?运行 24 个进程而不是 12 个进程会对性能产生多大影响?
如果它会有所作为,是否有一个 python 包可以覆盖在上面MPI4py
并做我正在寻找的东西?
python - 启动 IPython 笔记本 MPI 集群
我很难尝试启动具有 MPI 功能的 IPython 集群。首先,我安装了 MPI 和 MPI4py,它们正在工作。我终于想出了如何从 ipython 中运行 mpi python 代码。但是,我试图在 IPython 笔记本中获得一个有效的 mpi 配置文件并且不知所措。我已经阅读了所有文档,甚至观看了很多关于该主题的讲座,每次我尝试复制某人正在做的事情时,我总是会出错。好的,如果我从 bash 提示符键入:
我可以进入笔记本并查看该集群。然后,如果我通过点击开始操作按钮来启动它,它就会启动。但是如果我这样做:
我得到:
此外,如果我这样做:
我收到指向 rc=parallel.Client() 行的错误。所以这两个都可以在默认集群上正常工作......我也试过了
从 bash 提示符开始,无论何时我尝试从那里启动集群,如果我在使用 GUI 按钮启动 profile=mpi 后将其从笔记本中放入,我永远不会得到提示:
我遇到了另一个错误。我一直在努力让这件事继续下去,这样我就可以在过去两天里运行一个模拟,而且我在一所没人知道该怎么做的学校里。请有人帮助我
try-catch - 尝试在 Cython 中为 cimport 声明(与 mpi4py 一起使用)
有没有办法在 Cython 中为 cimport 提供相当于 Python try 语句的方法?
像这样的东西:
我需要这个来编写一个可以使用或不使用 mpi4py 编译的 Cython 扩展。这在编译语言中是非常标准的,其中 mpi 命令可以放在 #ifdef 和 #endif 预处理器指令之间。我们如何在 Cython 中获得相同的结果?
我试过这个但它不起作用:
实际上,如果 mpi4py 安装正确,但如果
import mpi4py
引发 ImportError,Cython 文件不会编译,我得到错误:
文件setup.py
:
parallel-processing - Memory efficient parallelization of loop using MPI and mpi4py
I am new to parallel programming and MPI, and I am stuck on this possibly easy problem ...
I am trying to write a code which evolve a system of N gravitationally interacting particles forward in time. This is quite easy using a naive algorithm, which is what I have done. But now I want to parallelize my code. Specifically I am writing in Python using mpi4py. A simplified (and heavily optimizable, but that is not the point), non-parallel implementation would look something like this:
How do I go about parallelizing this algorithm? Since the number of particles N
could be very large, I want to store pos
and vel
only on the root process, to save memory. My initial thought was to parallelize the i
-loop, but every process still needs access to pos
and vel
in their entirety! That is, a Scatter/Gather scheme is not helpful.
Am I forced to have a copy of pos
and vel
in memory for every process, or are there some way out of this?
A simple way out would be to share the memory containing pos
and vel
across all processes, without making duplicates. I do not know if this is possible with MPI (and specifically mpi4py).
Any help would be gratefully accepted!
python - mpi4py 的收集是否创建一个元素匹配等级的列表?
我在一个程序中使用 mpi4py。我用 n>1 个内核运行程序,每个内核都有自己的列表(我们可以将其称为“core_specific_list”的数字。我希望 0 级内核将所有列表收集在一个大列表中,我们可以称之为“big_list” .
我开始程序(只是为了定义变量):
所以,为了让大名单做到这一点,我让每个核心调用:
这确实按预期创建了 big_list(其中每个元素都是其他等级的 core_specific_list 之一)。而且似乎每个列表元素都按照发送它的等级顺序排列(也就是说,big_list 的元素 0 是等级 0 的 core_specific_list 等)。
问:但是这个假设正确吗?也就是说,big_list 中的元素 j 是秩 j 的 core_specific_list 吗?(我知道我可以像我一样在某些情况下对此进行测试,但我需要绝对确保我可以依赖这个假设)
谢谢你。
python - mpi4py 和 subprocess.Popen()
我正在尝试使用 mpi4py 编写一个 python 脚本,该脚本使用 subprocess.Popen() 运行一堆可执行文件,然后在之后对其进行处理,因此我需要知道可执行文件何时运行。
我注意到当我在计算机集群上运行 mpi4py 时,它不喜欢 subprocess.Popen()。我尝试使用 mpi4py 的 Spawn(),但它没有告诉我可执行文件何时完成运行。
关于我应该如何运行可执行文件的任何想法。我将在多个节点上运行数千个这样的文件。
python - MPI4py:MPI通过进程之间的循环进行通信
我的程序中有 2 个进程。process(0)
主人在哪里,process(1)
从哪里来。两者都有一个共同的循环(从 0 增加到 4)。我正在尝试将 value( i
) 发送到process(1)
from process(0)
。但process(1)
没有得到i
from的新值process(0)
。
这是目前我得到的输出:
理想情况下,process(1)
应该打印[0] [1] [2] [3] [4]
python - 在 Django 应用程序中启动 MPI 工作进程
我们想在我们的 Django 应用程序中运行一些后台进程。看起来 Celery 是最常见的解决方案,但我们团队对 MPI 更熟悉,所以我正在尝试它。我想创建一个启动 MPI 工作人员池的 Django 管理命令,因此我阅读了Django 管理命令和 MPI4py 的动态进程管理。
我编写了一个管理命令来运行车队管理器和一个管理命令来运行一个工人。车队经理成功使用MPI.COMM_SELF.Spawn()
启动工作人员,但他们无法相互通信。经理和第一个工人的等级都是 0,所以看起来他们正在使用单独的通信器。
我怎样才能让经理和工人使用同一个通信器?
python - mpi4py 中哪些操作是“同步”操作
我正在使用从中导入 MPI 的 mpi4py 编写 python 代码。然后,我设置了全局通信器 MPI.COMM_WORLD 并存储在变量 comm 中。
我正在使用 n > 1 个线程运行此代码,并且在某些时候它们都进入了一个 for 循环(所有内核都有相同数量的迭代要通过)。
在 for 循环中,我有一个“comm.reduce(...)”调用。这似乎适用于少数核心,但随着问题规模的增加(比如 64 个核心),我体验到我的程序“挂起”。
所以我想知道这是否与 reduce(...) 调用有关。我知道这个调用需要所有线程(也就是说,假设我们总共运行了 2 个线程。如果一个线程进入循环但另一个没有出于某种原因,程序将挂起,因为 reduce(...) 调用等待对于两个线程)。
我的问题是: reduce 调用是“同步”任务吗,即它是否像“comm.Barrier()”调用一样工作?而且,如果可能,更一般地说,同步任务是什么(如果有的话,除了障碍)?