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

2024-04-29 11:11:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个基于MPI的C代码,用于并行执行数值模拟。由于我的设计不好,我在代码中内置了一些固有的MPI依赖项(数组结构,MPI-IO)。这意味着如果我想以串行方式运行我的代码,我必须调用

mpiexec -n 1 c_exe

主要问题 我在下面的循环中简化了Python工作流,使用了C代码。在

^{pr2}$

Python工作流主要用于管理,并调用C代码来执行大量的数字工作。在

pythonfor循环中的任务是独立的,因此我希望使用一个令人尴尬的并行方案来并行处理事件循环。基准测试表明,在事件上并行化循环要比使用并行MPI调用的串行循环快。此外,我在PBS扭矩集群上运行这个。在

我不知道如何有效地做到这一点。复杂的情况似乎是由于对C代码的MPI调用和多个MPI任务的分配而引起的。在

我已经试过了

pbsdsh的包装器-导致处理器分配问题。在

MPMD和mpiexec-理论上可以做我想做的事情,但是失败了,因为所有进程似乎都共享MPI_COMM_世界。我的C代码为基于域的并行性建立了一个笛卡尔拓扑;这里会出现冲突。在

有人对我如何以一种令人尴尬的并行方式来实现这一点有什么建议吗?理想情况下,我想提交一份工作申请

qsub -l nodes=N:ppn=1,walltime=XX:XX:XX go_python_job.bash

其中N是处理器的数量。在每个进程中,我希望能够向我的C代码提交独立的mpiexec调用。在

我知道问题的一部分是由于设计缺陷造成的,但是如果我能在不需要重构大部分代码的情况下找到一个解决方案,那将是有利的。在


Tags: 代码io进程方式事件情况数组处理器
1条回答
网友
1楼 · 发布于 2024-04-29 11:11:33

首先,对于任何像样的MPI实现,您不必使用mpiexec来启动单例MPI作业,只需运行可执行文件(MPI标准,§10.5.2 singleton MPI_INIT)。它至少适用于openmpi和MPICH系列。在

其次,任何像样的DRM(分布式资源管理器,也称为批处理排队系统)都支持阵列作业。这些是与SPMD等效的DRM-具有相同作业文件的多个作业。在

要使用Torque获取数组作业,请在命令行或作业脚本中传递qsub选项-t from-to

#PBS -t 1-100
...

然后,在Python脚本中获取PBS_ARRAYID环境变量的值,并使用它来区分不同的实例:

^{pr2}$

正如@Zulan已经提到的,这允许作业调度器通过回填更好地利用集群的资源(如果您的Torque实例与Maui或类似的高级调度器配对)。在

数组作业的优点是,尽管从您的角度来看,它们看起来和工作(大部分)都像一个单独的作业,但是调度器仍然将它们视为单独的作业,并对它们进行单独的调度。在

这种方法的一个可能的缺点是,如果作业被排他地调度,即没有两个作业可以共享一个计算节点,那么利用率将非常低,除非您的集群节点每个只有一个单核CPU(现在不太可能)。在

相关问题 更多 >