2011-11-29 25 views
5

我正在使用SMP超级计算机上的MPI程序。我想确定哪些进程正在共享相同的节点,例如,通过设置一个整数键,该键在同一节点上的所有进程中相等,并且节点与另一个节点不同。然后,目标就是使用这个密钥来分割通信器,并让子通信器只收集同一节点中的进程。MPI:获取通信器中的节点数(不是进程)

因此函数看起来像

int identify_node(MPI_Comm* comm); // returns a key characterizing a node 

假设像0,1,2,3上node_1,4,5,6,7-上node_2等工艺简单分配是一个问题一个简单的公式,但我想达到同样的结果,没有对分布的假设。

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

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

马修

回答

3

你是正确的,对分布的假设是不明智的,因为排名重新排序实际上是在这个规律性的成本提高性能的向上和未来的技术。

关于MPI_Get_processor_name返回值的一个很好的散列算法应该是相当安全的,但是如果您想仔细检查,您可以使用MPI_Gatherv来收集每个组中的实际名称并直接比较它们。

看起来this question解决了同样的问题。

+0

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