48 PROGRAM test_redist_collection_parallel
50 USE ftest_common
, ONLY: init_mpi, finish_mpi, test_abort
51 USE test_idxlist_utils
, ONLY: test_err_count
60 #if defined __PGI && (__PGIC__ < 12 || (__PGIC__ == 12 && __PGIC_MINOR__ <= 10)) 63 USE iso_c_binding
, ONLY: c_loc, c_ptr
65 INTEGER :: rank, world_size, ierror
69 CALL mpi_comm_rank(mpi_comm_world, rank, ierror)
70 IF (ierror /= mpi_success) &
71 CALL test_abort(
'mpi_comm_rank failed', &
74 CALL mpi_comm_size(mpi_comm_world, world_size, ierror)
75 IF (ierror /= mpi_success) &
76 CALL test_abort(
'mpi_comm_size failed', &
80 IF (world_size > 1)
THEN 85 IF (test_err_count() /= 0) &
86 CALL test_abort(
"non-zero error count!", &
92 SUBROUTINE build_idxlists(indices_a, indices_b, indices_all)
93 TYPE(xt_idxlist),
INTENT(out) :: indices_a, indices_b, indices_all
95 TYPE(xt_idxlist) :: indices_a_(2)
97 INTEGER(xt_int_kind),
PARAMETER :: start = 0
98 INTEGER(xt_int_kind) :: global_size(2), local_start(2, 2)
99 INTEGER :: local_size(2)
103 global_size(1) = int(2 * world_size, xi)
104 global_size(2) = int(world_size**2, xi)
105 local_size = world_size
106 local_start = reshape((/ 0_xi, int(rank*world_size, xi), &
107 int(world_size, xi), &
108 int((world_size-(rank+1))*world_size, xi) /), (/ 2, 2 /))
119 stripe =
xt_stripe(int(rank * 2 * world_size**2, xi), 1_xi, 2*world_size**2)
122 stripe =
xt_stripe(0_xi, 1_xi, 2*world_size**3)
124 END SUBROUTINE build_idxlists
126 SUBROUTINE test_4redist
128 INTEGER,
PARAMETER :: num_tx = 4
129 TYPE(xt_idxlist) :: indices_a, indices_b, indices_all
130 INTEGER(xt_int_kind),
ALLOCATABLE :: index_vector_a(:), &
132 TYPE(xt_xmap) :: xmaps(num_tx)
133 TYPE(
xt_redist) :: redists(num_tx), redist, redist_copy
136 ALLOCATE(index_vector_a(2*world_size**2), index_vector_b(2*world_size**2))
137 CALL build_idxlists(indices_a, indices_b, indices_all)
164 CALL exchange_4redist(redist, index_vector_a, index_vector_b)
167 CALL exchange_4redist(redist_copy, index_vector_a, index_vector_b)
171 END SUBROUTINE test_4redist
173 SUBROUTINE exchange_4redist(redist, index_vector_a, index_vector_b)
175 INTEGER(xt_int_kind),
INTENT(in) :: index_vector_a(2*world_size**2), &
176 index_vector_b(2*world_size**2)
177 INTEGER(xt_int_kind),
TARGET,
ALLOCATABLE :: buf(:)
178 INTEGER(xt_int_kind),
POINTER :: results_1(:), &
179 results_2(:), results_3(:), results_4(:)
180 INTEGER :: result_sizes(4), buf_size, ofs
181 INTEGER,
PARAMETER :: result_spacing(4) = (/ 2, 14, 5, 8 /)
183 result_sizes(1) = 2*world_size**2
184 result_sizes(2) = 2*world_size**2
185 result_sizes(3) = 2*world_size**3
186 result_sizes(4) = 2*world_size**3
188 buf_size = sum(result_spacing) + sum(result_sizes)
189 ALLOCATE(buf(buf_size))
191 ofs = result_spacing(1)
192 results_1 => buf(ofs+1:ofs+result_sizes(1))
193 ofs = ofs + result_sizes(1) + result_spacing(2)
194 results_2 => buf(ofs+1:ofs+result_sizes(2))
195 ofs = ofs + result_sizes(2) + result_spacing(3)
196 results_3 => buf(ofs+1:ofs+result_sizes(3))
197 ofs = ofs + result_sizes(3) + result_spacing(4)
198 results_4 => buf(ofs+1:ofs+result_sizes(4))
200 CALL do_4redist(redist, index_vector_a, index_vector_b, &
201 results_1, results_2, results_3, results_4)
203 CALL check_4redist_results(results_1, results_2, results_3, results_4, &
204 index_vector_a, index_vector_b)
208 ofs = sum(result_spacing(1:2)) + sum(result_sizes(1:2))
209 results_3 => buf(ofs+1:ofs+result_sizes(3))
212 CALL do_4redist(redist, index_vector_a, index_vector_b, &
213 results_1, results_2, results_3, results_4)
215 CALL check_4redist_results(results_1, results_2, results_3, results_4, &
216 index_vector_a, index_vector_b)
219 END SUBROUTINE exchange_4redist
221 SUBROUTINE do_4redist(redist, index_vector_a, index_vector_b, &
222 results_1, results_2, results_3, results_4)
224 INTEGER(xt_int_kind),
INTENT(in),
TARGET :: &
225 index_vector_a(*), index_vector_b(*)
226 INTEGER(xt_int_kind),
INTENT(inout),
TARGET :: &
227 results_1(*), results_2(*), results_3(*), results_4(*)
229 TYPE(c_ptr) :: results(4), input(4)
230 results(1) = c_loc(results_1)
231 results(2) = c_loc(results_2)
232 results(3) = c_loc(results_3)
233 results(4) = c_loc(results_4)
235 input(1) = c_loc(index_vector_a)
236 input(2) = c_loc(index_vector_b)
237 input(3) = c_loc(index_vector_a)
238 input(4) = c_loc(index_vector_b)
242 END SUBROUTINE do_4redist
244 SUBROUTINE check_4redist_results(results_1, results_2, results_3, results_4, &
245 index_vector_a, index_vector_b)
246 INTEGER(xt_int_kind),
INTENT(in) :: index_vector_a(:), index_vector_b(:), &
247 results_1(:), results_2(:), results_3(0:), results_4(0:)
248 INTEGER(xt_int_kind) :: i, n
251 IF (any(results_1 /= index_vector_b)) &
252 CALL test_abort(
"error on xt_redist_s_exchange", &
256 IF (any(results_2 /= index_vector_a)) &
257 CALL test_abort(
"error on xt_redist_s_exchange", &
262 n = int(
SIZE(results_3), xt_int_kind)
265 p = p .OR. results_3(i) /= i
268 CALL test_abort(
"error on xt_redist_s_exchange", &
273 p = p .OR. results_4(i) /= i
276 CALL test_abort(
"error on xt_redist_s_exchange", &
279 END SUBROUTINE check_4redist_results
284 SUBROUTINE test_rr_exchange
285 TYPE(xt_idxlist) :: src_indices, dst_indices(2)
286 INTEGER(xt_int_kind) :: src_indices_(5)
287 INTEGER(xt_int_kind) :: i, temp, dst_indices_(5, 2)
288 TYPE(xt_xmap) :: xmaps(2)
289 TYPE(
xt_redist) :: redists(2), redist, redist_copy
292 src_indices_(i) = int(rank, xi) * 5_xi + (i - 1_xi)
293 dst_indices_(i, 1) = mod(src_indices_(i) + 1_xi, &
294 & int(world_size, xi) * 5_xi)
295 temp = src_indices_(i) - 1_xi
296 dst_indices_(i, 2) = merge(int(world_size, xi) * 5_xi - 1_xi, &
323 CALL rr_exchange(redist, src_indices_, dst_indices_)
326 CALL rr_exchange(redist_copy, src_indices_, dst_indices_)
330 END SUBROUTINE test_rr_exchange
332 SUBROUTINE rr_exchange(redist, src_indices_, ref_dst_indices_)
334 INTEGER(xt_int_kind),
TARGET,
INTENT(in) :: src_indices_(5)
335 INTEGER(xt_int_kind),
INTENT(in) :: ref_dst_indices_(5, 2)
338 INTEGER(xt_int_kind),
TARGET :: results(5,2)
339 TYPE(c_ptr) :: results_p(2), input(2)
343 CALL xt_slice_c_loc(results(:,1), results_p(1))
344 CALL xt_slice_c_loc(results(:,2), results_p(2))
346 input(1) = c_loc(src_indices_)
347 input(2) = c_loc(src_indices_)
352 IF (any(results /= ref_dst_indices_)) &
353 CALL test_abort(
"error on xt_redist_s_exchange", &
356 END SUBROUTINE rr_exchange
358 END PROGRAM test_redist_collection_parallel