我需要创建一个具有多维数据集拓扑结构的通信器,然后使用MPI_Cart_Shift实现的濒临进程之间的消息传递来选择多维数据集的面。例如,我正在使用等级0(R0)处理,我的邻域是R2,R4,R6(立方体的下表面)。我可以找到R2和R4,但是我不明白如何找到R6。我的代码:
#include<mpi.h>
#include<stdio.h>
int main(int argc, char *argv[])
{
int rank, k;
int size;
int ndims = 3;
int source, dest;
int up,down,right,left,up3, down3;
int edges[6][4] = {{0,1,5,4},
{4,5,7,6},
{2,3,1,0},
{6,7,3,2},
{1,3,7,5},
{0,2,6,7}};
int t, incep=0;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Comm comm, comm3d;
int dims[3]={0,0,0}, coords[3]={0,0,0},
periods[3]={1,1,1}, reorder = 0;
MPI_Status status;
int user_edge;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Dims_create(size, ndims, dims);
MPI_Cart_create(MPI_COMM_WORLD, ndims, dims, periods, reorder, &comm);
MPI_Cart_coords(comm, rank, 3, coords);
fflush(stdout);
printf("Rank %d coordinates are %d %d %d\n", rank, coords[0], coords[1], coords[2]);
MPI_Barrier(comm);
int leftrank, rightrank;
int downrank, uprank;
MPI_Comm_rank(comm, &rank);
MPI_Cart_coords(comm, rank, 2, coords);
MPI_Cart_shift(comm, 0, -1, &downrank, &uprank);
MPI_Sendrecv(buffer, 10, MPI_INT, downrank, 123, buffer2, 10, MPI_INT, uprank, 123, comm, &status);
MPI_Cart_shift(comm, 1, -1, &rightrank, &leftrank);
MPI_Sendrecv(buffer, 10, MPI_INT, leftrank, 123, buffer2, 10, MPI_INT, rightrank, 123, comm, &status);
printf("P:%d My neighbors are rightRank: %d downRank:%d leftRank:%d upRank:%d diagonal:%d diagonalX:%d\n", rank,rightrank,downrank,leftrank,uprank,diagonal,diagonalX);
MPI_Finalize();
return 0;
}
我将尝试添加类似于MPI_Cart_shift(comm,2,1,&diagonal,&diagonalX);的内容。但是对于R0,它向我展示了R1,并且我理解...。如何获得转角街区?
最佳答案
您可以使用MPI_Cart_rank查找所需的信息。
int MPI_Cart_rank(MPI_Comm comm, const int coords[], int *rank)
这里的comm是具有笛卡尔拓扑的通信器。 coords是一个整数数组(该数组的大小是笛卡尔拓扑的维数),其中包含一个进程的坐标(在您的情况下,R6为1,1,0)。然后,输出等级将返回您可以在后续通信中使用的该过程的全局等级。
顺便说一句,MPI_Cart_coords执行相反的方向,即从等级到坐标。