我已经实现了一个笛卡尔拓扑建模 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;
}
我现在面临的问题是在笛卡尔网格中访问邻居值。希望得到一些关于我如何做到这一点的建议。
最佳答案
您可以将 MPI 通信视为分阶段进行。您可以通过四个阶段来完成您需要的操作。在每个阶段,每个节点都会将其值发送给{right,left,top,bottom}上的邻居(除非没有这样的邻居)。
一种方法是使用 MPI_Isend,它是非阻塞的。这意味着在第一阶段,每个节点都向右发送,然后从左侧接收。
关于c - 访问 MPI 拓扑中的邻居进程值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52567100/