我正在使用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:通过计算名称的哈希并假设没有两个名称将获得相同的哈希(我不喜欢这样,因为如果有一天我有两个具有相同哈希的名称,很难跟踪问题),或者跨进程使用某种协议算法(哪一个?我还不知道)。
你会怎么做(如果可能的话,有效率)?
马修
答案 0 :(得分:3)
你是正确的,对分布的假设是不明智的,因为排名重新排序实际上是一种以这种规律性为代价来提高性能的新技术。
MPI_Get_processor_name
返回值的良好散列算法应该非常安全,但是如果要仔细检查,可以使用MPI_Gatherv
总是收集每个组中的实际名称并进行比较他们直接。
似乎this question解决了同样的问题。