2017-10-11 225 views
0

我有一个MPI程序,我想在30个节点上运行(每个节点有32个内核)。我如何将一个节点的所有内核分配给单个作业/进程?如何将单个节点的多个内核分配给MPI群集中的单个作业/进程?

我正在使用插槽来限制特定节点的作业数量。 node001 slots = 1 max_slots = 20 node002 slots = 1 max_slots = 20

是否有任何参数可用于实现此目的?

在此先感谢。

+0

欢迎使用stackoverflow!如果您正在使用像[Slurm](https://slurm.schedmd.com/sbatch.html)这样的工作管理器,那么命令'sbatch'功能选项'--exclusive'可能会有所帮助,但其他用户可能会哭泣。对于PBS's'sub',有与'node-exclusive'对应的选项'-n'。你的集群上有工作经理吗?如果你一个人在集群上,并且如果你直接运行'mpirun',使用不同的主机文件,那么指定maxslots可以做到这一点。查看[mpirun]的'--bynode'选项(https://www.open-mpi.org/faq/?category=running#mpirun-hostfile)。 – francis

+0

我没有使用任何工作管理器,我用普通的mpirun和hostfile运行它。我想要一个节点的一个插槽,所以我在hostfile中提到了“slots = 1”。我希望这个插槽能够使用该节点中的所有CPU。如果我们使用--bynode选项,它以循环方式分配作业。有没有选择明确分配CPU /资源?谢谢。 –

回答

1

使用openmpi,您可以使用选项--rankfile来显式设置等级。

文件的语法可以在这里找到:https://www.open-mpi.org/doc/v2.0/man1/mpirun.1.php^

这是一个非常简单的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(); 
} 

它打印[MPI_rank:OMP_rank] CPU在各个OpenMP的线程。

为rankfiles的基本格式是:

rank <rank>=<host> slot=<slot>:<cores> 

有了这些基本rankfile(主机=马文,2CPU上一个时隙):

>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 

我没有设置OMP_NUM_THREADS环境变量,以便让OpenMP检测每个可用的核心数量秩。

希望这可以帮到你

+0

你能用一个例子来解释你的答案吗? –

+0

谢谢,这对我有帮助。 –

相关问题