Parallel processing MPI_BCAST()仅应用于基本组的一小部分
我将8个处理器分为两组,每组平均包含4个处理器。我要求每个子组的根使用子例程“MPI_BCAST”与他们的下属进行一些通信 我遇到了一个问题:为了表示子组的根,我应该使用子组根与MPI_COMM_WORLD communicator对应的原始秩,还是使用新communicator表示的新秩 以下面的代码片段为例,我想要求p:0将数据发送给它的下属p:1、p:2和p:3,同样,我要求p:4将数据发送给p:5、p:6和p:7。为了达到这个目标,我想知道是否应该将第36行中的第四个参数指定为1,或者将它们分别指定为0和4,条件是我所指的是哪一个子组的负责人 谢谢。 背风 MPI中的所有列组类型参数(原点、目标等)必须与通信器参数给定的列组位于同一通信器中。实际上,这意味着在创建一个新的通信器后,该通信器中的每个进程都必须调用MPI_Comm_rank和MPI_Comm_size来检索它在该通信器中的秩和总大小(当然,除非您可以通过代码中的其他方法推断出新的秩和大小) 另一方面,由于您正在将原始通信器拆分为两个不相交的通信器,我认为更容易实现这一点的方法是使用MPI_Comm_split,而不是像您所做的那样手动设置组。所有列组类型参数(原点、目标等)MPI中的列组必须与communicator参数给定的列组位于同一个communicator中。实际上,这意味着在创建一个新的通信器后,该通信器中的每个进程都必须调用MPI_Comm_rank和MPI_Comm_size来检索它在该通信器中的秩和总大小(当然,除非您可以通过代码中的其他方法推断出新的秩和大小)Parallel processing MPI_BCAST()仅应用于基本组的一小部分,parallel-processing,fortran,mpi,fortran90,Parallel Processing,Fortran,Mpi,Fortran90,我将8个处理器分为两组,每组平均包含4个处理器。我要求每个子组的根使用子例程“MPI_BCAST”与他们的下属进行一些通信 我遇到了一个问题:为了表示子组的根,我应该使用子组根与MPI_COMM_WORLD communicator对应的原始秩,还是使用新communicator表示的新秩 以下面的代码片段为例,我想要求p:0将数据发送给它的下属p:1、p:2和p:3,同样,我要求p:4将数据发送给p:5、p:6和p:7。为了达到这个目标,我想知道是否应该将第36行中的第四个参数指定为1,或者将
另一方面,由于您正在将原始通讯器拆分为两个不相交的通讯器,我认为更简单的方法是使用MPI_Comm_split,而不是像您所做的那样手动设置组。谢谢您的回复。我没有使用MPI_Comm_split,而是选择使用这种替代方法,因为我的实际程序中处理器的划分不均匀。经过反复试验,我终于得到了想要的结果,将第36行中的第四个参数设置为0,这意味着并行协议自动将每个新子组根的秩指定为0,而不是1(这是一个错误)或0和4(一个与协议工作方式不一致的规范)。还可以使用模糊的
MPI\u Group\u translate\u ranks
将原始组中进程的排名转换为新组中的排名。当用户拆分通讯器时,如果不知道新的列组编号是什么,例如,如果所有列组都为拆分呼叫提供了相同的键,则此功能非常有用。谢谢您的回复。我没有使用MPI_Comm_split,而是选择使用这种替代方法,因为我的实际程序中处理器的划分不均匀。经过反复试验,我终于得到了想要的结果,将第36行中的第四个参数设置为0,这意味着并行协议自动将每个新子组根的秩指定为0,而不是1(这是一个错误)或0和4(一个与协议工作方式不一致的规范)。还可以使用模糊的MPI\u Group\u translate\u ranks
将原始组中进程的排名转换为新组中的排名。当用户拆分通讯器且不知道新列组编号是什么时(例如,如果所有列组都向拆分调用提供了相同的键),此功能非常有用。
1 program main
2 include 'mpif.h'
3 integer :: ierr, irank, num_procs, base_group
4 integer :: nrow, ncol, irow, icol
5 integer :: dummy_group, dummy_comm, new_comm, new_rank
6 integer :: i, j, roster(4), data(4)
7
8 call MPI_Init ( ierr )
9 call MPI_COMM_RANK( MPI_comm_world, irank, ierr )
10 call MPI_COMM_SIZE( MPI_comm_world, num_procs, ierr)
11 call MPI_COMM_GROUP( MPI_comm_world, base_group, ierr)
12 nrow = 4
13 ncol = 2
14 irow = mod( irank, nrow ) + 1
15 icol = irank/nrow + 1
16
17 roster(1) = 0
18 do i = 2, nrow
19 roster(i) = roster(i-1) + 1
20 enddo
21
22 do i = 1, ncol
23 call MPI_GROUP_INCL( base_group, nrow, roster, dummy_group, ierr )
24 call MPI_COMM_CREATE( MPI_COMM_WORLD, dummy_group, dummy_comm, ierr )
25 if( icol == i ) new_comm = dummy_comm
26 forall( j=1:nrow ) roster(j) = roster(j) + nrow
27 enddo
28
29 ! Here I want to initialize data for processors P:0 and P:4
30 if( irank == 0 ) data = 0
31 if( irank == 4 ) data = 4
32
33 ! In the code below I want to require P:0 to send data to
34 ! its subordinates P:1, P:2, and P:3. Similarly, I ask P:4
35 ! to send out its data to P:5, P:6, P:7.
36 call MPI_BCAST( data, 4, MPI_INTEGER, 0, new_comm, ierr)
37
38 call MPI_Finalize ( ierr )
39 end program