gpt4 book ai didi

multithreading - MPMD MPI 执行中的通信

转载 作者:行者123 更新时间:2023-12-03 12:48:59 24 4
gpt4 key购买 nike

这篇文章与之前的一篇文章相关binding threads to certain MPI processes .在这里,有人询问如何为 MPI 等级分配不同的等级OpenMP 线程数。一种可能如下

$ mpiexec <global parameters>
-n n1 <local parameters> executable_1 <args1> :
-n n2 <local parameters> executable_2 <args2> :
...
-n nk <local parameters> executable_k <argsk>

我不知道独立实例 executable_1、executable_2、...、executable_k 是如何相互通信的。我是说如果在执行期间的某个时刻他们需要交换数据,他们是否使用内部通信器(实例之间)和内部通信器(在同一个实例中,例如 executable_1)?

谢谢。

最佳答案

作为该命令的结果启动的所有进程形成单个 MIMD/MPMD MPI 作业,即它们共享同一个世界通信器。前 n1 行运行 executable_1,后面的 n2 行运行 executable_2,等等。

                   rank                 |  executable
----------------------------------------+---------------
0 .. n1-1 | executable_1
n1 .. n1+n2-1 | executable_2
n1+n2 .. n1+n2+n3-1 | executable_3
.... | ....
n1+n2+n3+..+n(k-1) .. n1+n2+n3+..+nk-1 | executable_k

通过在 MPI_COMM_WORLD 中发送消息来进行通信。单独的可执行文件不会自动形成它们自己的通信器组。这就是 MPMD 与使用 MPI_Comm_spawn 启动子作业的区别 - 子作业有自己的世界通信器,一个人使用内部通信器与它们交谈,而 MIMD/MPMD 作业中的单独子作业则没有。

等级仍然可以通过查询MPI_COMM_WORLDMPI_APPNUM 属性来找出它属于哪个应用上下文。通过简单地使用 appnum 值作为颜色执行拆分,可以为每个上下文创建单独的子通信器(不同的上下文是由 : 分隔的命令):

int *appnum, present;

MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_APPNUM, &appnum, &present);
if (!present)
{
printf("MPI_APPNUM is not provided!\n");
MPI_Abort(MPI_COMM_WORLD, 0);
}

MPI_Comm appcomm;
MPI_Comm_split(MPI_COMM_WORLD, *appnum, 0, &appcomm);

关于multithreading - MPMD MPI 执行中的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41358038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com