Я сгруппировал 8 процессоров в две группы, в каждой из которых ровно по четыре процессора. Я прошу корень каждой подгруппы пообщаться со своими подчиненными с помощью подпрограммы «MPI_BCAST».
Я столкнулся с вопросом: чтобы указать корень подгруппы, должен ли я использовать исходный ранг, которому корень подгруппы соответствует с коммуникатором MPI_COMM_WORLD, или новый ранг, который он представляет с новым коммуникатором?
Возьмем, к примеру, приведенный ниже фрагмент кода: я хочу, чтобы P:0 отправлял данные своим подчиненным P:1, P:2 и P:3, и аналогичным образом я прошу P:4 отправлять свои данные P: 5, П:6, П: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