为了概括我的问题,假设我有一个由9个节点组成的小型集群,这些节点以3 * 3矩阵对齐:
6 7 8
3 4 5
0 1 2
我正在尝试几个“本地”传播者(MPI_Comm),其中包括:
我尝试从MPI_Comm_World中分割节点并为每个节点创建新的通信器,但未能使用新的通信器,因为它似乎包括不是当前节点的等级。
所以这是我的问题,是否有可能只为所有节点使用一个变量,比如local_comm,每个节点包含不同的排名。或者我必须使用不同的成员变量,如下面的
MPI_Comm local_comm_0 = {0, 1, 3};
MPI_Comm local_comm_4 = {1, 3, 4, 5, 7};
MPI_Comm local_comm_7 = {4, 6, 7, 8};
等...
提前致谢。
答案 0 :(得分:2)
可以在所有节点上都有一个具有相同名称的变量,但您可能不希望这样。一个节点将具有通信器,该通信器包含与其每个邻居不同的节点集。在您的示例中,节点4和7是邻居,但在其通信器中具有不同的节点集。这会引起头痛。
更好的想法(虽然它完全依赖于你正在做的事情)将使用MPI_Cart_create来定义处理器的矩阵,然后使用普通的Sends和Recvs(或ISends和IRecvs)来进行通信。这里有一个MPI_Cart_create示例:http://mpi.deino.net/mpi_functions/MPI_Cart_create.html
如果节点组完全不相交(如{0,3,6},{1,4,7},{2,5,9})那么我建议创建不同的通信器并给它们相同变量名。但我认为这不是解决问题的正确方法。