49 PROGRAM test_redist_collection
51 USE ftest_common
, ONLY: init_mpi, finish_mpi, test_abort
52 USE test_idxlist_utils
, ONLY: test_err_count
61 #if defined __PGI && (__PGIC__ < 12 || (__PGIC__ == 12 && __PGIC_MINOR__ <= 10)) 64 USE test_redist_common
, ONLY: build_odd_selection_xmap, check_redist
65 USE iso_c_binding
, ONLY: c_loc, c_ptr
66 USE redist_collection_displace
, ONLY: test_displacement_variations
73 CALL test_empty_redist
74 CALL test_repeated_redist(-1)
75 CALL test_repeated_redist(0)
76 CALL test_displacement_variations
78 IF (test_err_count() /= 0) &
79 CALL test_abort(
"non-zero error count!", &
85 SUBROUTINE simple_test
89 TYPE(
xt_redist) :: redist, redist_coll, redist_copy
90 INTEGER,
PARAMETER :: src_slice_len = 5, dst_slice_len = 3
91 DOUBLE PRECISION,
PARAMETER :: &
92 ref_dst_data(dst_slice_len) = (/ 1.0d0, 3.0d0, 5.0d0 /), &
93 src_data(src_slice_len) = (/ 1.0d0, 2.0d0, 3.0d0, 4.0d0, 5.0d0 /)
94 DOUBLE PRECISION :: dst_data(dst_slice_len)
97 xmap = build_odd_selection_xmap(src_slice_len)
111 CALL check_redist(redist_coll, src_data, dst_data, ref_dst_data)
115 END SUBROUTINE simple_test
117 SUBROUTINE simple_test2
120 TYPE(xt_xmap) :: xmap
121 TYPE(
xt_redist) :: redist_coll, redist_copy, &
123 INTEGER,
PARAMETER :: src_slice_len = 5, dst_slice_len = 3
124 TYPE src_data_collection
125 DOUBLE PRECISION :: dp(src_slice_len)
126 LOGICAL :: l(src_slice_len)
127 END TYPE src_data_collection
128 TYPE dst_data_collection
129 DOUBLE PRECISION :: dp(dst_slice_len)
130 LOGICAL :: l(dst_slice_len)
131 END TYPE dst_data_collection
132 TYPE(src_data_collection),
SAVE,
TARGET :: src_data = src_data_collection(&
133 (/ 1.0d0, 2.0d0, 3.0d0, 4.0d0, 5.0d0 /), &
134 (/ .true., .false., .true., .false., .true. /))
135 TYPE(dst_data_collection),
PARAMETER :: &
136 ref_dst_data = dst_data_collection((/ 1.0d0, 3.0d0, 5.0d0 /), &
137 (/ .true., .true., .true. /))
138 TYPE(dst_data_collection),
TARGET :: dst_data
139 TYPE(c_ptr) :: src_data_p(2), dst_data_p(2)
141 xmap = build_odd_selection_xmap(src_slice_len)
152 redist_coll = redist_copy
157 #if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 8) 158 src_data_p(1) = c_loc(src_data%dp)
160 CALL xt_slice_c_loc(src_data%dp, src_data_p(1))
162 #if !defined HAVE_FC_LOGICAL_INTEROP || !defined(__GNUC__) || __GNUC__ > 4 \ 163 || (__gnuc__ == 4 && __gnuc_minor__ > 8)
164 CALL xt_slice_c_loc(src_data%l, src_data_p(2))
166 src_data_p(2) = c_loc(src_data%l)
170 #if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 8) 171 dst_data_p(1) = c_loc(dst_data%dp)
173 CALL xt_slice_c_loc(dst_data%dp, dst_data_p(1))
175 #if !defined HAVE_FC_LOGICAL_INTEROP || !defined(__GNUC__) || __GNUC__ > 4 \ 176 || (__gnuc__ == 4 && __gnuc_minor__ > 8)
177 CALL xt_slice_c_loc(dst_data%l, dst_data_p(2))
179 dst_data_p(2) = c_loc(dst_data%l)
182 IF (any(dst_data%l .NEQV. ref_dst_data%l)) &
183 CALL test_abort(
"error in xt_redist_s_exchange", &
186 IF (any(dst_data%dp /= ref_dst_data%dp)) &
187 CALL test_abort(
"error in xt_redist_s_exchange", &
193 END SUBROUTINE simple_test2
195 SUBROUTINE test_empty_redist
198 TYPE(xt_idxlist) :: src_idxlist, dst_idxlist
199 TYPE(xt_xmap) :: xmap
200 TYPE(
xt_redist) :: redist, redist_coll, redist_copy
224 END SUBROUTINE test_empty_redist
226 SUBROUTINE test_repeated_redist_ds1(redist_coll)
227 TYPE(
xt_redist),
INTENT(in) :: redist_coll
229 DOUBLE PRECISION,
SAVE,
TARGET :: src_data(5, 3) = reshape((/&
230 (dble(i), i = 1, 15)/), (/ 5, 3 /))
231 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(3, 3) &
232 = reshape((/ ((dble(i + j), i = 1,5,2), j = 0,10,5) /), (/ 3, 3 /))
233 DOUBLE PRECISION,
TARGET :: dst_data(3, 3)
234 TYPE(c_ptr) :: src_data_p(3), dst_data_p(3)
237 CALL xt_slice_c_loc(src_data(:, i), src_data_p(i))
238 CALL xt_slice_c_loc(dst_data(:, i), dst_data_p(i))
242 IF (any(ref_dst_data /= dst_data)) &
243 CALL test_abort(
"error in xt_redist_s_exchange", &
246 END SUBROUTINE test_repeated_redist_ds1
248 SUBROUTINE test_repeated_redist_ds2(redist_coll)
249 TYPE(
xt_redist),
INTENT(in) :: redist_coll
251 DOUBLE PRECISION,
SAVE,
TARGET :: src_data(5, 3) = reshape((/&
252 (dble(i), i = 1, 15)/), (/ 5, 3 /))
253 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(3, 3) &
254 = reshape((/ ((dble(i + j), i = 1,5,2), j = 0,10,5) /), (/ 3, 3 /))
255 DOUBLE PRECISION,
TARGET :: dst_data(3, 3)
256 TYPE(c_ptr) :: src_data_p(3), dst_data_p(3)
258 CALL xt_slice_c_loc(src_data(:, 2), src_data_p(1))
259 CALL xt_slice_c_loc(src_data(:, 1), src_data_p(2))
260 CALL xt_slice_c_loc(src_data(:, 3), src_data_p(3))
261 CALL xt_slice_c_loc(dst_data(:, 2), dst_data_p(1))
262 CALL xt_slice_c_loc(dst_data(:, 1), dst_data_p(2))
263 CALL xt_slice_c_loc(dst_data(:, 3), dst_data_p(3))
266 IF (any(ref_dst_data /= dst_data)) &
267 CALL test_abort(
"error in xt_redist_s_exchange", &
270 END SUBROUTINE test_repeated_redist_ds2
272 SUBROUTINE test_repeated_redist(cache_size)
273 INTEGER,
INTENT(in) :: cache_size
277 INTEGER,
PARAMETER :: num_slice = 3
278 INTEGER,
PARAMETER :: src_slice_len = 5
279 TYPE(xt_xmap) :: xmap
280 TYPE(
xt_redist) :: redists(num_slice), redist_coll, redist_coll_copy
282 xmap = build_odd_selection_xmap(src_slice_len)
296 CALL test_repeated_redist_ds1(redist_coll)
298 CALL test_repeated_redist_ds2(redist_coll)
300 CALL test_repeated_redist_ds1(redist_coll)
305 CALL test_repeated_redist_ds1(redist_coll_copy)
307 CALL test_repeated_redist_ds2(redist_coll_copy)
309 CALL test_repeated_redist_ds1(redist_coll_copy)
313 END SUBROUTINE test_repeated_redist
315 END PROGRAM test_redist_collection