|
Packit Service |
c5cf8c |
! This file created from f77/topo/dgraph_unwgtf.f with f77tof90
|
|
Packit Service |
c5cf8c |
! -*- Mode: Fortran; -*-
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! (C) 2011 by Argonne National Laboratory.
|
|
Packit Service |
c5cf8c |
! See COPYRIGHT in top-level directory.
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! This program is Fortran version of dgraph_unwgt.c
|
|
Packit Service |
c5cf8c |
! Specify a distributed graph of a bidirectional ring of the MPI_COMM_WORLD,
|
|
Packit Service |
c5cf8c |
! i.e. everyone only talks to left and right neighbors.
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
logical function validate_dgraph(dgraph_comm)
|
|
Packit Service |
c5cf8c |
use mpi
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
integer dgraph_comm
|
|
Packit Service |
c5cf8c |
integer comm_topo
|
|
Packit Service |
c5cf8c |
integer src_sz, dest_sz
|
|
Packit Service |
c5cf8c |
integer ierr;
|
|
Packit Service |
c5cf8c |
logical wgt_flag;
|
|
Packit Service |
c5cf8c |
integer srcs(2), dests(2)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
integer world_rank, world_size;
|
|
Packit Service |
c5cf8c |
integer idx, nbr_sep
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
comm_topo = MPI_UNDEFINED
|
|
Packit Service |
c5cf8c |
call MPI_Topo_test(dgraph_comm, comm_topo, ierr);
|
|
Packit Service |
c5cf8c |
if (comm_topo .ne. MPI_DIST_GRAPH) then
|
|
Packit Service |
c5cf8c |
validate_dgraph = .false.
|
|
Packit Service |
c5cf8c |
write(6,*) "dgraph_comm is NOT of type MPI_DIST_GRAPH."
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Dist_graph_neighbors_count(dgraph_comm, &
|
|
Packit Service |
c5cf8c |
& src_sz, dest_sz, wgt_flag, &
|
|
Packit Service |
c5cf8c |
& ierr)
|
|
Packit Service |
c5cf8c |
if (ierr .ne. MPI_SUCCESS) then
|
|
Packit Service |
c5cf8c |
validate_dgraph = .false.
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_neighbors_count() fails!"
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
if (wgt_flag) then
|
|
Packit Service |
c5cf8c |
validate_dgraph = .false.
|
|
Packit Service |
c5cf8c |
write(6,*) "dgraph_comm is NOT created with MPI_UNWEIGHTED."
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (src_sz .ne. 2 .or. dest_sz .ne. 2) then
|
|
Packit Service |
c5cf8c |
validate_dgraph = .false.
|
|
Packit Service |
c5cf8c |
write(6,*) "source or destination edge array is not size 2."
|
|
Packit Service |
c5cf8c |
write(6,"('src_sz = ',I3,', dest_sz = ',I3)") src_sz, dest_sz
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Dist_graph_neighbors(dgraph_comm, &
|
|
Packit Service |
c5cf8c |
& src_sz, srcs, MPI_UNWEIGHTED, &
|
|
Packit Service |
c5cf8c |
& dest_sz, dests, MPI_UNWEIGHTED, &
|
|
Packit Service |
c5cf8c |
& ierr)
|
|
Packit Service |
c5cf8c |
if (ierr .ne. MPI_SUCCESS) then
|
|
Packit Service |
c5cf8c |
validate_dgraph = .false.
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_neighbors() fails!"
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
! Check if the neighbors returned from MPI are really
|
|
Packit Service |
c5cf8c |
! the nearest neighbors that within a ring.
|
|
Packit Service |
c5cf8c |
call MPI_Comm_rank(MPI_COMM_WORLD, world_rank, ierr)
|
|
Packit Service |
c5cf8c |
call MPI_Comm_size(MPI_COMM_WORLD, world_size, ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
do idx = 1, src_sz
|
|
Packit Service |
c5cf8c |
nbr_sep = iabs(srcs(idx) - world_rank)
|
|
Packit Service |
c5cf8c |
if (nbr_sep .ne. 1 .and. nbr_sep .ne. (world_size-1)) then
|
|
Packit Service |
c5cf8c |
validate_dgraph = .false.
|
|
Packit Service |
c5cf8c |
write(6,"('srcs[',I3,']=',I3, &
|
|
Packit Service |
c5cf8c |
& ' is NOT a neighbor of my rank',I3)") &
|
|
Packit Service |
c5cf8c |
& idx, srcs(idx), world_rank
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
enddo
|
|
Packit Service |
c5cf8c |
do idx = 1, dest_sz
|
|
Packit Service |
c5cf8c |
nbr_sep = iabs(dests(idx) - world_rank)
|
|
Packit Service |
c5cf8c |
if (nbr_sep .ne. 1 .and. nbr_sep .ne. (world_size-1)) then
|
|
Packit Service |
c5cf8c |
validate_dgraph = .false.
|
|
Packit Service |
c5cf8c |
write(6,"('dests[',I3,']=',I3, &
|
|
Packit Service |
c5cf8c |
& ' is NOT a neighbor of my rank',I3)") &
|
|
Packit Service |
c5cf8c |
& idx, dests(idx), world_rank
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
enddo
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
validate_dgraph = .true.
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
integer function ring_rank(world_size, in_rank)
|
|
Packit Service |
c5cf8c |
integer world_size, in_rank
|
|
Packit Service |
c5cf8c |
if (in_rank .ge. 0 .and. in_rank .lt. world_size) then
|
|
Packit Service |
c5cf8c |
ring_rank = in_rank
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
if (in_rank .lt. 0 ) then
|
|
Packit Service |
c5cf8c |
ring_rank = in_rank + world_size
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
if (in_rank .ge. world_size) then
|
|
Packit Service |
c5cf8c |
ring_rank = in_rank - world_size
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
ring_rank = -99999
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
program dgraph_unwgt
|
|
Packit Service |
c5cf8c |
use mpi
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
integer ring_rank
|
|
Packit Service |
c5cf8c |
external ring_rank
|
|
Packit Service |
c5cf8c |
logical validate_dgraph
|
|
Packit Service |
c5cf8c |
external validate_dgraph
|
|
Packit Service |
c5cf8c |
integer errs, ierr
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
integer dgraph_comm
|
|
Packit Service |
c5cf8c |
integer world_size, world_rank
|
|
Packit Service |
c5cf8c |
integer src_sz, dest_sz
|
|
Packit Service |
c5cf8c |
integer degs(1)
|
|
Packit Service |
c5cf8c |
integer srcs(2), dests(2)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
errs = 0
|
|
Packit Service |
c5cf8c |
call MTEST_Init(ierr)
|
|
Packit Service |
c5cf8c |
call MPI_Comm_rank(MPI_COMM_WORLD, world_rank, ierr)
|
|
Packit Service |
c5cf8c |
call MPI_Comm_size(MPI_COMM_WORLD, world_size, ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
srcs(1) = world_rank
|
|
Packit Service |
c5cf8c |
degs(1) = 2;
|
|
Packit Service |
c5cf8c |
dests(1) = ring_rank(world_size, world_rank-1)
|
|
Packit Service |
c5cf8c |
dests(2) = ring_rank(world_size, world_rank+1)
|
|
Packit Service |
c5cf8c |
call MPI_Dist_graph_create(MPI_COMM_WORLD, 1, srcs, degs, dests, &
|
|
Packit Service |
c5cf8c |
& MPI_UNWEIGHTED, MPI_INFO_NULL, &
|
|
Packit Service |
c5cf8c |
& .true., dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
if (ierr .ne. MPI_SUCCESS) then
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_create() fails!"
|
|
Packit Service |
c5cf8c |
call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
|
|
Packit Service |
c5cf8c |
stop
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
if (.not. validate_dgraph(dgraph_comm)) then
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_create() does not create" &
|
|
Packit Service |
c5cf8c |
& //"a bidirectional ring graph!"
|
|
Packit Service |
c5cf8c |
call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
|
|
Packit Service |
c5cf8c |
stop
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
call MPI_Comm_free(dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
! now create one with MPI_WEIGHTS_EMPTY
|
|
Packit Service |
c5cf8c |
! NOTE that MPI_WEIGHTS_EMPTY was added in MPI-3 and does not
|
|
Packit Service |
c5cf8c |
! appear before then. Incluing this test means that this test cannot
|
|
Packit Service |
c5cf8c |
! be compiled if the MPI version is less than 3 (see the testlist file)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
degs(1) = 0;
|
|
Packit Service |
c5cf8c |
call MPI_Dist_graph_create(MPI_COMM_WORLD, 1, srcs, degs, dests, &
|
|
Packit Service |
c5cf8c |
& MPI_WEIGHTS_EMPTY, MPI_INFO_NULL, &
|
|
Packit Service |
c5cf8c |
& .true., dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
if (ierr .ne. MPI_SUCCESS) then
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_create() fails!"
|
|
Packit Service |
c5cf8c |
call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
|
|
Packit Service |
c5cf8c |
stop
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
call MPI_Comm_free(dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
src_sz = 2
|
|
Packit Service |
c5cf8c |
srcs(1) = ring_rank(world_size, world_rank-1)
|
|
Packit Service |
c5cf8c |
srcs(2) = ring_rank(world_size, world_rank+1)
|
|
Packit Service |
c5cf8c |
dest_sz = 2
|
|
Packit Service |
c5cf8c |
dests(1) = ring_rank(world_size, world_rank-1)
|
|
Packit Service |
c5cf8c |
dests(2) = ring_rank(world_size, world_rank+1)
|
|
Packit Service |
c5cf8c |
call MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, &
|
|
Packit Service |
c5cf8c |
& src_sz, srcs, &
|
|
Packit Service |
c5cf8c |
& MPI_UNWEIGHTED, &
|
|
Packit Service |
c5cf8c |
& dest_sz, dests, &
|
|
Packit Service |
c5cf8c |
& MPI_UNWEIGHTED, &
|
|
Packit Service |
c5cf8c |
& MPI_INFO_NULL, .true., &
|
|
Packit Service |
c5cf8c |
& dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
if (ierr .ne. MPI_SUCCESS) then
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_create_adjacent() fails!"
|
|
Packit Service |
c5cf8c |
call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
|
|
Packit Service |
c5cf8c |
stop
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
if (.not. validate_dgraph(dgraph_comm)) then
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_create_adjacent() does not create" &
|
|
Packit Service |
c5cf8c |
& //"a bidirectional ring graph!"
|
|
Packit Service |
c5cf8c |
call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
|
|
Packit Service |
c5cf8c |
stop
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
call MPI_Comm_free(dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
! now create one with MPI_WEIGHTS_EMPTY
|
|
Packit Service |
c5cf8c |
src_sz = 0
|
|
Packit Service |
c5cf8c |
dest_sz = 0
|
|
Packit Service |
c5cf8c |
call MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, &
|
|
Packit Service |
c5cf8c |
& src_sz, srcs, &
|
|
Packit Service |
c5cf8c |
& MPI_WEIGHTS_EMPTY, &
|
|
Packit Service |
c5cf8c |
& dest_sz, dests, &
|
|
Packit Service |
c5cf8c |
& MPI_WEIGHTS_EMPTY, &
|
|
Packit Service |
c5cf8c |
& MPI_INFO_NULL, .true., &
|
|
Packit Service |
c5cf8c |
& dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
if (ierr .ne. MPI_SUCCESS) then
|
|
Packit Service |
c5cf8c |
write(6,*) "MPI_Dist_graph_create_adjacent() fails!"
|
|
Packit Service |
c5cf8c |
call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
|
|
Packit Service |
c5cf8c |
stop
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
call MPI_Comm_free(dgraph_comm, ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MTEST_Finalize(errs)
|
|
Packit Service |
c5cf8c |
end
|