我有 3 个问题,都与 MPI(C 语言)有关。我认为前两个有相同的答案,但我并不肯定。
问题 1
用于MPI_Dims_create
创建二维网格时,返回的维度中哪个维度是X,哪个是Y?
例如:
int numProcs = -1, myProcID = -1;
MPI_Comm_rank(MPI_COMM_WORLD, &myProcID);
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
int size[2];
size[0] = size[1] = 0;
MPI_Dims_create(numProcs, 2, size);
int numProcs_y = -1, numProcs_x = 1;
应该是:
numProcs_y = size[0];
numProcs_x = size[1];
或这个:
numProcs_x = size[0];
numProcs_y = size[1];
我尝试使用似乎会给我答案的进程数量(例如 6 个)来运行它。对于 6 个进程,MPI_Dims_create
应该创建一个 3 行 2 列或 2 行 3 列的网格(除非我误解了文档)。对于进程 3(共 6 个),我发现size[0] = 1
和size[1] = 0
(我相信这对应于 x = 0,y = 1)。这似乎向我表明MPI_Dims_create
正在创建一个具有 3 行和 2 列的网格(因为它是 2 行和 3 列,进程 2(共 6 个)应该有 x = 2,y = 0)。任何人可以对此提供的确认将不胜感激。
问题2
在二维笛卡尔网格上使用MPI_Cart_coords
时,返回的维度中哪个是 X,哪个是 Y?
例如:
int periodic[2];
periodic[0] = periodic[1] = 0; // no wrap around
MPI_Comm cart_comm;
int coords[2];
// using size from question 1
MPI_Cart_create(MPI_COMM_WORLD, 2, size, periodic, 1, &cart_comm);
MPI_Cart_coords(cart_comm, myProcID, 2, coords);
与问题1类似,我的问题是,应该是这样吗
myProcID_y = coords[0];
myProcID_x = coords[1];
或者像这样
myProcID_x = coords[0];
myProcID_y = coords[1];
我一直在这里搜索文档和以前的问题,但我似乎无法找到这个问题的直接答案。
文档似乎表明这两种方法中的第一种是正确的,但并没有明确说明。
问题 3
前 2 个问题背后的根本问题是我试图将 2D 网格拆分为行和列。但是,当我MPI_Comm_rank
在这样做之后检查每个进程的行 ID 和列 ID 时,我得到的进程排序顺序与我认为上述问题的答案不匹配。
基于上述,我希望流程的顺序如下:
P0 P1
P2 P3
P4 P5
但是,使用此代码(它出现在我的程序中的上述代码之后,因此可以从中访问所有上述代码:我试图分离出我的代码以便更容易地隔离我的问题):
MPI_Comm row_comm, col_comm;
int row_id = -1, col_id = -1;
// ** NOTE: My use of myProcID_y and myProcID_x here are based
// on my understanding of the previous 2 questions ... if my
// understanding to one/both of those is wrong, then obviously the assignments
// here are wrong too.
// create row and column communicators based on my location in grid
MPI_Comm_split(cart_comm, myProcID_y, myProcID_x, &row_comm);
MPI_Comm_split(cart_comm, myProcID_x, myProcID_y, &col_comm);
// get row and column ID for each process
MPI_Comm_rank(row_comm, &row_id);
MPI_Comm_rank(col_comm, &col_id);
printf("Process: %d\trowID: %d\tcolID: %d\n", myProcID, row_id, col_id);
我看到以下打印:
Process: 0 rowID: 0 colID: 0
Process: 1 rowID: 1 colID: 0
Process: 2 rowID: 0 colID: 1
Process: 3 rowID: 1 colID: 1
Process: 4 rowID: 0 colID: 2
Process: 5 rowID: 1 colID: 2
这似乎对应于以下过程顺序:
P0 P2 P4
P1 P3 P5
这是与我所期望的相反的矩阵维度(2 行,3 列)MPI_Dims_create
。
假设我对前两个问题的理解是正确的(即 Y 是这些函数返回的第一个维度),为什么在此步骤中(看似)以不同的顺序对过程进行排序?