多个MPI同时广播

多个MPI同时广播,mpi,broadcast,Mpi,Broadcast,我有一个2D处理器网格(3*3): P00、P01、P02在R0中,P10、P11、P12在R1中,P20、P21、P22在R2中。 P*0在同一台计算机中。P*1和P*2也是如此 现在我想让R0,R1,R2同时调用MPI_Bcast,从p*0到p*1和p*2进行广播 我发现,当我使用MPI_Bcast时,仅在一行中广播所需的时间是我需要的三倍 例如,如果我只在R0中调用MPI_Bcast,则需要1.00秒。 但是如果我调用三个MPI_Bcast,总共R[0,1,2],总共需要3.00秒。 这意

我有一个2D处理器网格(3*3):

P00、P01、P02在R0中,P10、P11、P12在R1中,P20、P21、P22在R2中。 P*0在同一台计算机中。P*1和P*2也是如此

现在我想让R0,R1,R2同时调用MPI_Bcast,从p*0到p*1和p*2进行广播

我发现,当我使用MPI_Bcast时,仅在一行中广播所需的时间是我需要的三倍

例如,如果我只在R0中调用MPI_Bcast,则需要1.00秒。 但是如果我调用三个MPI_Bcast,总共R[0,1,2],总共需要3.00秒。 这意味着MPI_Bcast无法并行工作

是否有任何方法可以同时进行MPI_广播? (一个节点同时广播三个频道。)


谢谢。

MPI-3.0草案包括一个非阻塞的
MPI\u Ibcast
集合。虽然非阻塞集合尚未正式成为标准的一部分,但它们已经在MPICH2和(我认为)OpenMPI中提供

或者,您可以从不同的线程启动阻塞
MPI\u Bcast
调用(我假设R0、R1和R2是不同的通信者)


第三种可能性(可能是也可能不是)是重新构造数据,以便只需要一次广播。

MPI-3.0草案包括一个非阻塞的MPI Ibcast。虽然非阻塞集合尚未正式成为标准的一部分,但它们已经在MPICH2和(我认为)OpenMPI中提供

或者,您可以从不同的线程启动阻塞
MPI\u Bcast
调用(我假设R0、R1和R2是不同的通信者)


第三种可能性(可能是也可能不是)是重新构造数据,以便只需要一次广播。

如果我没有弄错您的问题,您希望同时进行行广播:

P00->P01和P02
P10->P11和P12
P20->P21和P22
这可以使用子通讯器来完成,例如,其中一个只包含来自第0行的进程,另一个只包含来自第1行的进程,依此类推。然后,您可以使用相应的通信器参数调用
MPI\u Bcast
,在每个子通信器中同时发出广播

如果您首先使用笛卡尔通信器,那么创建行式子通信器非常容易。MPI为此提供了
MPI\u CART\u SUB
操作。它的工作原理如下:

//从MPI\u COMM\u WORLD创建一个3x3非周期笛卡尔式通信器
int-dims[2]={3,3};
整数周期[2]={0,0};
MPI_通信车;
//我们不希望MPI对我们的流程进行重新排序
//这就是为什么我们将reorder设置为0
MPI_购物车创建(MPI_COMM_WORLD、2、dims、句点、0和COMM_购物车);
//按行拆分笛卡尔通信器
int remaindms[2]={0,1};
MPI_Comm_行;
MPI车子系统(通信车、剩余内存和通信行);
现在,
comm_row
将包含一个新子通信程序的句柄,该子通信程序将只跨越调用进程所在的同一行。现在只需一次调用
MPI\u Bcast
即可同时执行三次行广播:

MPI\u Bcast(&data,data\u count,MPI\u数据类型,0,comm\u行);
这是因为
MPI\u Cart\u sub
返回的
comm\u row
在位于不同行的进程中是不同的
0
这里是
comm_row
子通信程序中第一个进程的排名,由于拓扑结构的构造方式,它将对应于
P*0

如果不使用笛卡尔式通信器,而是在
MPI\u COMM\u WORLD
上操作,则可以使用
MPI\u COMM\u SPLIT
将世界通信器拆分为三个行式子通信器
MPI_COMM_SPLIT
采用
颜色
,用于将进程分组到新的子通讯器中-具有相同
颜色
的进程最终位于相同的子通讯器中。在您的情况下,
color
应该等于调用进程所在的行数。拆分操作还需要一个
,该键用于在新的子通讯器中对进程进行排序。它应该等于调用进程所在列的编号,例如:

//根据秩计算网格坐标
int proc_row=等级/3;
int proc_col=排名%3;
MPI_Comm_行;
MPI通信拆分(MPI通信世界、进程行、进程列和通信行);

再一次,
comm_row
将包含子通信程序的句柄,该子通信程序仅跨越与调用进程相同的行。

如果我没有理解您的问题,您希望同时进行行广播:

P00->P01和P02
P10->P11和P12
P20->P21和P22
这可以使用子通讯器来完成,例如,其中一个只包含来自第0行的进程,另一个只包含来自第1行的进程,依此类推。然后,您可以使用相应的通信器参数调用
MPI\u Bcast
,在每个子通信器中同时发出广播

如果您首先使用笛卡尔通信器,那么创建行式子通信器非常容易。MPI为此提供了
MPI\u CART\u SUB
操作。它的工作原理如下:

//从MPI\u COMM\u WORLD创建一个3x3非周期笛卡尔式通信器
int-dims[2]={3,3};
整数周期[2]={0,0};
MPI_通信车;
//我们不希望MPI对我们的流程进行重新排序
//这就是为什么我们将reorder设置为0
MPI_购物车创建(MPI_COMM_WORLD、2、dims、句点、0和COMM_购物车);
//按行拆分笛卡尔通信器
int remaindms[2]={0,1};
MPI_Comm_行;
MPI车子系统(通信车、剩余内存和通信行);
现在,
comm_row
将包含一个新子通信程序的句柄,该子通信程序将只跨越调用进程所在的同一行。现在只需一次调用
MPI\u Bcast
即可同时执行三次行广播:

MPI\u Bcast(&data,data)_