首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI &p线程:具有不同核数的节点

MPI &p线程:具有不同核数的节点
EN

Stack Overflow用户
提问于 2014-09-10 00:45:23
回答 1查看 947关注 0票数 1

Introduction

我想编写一个MPI/p线程混合代码。我的目标是在每个节点上启动一个MPI进程,并将其中的每个进程分割成多个线程来执行任务,但只在单独的MPI进程之间进行通信。

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

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

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

我可以访问的MPI实现是OpenMPI。这些节点是Intel和AMD CPU的混合。我想使用一个机器文件,将每个节点指定为一个插槽,然后在本地计算出核心的数量。然而,这样做似乎有问题。.我肯定不是第一个有这个问题的人,但不知怎的,搜索网络并没有给我指明正确的方向。除了发现自己是一个同质的集群之外,还有其他解决这个问题的标准方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-10 08:52:08

在Open中,只在每个节点启动一个进程非常简单:

代码语言:javascript
复制
mpiexec -pernode ./mympiprogram

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

知道内核的数量是有点棘手和非常具体的操作系统。但是Open附带了hwloc图书馆,它提供了一个抽象的API来查询系统组件,包括内核的数量:

代码语言:javascript
复制
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

代码语言:javascript
复制
/* 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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25755687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档