48 PROGRAM test_redist_repeat_parallel
50 USE ftest_common
, ONLY: init_mpi, finish_mpi, test_abort
51 USE test_idxlist_utils
, ONLY: test_err_count
65 USE iso_c_binding
, ONLY: c_int
67 INTEGER :: comm_rank, comm_size, ierror
71 CALL mpi_comm_rank(mpi_comm_world, comm_rank, ierror)
72 IF (ierror /= mpi_success) &
73 CALL test_abort(
'mpi_comm_rank failed', &
76 CALL mpi_comm_size(mpi_comm_world, comm_size, ierror)
77 IF (ierror /= mpi_success) &
78 CALL test_abort(
'mpi_comm_size failed', &
82 IF (comm_size > 1)
THEN 86 IF (test_err_count() /= 0) &
87 CALL test_abort(
"non-zero error count!", &
109 SUBROUTINE build_idxlists(indices_a, indices_b)
110 TYPE(xt_idxlist),
INTENT(out) :: indices_a, indices_b
112 INTEGER,
PARAMETER :: glob_rank = 4
113 TYPE(xt_idxlist) :: indices_a_(2)
115 INTEGER(xt_int_kind),
PARAMETER :: start = 0
116 INTEGER(xt_int_kind) :: global_size(glob_rank), local_start(glob_rank, 2)
117 INTEGER :: local_size(glob_rank)
121 global_size(1) = int(comm_size, xi)
122 global_size(2) = int(comm_size, xi)
123 global_size(3) = int(comm_size, xi)
124 global_size(4) = 2_xi
125 local_size(1) = comm_size
127 local_size(3) = comm_size
129 local_start(1, 1) = 1_xi
130 local_start(2, 1) = int(comm_rank + 1, xi)
131 local_start(3, 1) = 1_xi
132 local_start(4, 1) = 1_xi
134 local_start(1, 2) = 1_xi
135 local_start(2, 2) = int(comm_size-comm_rank, xi)
136 local_start(3, 2) = 1_xi
137 local_start(4, 2) = 2_xi
140 indices_a_(i) = xt_idxfsection_new(start, global_size, local_size, &
148 stripe =
xt_stripe(start = int(comm_rank * 2 * comm_size**2, xi), &
150 & nstrides = int(2*comm_size**2, c_int))
152 END SUBROUTINE build_idxlists
156 SUBROUTINE test_4redist
157 TYPE(xt_idxlist) :: indices_a, indices_b
158 INTEGER(xt_int_kind) :: index_vector_a(2*comm_size**2), &
159 index_vector_b(2*comm_size**2)
160 TYPE(xt_xmap) :: xmap
161 TYPE(xt_redist) :: redist_repeat, redist_repeat_2, redist_p2p
162 INTEGER(xt_int_kind) :: results_1(2*comm_size**2,4), &
163 results_2(2*comm_size**2,9)
164 INTEGER(xt_int_kind) :: input_data(2*comm_size**2,9)
165 INTEGER(xt_int_kind) :: ref_results_1(2*comm_size**2,4), &
166 ref_results_2(2*comm_size**2,9)
167 INTEGER(mpi_address_kind) :: extent
168 INTEGER(mpi_address_kind) :: base_address, temp_address
169 INTEGER(c_int),
PARAMETER :: &
170 displacements(4) = (/ 0_c_int, 1_c_int, 2_c_int, 3_c_int /), &
171 displacements_2(4) = (/ 1_c_int, 2_c_int, 4_c_int, 8_c_int /)
173 INTEGER(xt_int_kind) :: j
175 CALL build_idxlists(indices_a, indices_b)
188 CALL mpi_get_address(input_data(1,1), base_address, ierror)
189 CALL mpi_get_address(input_data(1,2), temp_address, ierror)
190 extent = temp_address - base_address
200 DO i = 1, 2*comm_size**2
201 input_data(i, j) = index_vector_a(i) + (j - 1_xi) * int(4*comm_size**2, xi)
211 DO i = 1, 2*comm_size**2
212 ref_results_1(i, j) = index_vector_b(i) + (j - 1_xi) * int(4*comm_size**2, xi)
216 DO i = 1, 2*comm_size**2
217 ref_results_2(i, j) = index_vector_b(i) + (j - 1_xi) * int(4*comm_size**2, xi)
221 ref_results_2(:,1:4:3) = -1
222 ref_results_2(:,6:8:1) = -1
225 IF (any(results_1 /= ref_results_1)) &
226 CALL test_abort(
"error on xt_redist_s_exchange", &
229 IF (any(results_2 /= ref_results_2)) &
230 CALL test_abort(
"error on xt_redist_s_exchange", &
238 END SUBROUTINE test_4redist
240 END PROGRAM test_redist_repeat_parallel