【发布时间】:2014-07-18 11:12:59
【问题描述】:
我将 8 个处理器分成两组,每组平均包含四个处理器。我要求每个子组的根使用子程序“MPI_BCAST”与他们的下属进行一些通信。
我遇到一个问题:要表示子组的根,我应该使用 MPI_COMM_WORLD 通信器与子组根对应的原始排名,还是用新通信器表示的新排名?
以下面的代码 sn-p 为例,我想要求 P:0 向它的下属 P:1、P:2 和 P:3 发送数据,同样我要求 P:4 发送出去其数据为 P:5, P:6, P:7。为了达到这个目标,我想知道是否应该将第 36 行中的第四个参数指定为 1,或者将它们分别指定为 0 和 4,条件是我指的是哪个子组的头部?
谢谢。 李
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
【问题讨论】:
标签: parallel-processing fortran mpi fortran90