Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading MPI&pthreads:具有不同核数的节点_Multithreading_Pthreads_Mpi - Fatal编程技术网

Multithreading MPI&pthreads:具有不同核数的节点

Multithreading MPI&pthreads:具有不同核数的节点,multithreading,pthreads,mpi,Multithreading,Pthreads,Mpi,导言 我想写一个混合的MPI/pthreads代码。我的目标是在每个节点上启动一个MPI进程,并将这些进程中的每一个拆分为多个线程,这些线程将实际执行该任务,但通信仅发生在单独的MPI进程之间 有相当多的教程描述了这种情况,称为混合编程,但它们通常假设一个同质集群。但是,我使用的是异构节点:它们具有不同的处理器和不同数量的核心,即节点是4/8/12/16核心机器的组合 我知道在这个集群上运行一个MPI进程会使我的代码慢到使用的CPU最慢的速度;我接受这个事实。说到这里,我想开始我的问题 是否有一

导言

我想写一个混合的MPI/pthreads代码。我的目标是在每个节点上启动一个MPI进程,并将这些进程中的每一个拆分为多个线程,这些线程将实际执行该任务,但通信仅发生在单独的MPI进程之间

有相当多的教程描述了这种情况,称为混合编程,但它们通常假设一个同质集群。但是,我使用的是异构节点:它们具有不同的处理器和不同数量的核心,即节点是4/8/12/16核心机器的组合

我知道在这个集群上运行一个MPI进程会使我的代码慢到使用的CPU最慢的速度;我接受这个事实。说到这里,我想开始我的问题

是否有一种方法可以启动N个MPI进程(每个节点一个MPI进程),并让每个进程都知道在该节点上有多少物理核可用


我可以访问的MPI实现是OpenMPI。这些节点是Intel和AMD CPU的混合体。我考虑使用machinefile,将每个节点指定为具有一个插槽,然后计算出本地的内核数。然而我肯定不是第一个遇到这个问题的人,但不知何故,在网上搜索并没有给我指明正确的方向。除了发现自己是一个同构群集之外,还有解决此问题的标准方法吗?

使用Open MPI,仅为每个节点启动一个进程非常简单:

mpiexec -pernode ./mympiprogram
-pernode参数相当于-npernode 1,它指示ORTE启动器为主机列表中的每个节点启动一个进程。此方法的优点是,无论实际主机列表是如何提供的,它都可以工作,即,当它与某些资源管理器(如Torque/PBS、SGE、LSF、SLURM等)紧密耦合时,以及与手动提供的主机紧密耦合时,它都可以工作。即使主机列表包含具有多个插槽的节点,它也可以工作

知道内核的数量有点棘手,而且非常特定于操作系统。但OpenMPI附带了,它提供了一个抽象API来查询系统组件,包括内核的数量:

hwloc_拓扑\u t拓扑; /*分配和初始化拓扑对象*/ hwloc_topology_init&topology; /*执行拓扑检测*/ hwloc_拓扑\u负载拓扑; /*获取核心数*/ 无符号nbcores=hwloc_get_nbobjs_by_typetopology,hwloc_OBJ_CORE; /*销毁拓扑对象*/ hwloc_拓扑图_拓扑图; 如果要使集群中的内核数量可用于作业中的每个MPI进程,则需要一个简单的MPI_Allgather:

/*获取作业中的进程数或MPI进程数*/ 国际银行; MPI_Comm_sizeMPI_Comm_WORLD&nranks; 无符号核[nRank]; MPI_Allgather&nbcores,1,MPI_未签名, 核,1,MPI_无符号,MPI_通信世界;
使用Open MPI,每个节点只启动一个进程非常简单:

mpiexec -pernode ./mympiprogram
-pernode参数相当于-npernode 1,它指示ORTE启动器为主机列表中的每个节点启动一个进程。此方法的优点是,无论实际主机列表是如何提供的,它都可以工作,即,当它与某些资源管理器(如Torque/PBS、SGE、LSF、SLURM等)紧密耦合时,以及与手动提供的主机紧密耦合时,它都可以工作。即使主机列表包含具有多个插槽的节点,它也可以工作

知道内核的数量有点棘手,而且非常特定于操作系统。但OpenMPI附带了,它提供了一个抽象API来查询系统组件,包括内核的数量:

hwloc_拓扑\u t拓扑; /*分配和初始化拓扑对象*/ hwloc_topology_init&topology; /*执行拓扑检测*/ hwloc_拓扑\u负载拓扑; /*获取核心数*/ 无符号nbcores=hwloc_get_nbobjs_by_typetopology,hwloc_OBJ_CORE; /*销毁拓扑对象*/ hwloc_拓扑图_拓扑图; 如果要使集群中的内核数量可用于作业中的每个MPI进程,则需要一个简单的MPI_Allgather:

/*获取作业中的进程数或MPI进程数*/ 国际银行; MPI_Comm_sizeMPI_Comm_WORLD&nranks; 无符号核[nRank]; MPI_Allgather&nbcores,1,MPI_未签名, 核,1,MPI_无符号,MPI_通信世界;
您当然可以做到这一点,但除非您的任务接近令人尴尬的并行状态,在这种情况下MPI+Pthreads是过度杀伤力,否则由此产生的负载平衡噩梦可能意味着您的加速将非常有限。获取线程数量的最简单和最可移植的方法可能是使用OpenMP支持进行编译,即使您打算使用Pthreads来代替,也只是调用。您当然可以这样做,但除非您的任务接近令人尴尬的并行,在这种情况下,MPI+Pthreads是多余的,由此产生的负载平衡噩梦可能意味着您的加速将非常有限。 获取线程数量的最简单和最可移植的方法可能是使用OpenMP支持进行编译,即使您打算使用Pthreads,也只是为了调用。