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



我正在一台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来做到这一点:通过计算名称的哈希并假设没有两个名称将获得相同的哈希(我不喜欢这样,因为如果有一天我有两个具有相同哈希的名称,将很难跟踪问题),或者使用某种跨进程的协议算法(哪一个?我还不知道)。

你会怎么做(如果可能的话)?

马蒂厄

现代mpi3对此的回答是调用MPI_Comm_split_type


留给子孙的老答案

你是对的,对分布的假设是不明智的,因为秩重排序实际上是一种很有前途的技术,它以牺牲这种规律性为代价来提高性能。

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

最新更新