我想将每个可执行文件分配给笛卡儿的特定坐标
拓扑结构。请考虑一个示例和一个Makefile。我编译可执行文件
main[0-7]
并使用命令运行它们:
mpiexec \
-np 1 ./main0 : -np 1 ./main1 : \
-np 1 ./main2 : -np 1 ./main3 : \
-np 1 ./main4 : -np 1 ./main5 : \
-np 1 ./main6 : -np 1 ./main7
如果我对输出make run | sort -g
进行排序,它总是返回:
N, rank, coords[3]: 0 0 0 0 0
N, rank, coords[3]: 1 1 0 0 1
N, rank, coords[3]: 2 2 0 1 0
N, rank, coords[3]: 3 3 0 1 1
N, rank, coords[3]: 4 4 1 0 0
N, rank, coords[3]: 5 5 1 0 1
N, rank, coords[3]: 6 6 1 1 0
N, rank, coords[3]: 7 7 1 1 1
此处N
是可执行文件的ID。它看起来像我想要的那样工作:main0
转到坐标(0, 0, 0)
,main1
转到坐标(0, 0, 1)
和
等等。标准是否解决了这个问题?
生成文件
all: main0 main1 main2 main3 main4 main5 main6 main7
cc=mpicc
main0: main.c; $(cc) -DN=0 $< -o $@
main1: main.c; $(cc) -DN=1 $< -o $@
main2: main.c; $(cc) -DN=2 $< -o $@
main3: main.c; $(cc) -DN=3 $< -o $@
main4: main.c; $(cc) -DN=4 $< -o $@
main5: main.c; $(cc) -DN=5 $< -o $@
main6: main.c; $(cc) -DN=6 $< -o $@
main7: main.c; $(cc) -DN=7 $< -o $@
run: all
mpiexec \
-np 1 ./main0 : -np 1 ./main1 : \
-np 1 ./main2 : -np 1 ./main3 : \
-np 1 ./main4 : -np 1 ./main5 : \
-np 1 ./main6 : -np 1 ./main7
clean:; rm -f main[0-7]
的main.c
#include <stdio.h>
#include <mpi.h>
#define ndims 3
int rank, coords[ndims];
int dims[ndims] = {2, 2, 2};
int periods[ndims] = {0, 0, 0};
int reorder = 0;
MPI_Comm cart;
int main(int argc, char *argv[]) {
MPI_Init(&argc, &argv);
MPI_Cart_create(MPI_COMM_WORLD, ndims, dims, periods, reorder, &cart);
MPI_Comm_rank(cart, &rank);
MPI_Cart_coords(cart, rank, ndims, coords);
printf("N, rank, coords[3]: %d %d %d %d %d\n", N, rank, coords[0], coords[1], coords[2]);
MPI_Finalize();
}
答案 0 :(得分:1)
标准是否解决了这个问题?
是
如果您使用以下表格mpiexec
1 :
mpiexec { <above arguments> } : { ... } : { ... } : ... : { ... }
8.8便携式MPI流程启动表示它对应MPI_COMM_SPAWN_MULTIPLE
。
反过来,
他们在
MPI_COMM_WORLD
中的排名直接对应于MPI_COMM_SPAWN_MULTIPLE
中指定命令的顺序。假设第一个命令生成m 1 进程,第二个命令生成m 2 ,等等。第一个命令对应的进程的行数为 0,1, 。 。 。 ,m 1 -1 。第二个命令中的进程具有 m 1 ,m 1 +1,等级。 。 。 ,m 1 + m 2 - 1 。第三个过程有 m 1 + m 2 ,m 1 + m 2 + 1 ,. 。 。 ,m 1 + m 2 + m 3 - 1 等。
这为您提供了从命令行到MPI_COMM_WORLD
等级的一致映射。 7.2虚拟拓扑然后为您提供坐标的映射:
笛卡尔结构中的过程坐标从0开始编号。行主要编号始终用于笛卡尔结构中的过程。
也就是说,为每个等级编译一个不同的二进制文件的方法只是因为一个宏而不同,看起来很愚蠢而且不太优雅。
1:分类仅适用于mpiexec
,而不适用于mpirun
。 MPI实现不需要提供mpiexec
。