MPI:获取通信器中的节点数(不是进程)

sun*_*mat 6 c mpi communicator

我正在使用SMP超级计算机上的MPI程序.我想确定哪些进程共享同一节点,例如通过设置在同一节点上的所有进程中相等的整数键,以及从节点到另一个节点的不同.然后,目标是使用该密钥来分割通信器并使子通信器仅收集同一节点中的进程.

所以函数看起来像

int identify_node(MPI_Comm* comm); // returns a key characterizing a node
Run Code Online (Sandbox Code Playgroud)

假设node_1上的0,1,2,3,node_2上的4,5,6,7等过程的简单分布,这是一个简单公式的问题,但我希望在没有假设的情况下实现相同的结果关于分配.

我有一个想法如何使用MPI_Get_processor_name来做到这一点:通过计算名称的哈希并假设没有两个名称将获得相同的哈希(我不喜欢这样,因为如果有一天我有两个具有相同哈希的名称,它将难以跟踪问题),或跨进程使用某种协议算法(哪一个?我还不知道).

你会怎么做(尽可能有效)?

马蒂厄

Phi*_*ler 4

现代 MPI 3 的答案是调用MPI_Comm_split_type


后代的旧答案

你是对的,对分布的假设是不明智的,因为排名重新排序实际上是一种新兴的技术,以牺牲规律性为代价来提高性能。

一个好的哈希算法的返回值MPI_Get_processor_name应该是非常安全的,但是如果你想仔细检查,你总是可以使用收集每个组中的实际名称MPI_Gatherv并直接比较它们。

这个问题似乎解决了同样的问题。