48 PROGRAM test_redist_collection_static_parallel
50 USE ftest_common
, ONLY: init_mpi, finish_mpi, test_abort
51 USE test_idxlist_utils
, ONLY: test_err_count
59 USE test_redist_common
, ONLY: check_redist_xi
60 USE iso_c_binding
, ONLY: c_loc, c_ptr
62 #if defined __PGI && (__PGIC__ < 12 || (__PGIC__ == 12 && __PGIC_MINOR__ <= 10)) 66 INTEGER :: rank, comm_size, ierror
70 CALL mpi_comm_rank(mpi_comm_world, rank, ierror)
71 IF (ierror /= mpi_success) &
72 CALL test_abort(
'mpi_comm_rank failed', &
75 CALL mpi_comm_size(mpi_comm_world, comm_size, ierror)
76 IF (ierror /= mpi_success) &
77 CALL test_abort(
'mpi_comm_size failed', &
81 IF (comm_size > 1)
THEN 86 IF (test_err_count() /= 0) &
87 CALL test_abort(
"non-zero error count!", &
93 SUBROUTINE build_idxlists(indices_a, indices_b, indices_all)
95 TYPE(xt_idxlist),
INTENT(out) :: indices_a, indices_b, indices_all
97 TYPE(xt_idxlist) :: indices_a_(2)
99 INTEGER(xt_int_kind),
PARAMETER :: start = 0
100 INTEGER(xt_int_kind) :: global_size(2), local_start(2, 2)
101 INTEGER :: local_size(2)
105 global_size(1) = int(2 * comm_size, xi)
106 global_size(2) = int(comm_size**2, xi)
107 local_size = comm_size
108 local_start = reshape((/ 0_xi, int(rank*comm_size, xi), &
109 int(comm_size, xi), int(comm_size**2-(rank+1)*comm_size, xi) /), &
121 stripe =
xt_stripe(int(rank * 2 * comm_size**2, xi), 1_xi, 2*comm_size**2)
124 stripe =
xt_stripe(0_xi, 1_xi, 2*comm_size**3)
126 END SUBROUTINE build_idxlists
128 SUBROUTINE test_4redist
129 INTEGER,
PARAMETER :: num_tx = 4
130 TYPE(xt_idxlist) :: indices_a, indices_b, indices_all
131 INTEGER(xt_int_kind),
ALLOCATABLE,
TARGET :: src(:), dst(:)
132 INTEGER(xt_int_kind),
POINTER :: index_vector_a(:), &
133 index_vector_b(:), index_vector_all(:)
134 TYPE(xt_xmap) :: xmaps(num_tx)
135 TYPE(
xt_redist) :: redists(num_tx), redist, redist_copy
136 INTEGER(mpi_address_kind) :: src_displacements(num_tx), &
137 dst_displacements(num_tx)
138 INTEGER :: i, ierror, size_a, size_b, size_all
139 INTEGER(xt_int_kind),
POINTER :: results_1(:), &
140 results_2(:), results_3(:), results_4(:)
142 size_a = 2 * comm_size**2
143 size_b = 2 * comm_size**2
144 size_all = 2 * comm_size**3
146 ALLOCATE(src(size_a + size_b + size_all), dst(size_b + size_a + 2*size_all))
148 index_vector_a => src(1:size_a)
149 index_vector_b => src(size_a+1:size_a+size_b)
150 index_vector_all => src(size_a+size_b+1:)
152 results_1 => dst(1:size_b)
153 results_2 => dst(size_b+1:size_b+size_a)
154 results_3 => dst(size_b+size_a+1:size_b+size_a+size_all)
155 results_4 => dst(size_b+size_a+size_all+1:size_b+size_a+2*size_all)
157 CALL build_idxlists(indices_a, indices_b, indices_all)
177 CALL mpi_get_address(index_vector_a, src_displacements(1), ierror)
178 CALL mpi_get_address(index_vector_b, src_displacements(2), ierror)
179 CALL mpi_get_address(index_vector_a, src_displacements(3), ierror)
180 CALL mpi_get_address(index_vector_b, src_displacements(4), ierror)
182 src_displacements = src_displacements - src_displacements(1)
184 CALL mpi_get_address(results_1, dst_displacements(1), ierror)
185 CALL mpi_get_address(results_2, dst_displacements(2), ierror)
186 CALL mpi_get_address(results_3, dst_displacements(3), ierror)
187 CALL mpi_get_address(results_4, dst_displacements(4), ierror)
189 dst_displacements = dst_displacements - dst_displacements(1)
192 src_displacements, dst_displacements, mpi_comm_world)
200 CALL test_transpose_gather(redist, dst, size_a, size_b, size_all, &
201 index_vector_a, index_vector_b, index_vector_all)
204 CALL test_transpose_gather(redist_copy, dst, size_a, size_b, size_all, &
205 index_vector_a, index_vector_b, index_vector_all)
209 END SUBROUTINE test_4redist
211 SUBROUTINE test_transpose_gather(redist, dst, size_a, size_b, &
212 size_all, index_vector_a, index_vector_b, index_vector_all)
214 INTEGER,
INTENT(in) :: size_a, size_b, size_all
215 INTEGER(xt_int_kind),
TARGET,
INTENT(inout) :: dst(size_b+size_a+2*size_all)
216 INTEGER(xt_int_kind),
TARGET,
INTENT(in) :: index_vector_a(size_a)
217 INTEGER(xt_int_kind),
INTENT(in) :: index_vector_b(size_b), &
218 index_vector_all(size_all)
220 INTEGER(xt_int_kind),
POINTER :: results_1(:), &
221 results_2(:), results_3(:), results_4(:)
222 TYPE(c_ptr) :: results(1), input(1)
224 results_1 => dst(1:size_b)
225 results_2 => dst(size_b+1:size_b+size_a)
226 results_3 => dst(size_b+size_a+1:size_b+size_a+size_all)
227 results_4 => dst(size_b+size_a+size_all+1:size_b+size_a+2*size_all)
230 input(1) = c_loc(index_vector_a(1))
231 results(1) = c_loc(results_1(1))
236 IF (any(results_1(:) /= index_vector_b)) &
237 CALL test_abort(
"error on xt_redist_s_exchange", &
241 IF (any(results_2(:) /= index_vector_a)) &
242 CALL test_abort(
"error on xt_redist_s_exchange", &
246 IF (any(results_3(:) /= index_vector_all)) &
247 CALL test_abort(
"error on xt_redist_s_exchange", &
251 IF (any(results_4(:) /= index_vector_all)) &
252 CALL test_abort(
"error on xt_redist_s_exchange", &
256 END SUBROUTINE test_transpose_gather
260 SUBROUTINE test_rr_exchange
261 TYPE(xt_idxlist) :: src_idxlist, dst_idxlist
262 INTEGER,
PARAMETER :: num_local_indices = 5
263 INTEGER(xt_int_kind) :: src_indices(num_local_indices)
264 INTEGER(xt_int_kind) :: i_xi, temp, dst_indices(num_local_indices, 2)
265 INTEGER(xt_int_kind) :: num_indices_global
267 TYPE(xt_xmap) :: xmaps(2)
269 INTEGER(xt_int_kind) :: results(num_local_indices, 2)
270 INTEGER(mpi_address_kind) :: src_displacements(2), dst_displacements(2), &
274 num_indices_global = int(comm_size, xi) * int(num_local_indices, xi)
275 DO i = 1, num_local_indices
278 = int(rank, xi) * int(num_local_indices, xi) + (i_xi - 1_xi)
279 dst_indices(i, 1) = mod(src_indices(i) + 1_xi, num_indices_global)
280 temp = src_indices(i) - 1_xi
281 dst_indices(i, 2) = merge(num_indices_global - 1_xi, temp, temp < 0_xi)
295 src_displacements = 0_mpi_address_kind
296 dst_displacements(1) = 0_mpi_address_kind
297 CALL mpi_get_address(results(:, 2), dst_displacements(2), ierror)
298 IF (ierror /= mpi_success) &
299 CALL test_abort(
"error in mpi_get_address", &
302 CALL mpi_get_address(results(:, 1), addr_temp, ierror)
303 IF (ierror /= mpi_success) &
304 CALL test_abort(
"error in mpi_get_address", &
307 dst_displacements(2) = dst_displacements(2) - addr_temp
310 dst_displacements, mpi_comm_world)
318 CALL check_redist_xi(redist, src_indices,
SIZE(dst_indices), &
319 results, dst_indices)
323 END SUBROUTINE test_rr_exchange
325 END PROGRAM test_redist_collection_static_parallel