- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个基于 MPI 的 C 代码,用于并行执行数值模拟。由于我的设计不佳,我在代码中内置了一些固有的 MPI 依赖项(数组结构、MPI-IO)。这意味着如果我想串行运行我的代码,我必须调用
mpiexec -n 1 c_exe
主要问题我在 Python 工作流程中使用 C 代码,该工作流程在下面的循环中进行了简化。
import os
import subprocess
homedir = os.getenv('PBS_O_WORKDIR')
nevents = 100
for ievent in range(nevents):
perform_workflow_management()
os.chdir(ievent)
subprocess.call('mpiexec -n 1 c_exe', Shell=True)
os.chdir(homedir)
Python 工作流程主要用于管理,并调用执行数字密集型工作的 C 代码。
Python for 循环中的任务是独立的,因此我想采用一种令人尴尬的并行方案来并行化事件循环。基准表明,并行化事件循环将比具有并行 MPI 调用的串行循环更快。此外,我正在 PBS-Torque 集群上运行它。
我不知道如何有效地做到这一点。由于 MPI 调用我的 C 代码以及分配多个 MPI 任务,似乎出现了复杂性。
我以某种形式尝试过的事情
pbsdsh 的包装 - 引发处理器分配问题。
MPMD 与 mpiexec - 理论上可以完成我想要的操作,但会失败,因为所有进程似乎共享 MPI_COMM_WORLD。我的 C 代码为基于域的并行性建立了笛卡尔拓扑;冲突就出现在这里。
有人对我如何以令人尴尬的并行方式实现部署有建议吗?理想情况下,我想提交工作请求
qsub -l nodes=N:ppn=1,walltime=XX:XX:XX go_python_job.bash
其中 N 是处理器的数量。在每个进程上,我希望能够向我的 C 代码提交独立的 mpiexec 调用。
我知道问题的部分原因在于设计缺陷,但如果我能够找到解决方案而不必重构大部分代码,那将是有利的。
最佳答案
首先,对于任何合适的 MPI 实现,您都不必使用 mpiexec
来启动单例 MPI 作业 - 只需运行可执行文件(MPI 标准,§10.5.2 Singleton MPI_INIT)。它至少可以与 Open MPI 和 MPICH 系列配合使用。
其次,任何像样的 DRM(分布式资源管理器,又名批处理排队系统)都支持阵列作业。这些是 SPMD 的 DRM 等效项 - 具有相同作业文件的多个作业。
要使用 Torque 获取数组作业,请在命令行或作业脚本中传递 qsub
-t from-to
选项:
#PBS -t 1-100
...
然后,在您的 Python 脚本中获取 PBS_ARRAYID
环境变量的值并使用它来区分不同的实例:
import os
import subprocess
homedir = os.getenv('PBS_O_WORKDIR')
ievent = os.getenv('PBS_ARRAYID')
perform_workflow_management()
os.chdir(ievent)
subprocess.call('./c_exe', Shell=True)
os.chdir(homedir)
正如 @Zulan 已经提到的,这允许作业调度程序通过回填更好地利用集群的资源(如果您的 Torque 实例与 Maui 或类似的高级调度程序配对)。
数组作业的优点是,尽管从您的角度来看,它们看起来和工作(大部分)就像单个作业,但调度程序仍然将它们视为单独的作业并单独调度它们。
这种方法的一个可能的缺点是,如果作业是排他地调度的,即没有两个作业可以共享一个计算节点,那么利用率将非常低,除非您的集群节点每个只有一个单核 CPU(不太可能)如今)。
关于python - 以令人尴尬的并行方式运行 MPI 代码(在 PBS-Torque 集群上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35350808/
我是一名优秀的程序员,十分优秀!