Introduction
我想编写一个MPI/p线程混合代码。我的目标是在每个节点上启动一个MPI进程,并将其中的每个进程分割成多个线程来执行任务,但只在单独的MPI进程之间进行通信。
有相当多的教程描述这种情况,称为混合编程,但它们通常假设为同构集群。然而,我使用的节点具有异构节点:它们有不同的处理器和不同的核数,即节点是4/8/12/16核心机器的组合。
我知道在这个集群中运行MPI进程将使我的代码慢到使用的最慢CPU的速度;我接受这个事实。说到这里,我想谈谈我的问题。
是否有一种方法可以启动N个MPI进程--每个节点使用一个MPI进程--并让每个节点都知道在该节点上有多少物理核可用?。
我可以访问的MPI实现是OpenMPI。这些节点是Intel和AMD CPU的混合。我想使用一个机器文件,将每个节点指定为一个插槽,然后在本地计算出核心的数量。然而,这样做似乎有问题。.我肯定不是第一个有这个问题的人,但不知怎的,搜索网络并没有给我指明正确的方向。除了发现自己是一个同质的集群之外,还有其他解决这个问题的标准方法吗?
发布于 2014-09-10 08:52:08
在Open中,只在每个节点启动一个进程非常简单:
mpiexec -pernode ./mympiprogram-pernode参数等效于-npernode 1,它指示ORTE在主机列表中的每个节点启动一个进程。这种方法的优点是,无论如何提供实际的主机列表,它都能工作,即当它与某个资源管理器(例如Torque/PBS、SGE、LSF、SLURM等)紧密耦合时都能工作。和手动提供的主机。即使主机列表包含具有多个插槽的节点,它也能工作。
知道内核的数量是有点棘手和非常具体的操作系统。但是Open附带了hwloc图书馆,它提供了一个抽象的API来查询系统组件,包括内核的数量:
hwloc_topology_t topology;
/* Allocate and initialize topology object. */
hwloc_topology_init(&topology);
/* Perform the topology detection. */
hwloc_topology_load(topology);
/* Get the number of cores */
unsigned nbcores = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_CORE);
/* Destroy topology object. */
hwloc_topology_destroy(topology);如果您希望使整个集群的核心数可供工作中的每个MPI进程使用,则需要一个简单的MPI_Allgather:
/* Obtain the number or MPI processes in the job */
int nranks;
MPI_Comm_size(MPI_COMM_WORLD, &nranks);
unsigned cores[nranks];
MPI_Allgather(&nbcores, 1, MPI_UNSIGNED,
cores, 1, MPI_UNSIGNED, MPI_COMM_WORLD);https://stackoverflow.com/questions/25755687
复制相似问题