MPI:如何获得通信子中节点(而非进程)的数量

8
我正在一台SMP超级计算机上与MPI程序一起工作。我希望能够确定哪些进程共享同一节点,例如通过设置整数键来实现,该键在同一节点上的所有进程中都相等,并且与一个节点不同。然后,目标是使用此键拆分通信器,并具有仅收集同一节点中进程的子通信器。
因此,该函数将如下所示:
int identify_node(MPI_Comm* comm); // returns a key characterizing a node

假设在node_1上分布进程0,1,2,3,在node_2上分布进程4,5,6,7,等等。这个问题可以通过一个简单的公式解决,但我希望不需要对分布进行任何假设也能得到相同的结果。

我有一个想法,使用MPI_Get_processor_name:通过计算名称的哈希值并假设不会有两个名称会获得相同的哈希值(我不喜欢这种方法,因为如果有一天我有两个名称具有相同的哈希值,将难以追踪问题),或者使用某种跨进程的协议算法(哪种算法?我还不知道)。

如果可能的话,您会如何高效地解决它?

Matthieu
1个回答

4
现代MPI 3的解决方案是调用MPI_Comm_split_type

为了保存记录的旧答案

您说得对,假设分布是不明智的,因为秩重排序实际上是一种新兴技术,可以通过付出那种规律的代价来提高性能。

MPI_Get_processor_name返回值进行良好的哈希算法应该非常安全,但如果您想再次检查,可以使用MPI_Gatherv收集每个组内的实际名称并直接进行比较。

似乎这个问题涉及相同的问题。


谢谢,你提到的问题确实非常接近。我想我会按照你的建议做:获取处理器名称的哈希值,然后使用MPI_Gatherv进行第二次检查。 - sunmat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接