Parallel processing 如何在MPI集群中将单个节点的多个核心分配给单个作业/进程?

Parallel processing 如何在MPI集群中将单个节点的多个核心分配给单个作业/进程?,parallel-processing,mpi,distributed-computing,openmpi,mpich,Parallel Processing,Mpi,Distributed Computing,Openmpi,Mpich,我有一个MPI程序,我想在30个节点上运行(每个节点有32个核心)。如何将节点的所有核心分配给单个作业/流程 我使用插槽来限制特定节点的作业数量。 节点001插槽=1个最大插槽=20个 节点002插槽=1个最大插槽=20个 有什么参数可以用来实现这一点吗 提前感谢。使用openmpi,您可以使用选项--rankfile显式设置列组 文件的语法可在此处找到:^ 下面是一个非常简单的MPI+OpenMP程序: #include <stdio.h> #include <stdlib.

我有一个MPI程序,我想在30个节点上运行(每个节点有32个核心)。如何将节点的所有核心分配给单个作业/流程

我使用插槽来限制特定节点的作业数量。 节点001插槽=1个最大插槽=20个 节点002插槽=1个最大插槽=20个

有什么参数可以用来实现这一点吗


提前感谢。

使用openmpi,您可以使用选项--rankfile显式设置列组

文件的语法可在此处找到:^

下面是一个非常简单的MPI+OpenMP程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <mpi.h>
#include <omp.h>

void main(int argc, char** argv)
{
    MPI_Init(&argc, &argv);
    unsigned cpu;
    unsigned node;

    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    #pragma omp parallel
    {
        printf("[%d:%d] %d\n", rank, omp_get_thread_num(), sched_getcpu());
    }
    MPI_Finalize();
}
这些是我的指纹:

>mpirun -n 6 --rankfile ./rankfile ./main
[0:0] 0
[1:0] 0
[2:0] 0
[3:0] 1
[4:0] 1
[4:1] 0
[5:0] 0
我没有设置OMP_NUM_THREADS环境变量,以便让OpenMP检测每个列组有多少内核可用


希望这对您有所帮助

欢迎来到stackoverflow!如果您使用的是像这样的作业管理器,则命令
sbatch
具有一个选项
--exclusive
,这可能会有所帮助,尽管其他用户可能会哭泣。对于PBS的
qsub
,有一个选项
-n
,对应于
节点独占
。您的群集中是否有作业管理器?如果集群中只有您一个人,并且您正在使用不同的主机文件直接运行
mpirun
,那么指定maxslots就可以做到这一点。查看的
--bynode
选项。我没有使用任何作业管理器,而是使用普通的mpirun和hostfile运行它。我希望一个节点有一个插槽,所以我在hostfile中提到了“slots=1”。我希望这个插槽使用该节点中的所有CPU。如果我们使用--bynode选项,它将以循环方式分配作业。是否有明确分配CPU/资源的选项?谢谢。你能用一个例子来解释你的答案吗?谢谢,这对我很有帮助。
>cat ./rankfile
rank 0=Marvin slot=0:0
rank 1=Marvin slot=0:0
rank 2=Marvin slot=0:0
rank 3=Marvin slot=0:1
rank 4=Marvin slot=0:0-1
rank 5=Marvin slot=0:0
>mpirun -n 6 --rankfile ./rankfile ./main
[0:0] 0
[1:0] 0
[2:0] 0
[3:0] 1
[4:0] 1
[4:1] 0
[5:0] 0