gpt4 book ai didi

python - 以令人尴尬的并行方式运行 MPI 代码(在 PBS-Torque 集群上)

转载 作者:行者123 更新时间:2023-12-01 04:07:49 27 4
gpt4 key购买 nike

我编写了一个基于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com