我已经实现了对3x3网格进行建模的笛卡尔拓扑:
其中P0,P1等代表进程0,进程1等。因此,拓扑中的每个插槽代表一个过程。 Val代表过程包含的值。
我现在要做的是检查每个进程的邻居值的总和,以查看其总和是否为300 >。如果是这样,它将输出:
Process 1 neighbour values sums up to 300.
Process 3 neighbour values sums up to 300.
Process 5 neighbour values sums up to 300.
.
.
邻居是左上角还是右。我已经编写了模拟上面的图的代码:
#include <stdio.h>
#include "mpi.h"
int main(int argc, char *argv[])
{
int value;
int sum;
int rank;
int size;
int coordinates[2];
MPI_Comm grid_comm;
int dim[2],false = 0,reorder;
int top,bottom,right,left;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
dim[0] = 3;
dim[1] = 3;
reorder = 0;
MPI_Cart_create(MPI_COMM_WORLD,2,dim,&false,reorder,&grid_comm);
MPI_Cart_shift(grid_comm,0,1,&top,&bottom);
MPI_Cart_shift(grid_comm,1,1,&left,&right);
MPI_Comm_rank(grid_comm,&rank);
MPI_Cart_coords(grid_comm,rank,2,coordinates);
MPI_Cart_rank(grid_comm,coordinates,&rank);
if (rank % 2 == 0) {
value *=100;
}
else {
value *=200;
}
MPI_Finalize();
return 0;
}
我现在面临的问题是在笛卡尔网格中访问邻居值。想要一些有关我如何做到的建议。
答案 0 :(得分:0)
您可以认为MPI通信是分阶段进行的。您可以通过四个阶段来完成所需的工作。在每个阶段,每个节点都会将其值发送到{right,left,top,bottom}上的邻居(除非没有此类邻居)。
一种方法是使用MPI_Isend,这是非阻塞的。这意味着在第一阶段,每个节点向右发送然后从左接收。