48 PROGRAM test_redist_repeat
50 USE ftest_common
, ONLY: init_mpi, finish_mpi, test_abort
51 USE test_idxlist_utils
, ONLY: test_err_count
56 USE test_redist_common
, ONLY: build_odd_selection_xmap, check_redist
57 USE iso_c_binding
, ONLY: c_loc, c_int
63 CALL test_repeated_redist
64 CALL test_repeated_redist_with_gap
65 CALL test_repeated_overlapping_redist
66 CALL test_repeated_redist_asym
68 IF (test_err_count() /= 0) &
69 CALL test_abort(
"non-zero error count!", &
75 SUBROUTINE simple_test
79 TYPE(xt_redist) :: redist, redist_repeat
80 INTEGER,
PARAMETER :: src_slice_len = 5, dst_slice_len = 3
81 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(dst_slice_len) &
82 = (/ 1.0d0, 3.0d0, 5.0d0 /), &
83 src_data(src_slice_len) = (/ 1.0d0, 2.0d0, 3.0d0, 4.0d0, 5.0d0 /)
84 DOUBLE PRECISION :: dst_data(dst_slice_len)
85 INTEGER(mpi_address_kind) :: src_extent, dst_extent
86 INTEGER(mpi_address_kind) :: base_address, temp_address
87 INTEGER(c_int) :: displacements(1) = 0
90 xmap = build_odd_selection_xmap(src_slice_len)
96 CALL mpi_get_address(src_data(1), base_address, ierror)
97 CALL mpi_get_address(src_data(2), temp_address, ierror)
98 src_extent = (temp_address - base_address) * src_slice_len
99 CALL mpi_get_address(dst_data(1), base_address, ierror)
100 CALL mpi_get_address(dst_data(2), temp_address, ierror)
101 dst_extent = (temp_address - base_address) * dst_slice_len
110 CALL check_redist(redist_repeat, src_data, dst_data, ref_dst_data)
114 END SUBROUTINE simple_test
116 SUBROUTINE test_repeated_redist_ds1(redist_repeat)
117 TYPE(xt_redist),
INTENT(in) :: redist_repeat
119 DOUBLE PRECISION,
PARAMETER :: src_data(5, 3) = reshape((/&
120 (dble(i), i = 1, 15)/), (/ 5, 3 /))
121 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(3, 3) &
122 = reshape((/ ((dble(i + j), i = 1,5,2), j = 0,10,5) /), (/ 3, 3 /))
123 DOUBLE PRECISION :: dst_data(3, 3)
125 CALL check_redist(redist_repeat, src_data, dst_data, ref_dst_data)
126 END SUBROUTINE test_repeated_redist_ds1
128 SUBROUTINE test_repeated_redist_ds1_with_gap(redist_repeat)
129 TYPE(xt_redist),
INTENT(in) :: redist_repeat
131 DOUBLE PRECISION,
PARAMETER :: src_data(5, 5) = reshape((/&
132 (dble(i), i = 1, 25)/), (/ 5, 5 /))
133 DOUBLE PRECISION :: dst_data(3, 5)
135 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(3, 5) &
136 = reshape((/ ((dble((i + j)*mod(j+1,2)-mod(j,2)), i = 1,5,2), &
137 j = 0,20,5) /), (/ 3, 5 /))
139 DOUBLE PRECISION :: ref_dst_data(3, 5)
141 = reshape((/ ((dble((i + j)*mod(j+1,2)-mod(j,2)), i = 1,5,2), &
142 j = 0,20,5) /), (/ 3, 5 /))
144 CALL check_redist(redist_repeat, src_data, dst_data, ref_dst_data)
145 END SUBROUTINE test_repeated_redist_ds1_with_gap
147 SUBROUTINE test_repeated_redist_ds2(redist_repeat)
148 TYPE(xt_redist),
INTENT(in) :: redist_repeat
150 DOUBLE PRECISION,
PARAMETER :: src_data(5, 3) = reshape((/&
151 (dble(i), i = 20, 34)/), (/ 5, 3 /))
152 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(3, 3) &
153 = reshape((/ ((dble(i + j), i = 1,5,2), j = 19,33,5) /), (/ 3, 3 /))
154 DOUBLE PRECISION :: dst_data(3, 3)
156 CALL check_redist(redist_repeat, src_data, dst_data, ref_dst_data)
157 END SUBROUTINE test_repeated_redist_ds2
159 SUBROUTINE test_repeated_redist
163 INTEGER,
PARAMETER :: num_slice = 3
164 INTEGER,
PARAMETER :: src_slice_len = 5
165 TYPE(xt_xmap) :: xmap
166 TYPE(xt_redist) :: redist, redist_repeat
167 INTEGER(mpi_address_kind) :: src_extent, dst_extent
168 INTEGER(mpi_address_kind) :: base_address, temp_address
169 INTEGER(c_int) :: displacements(3)
170 DOUBLE PRECISION,
TARGET :: src_template(5, 3), dst_template(3, 3)
173 xmap = build_odd_selection_xmap(src_slice_len)
180 CALL mpi_get_address(src_template(1,1), base_address, ierror)
181 CALL mpi_get_address(src_template(1,2), temp_address, ierror)
182 src_extent = temp_address - base_address
183 CALL mpi_get_address(dst_template(1,1), base_address, ierror)
184 CALL mpi_get_address(dst_template(1,2), temp_address, ierror)
185 dst_extent = temp_address - base_address
186 displacements = (/0,1,2/)
189 num_slice, displacements)
193 CALL test_repeated_redist_ds1(redist_repeat)
195 CALL test_repeated_redist_ds2(redist_repeat)
198 END SUBROUTINE test_repeated_redist
200 SUBROUTINE test_repeated_redist_asym
203 INTEGER,
PARAMETER :: num_slice = 3
204 INTEGER,
PARAMETER :: src_slice_len = 5
205 TYPE(xt_xmap) :: xmap
206 TYPE(xt_redist) :: redist, redist_repeat
207 INTEGER(mpi_address_kind) :: src_extent, dst_extent
208 INTEGER(mpi_address_kind) :: base_address, temp_address
209 INTEGER(c_int) :: src_displacements(3), dst_displacements(3)
210 DOUBLE PRECISION,
TARGET :: src_data(5, 3), dst_data(3, 3), ref_dst_data(3, 3)
211 INTEGER,
PARAMETER :: dp = kind(src_data)
215 xmap = build_odd_selection_xmap(src_slice_len)
222 CALL mpi_get_address(src_data(1,1), base_address, ierror)
223 CALL mpi_get_address(src_data(1,2), temp_address, ierror)
224 src_extent = temp_address - base_address
225 CALL mpi_get_address(dst_data(1,1), base_address, ierror)
226 CALL mpi_get_address(dst_data(1,2), temp_address, ierror)
227 dst_extent = temp_address - base_address
230 src_displacements = [0,1,2]
231 dst_displacements = [2,0,1]
234 src_data = reshape( [(i, i = 1, 15)]*1.0_dp, [5,3] )
235 ref_dst_data = reshape( [6,8,10, 11,13,15, 1,3,5 ]*1.0_dp, [3,3] )
239 num_slice, src_displacements, dst_displacements)
241 CALL check_redist(redist_repeat, src_data, dst_data, ref_dst_data)
246 src_displacements, dst_displacements)
248 CALL check_redist(redist_repeat, src_data, dst_data, ref_dst_data)
252 END SUBROUTINE test_repeated_redist_asym
254 SUBROUTINE test_repeated_redist_with_gap
258 INTEGER,
PARAMETER :: num_slice = 3
259 INTEGER,
PARAMETER :: src_slice_len = 5
260 TYPE(xt_xmap) :: xmap
261 TYPE(xt_redist) :: redist, redist_repeat
262 INTEGER(mpi_address_kind) :: src_extent, dst_extent
263 INTEGER(mpi_address_kind) :: base_address, temp_address
264 INTEGER(c_int),
PARAMETER :: displacements(3) = (/0,2,4/)
265 DOUBLE PRECISION,
TARGET :: src_template(5, 3), dst_template(3, 3)
268 xmap = build_odd_selection_xmap(src_slice_len)
275 CALL mpi_get_address(src_template(1,1), base_address, ierror)
276 CALL mpi_get_address(src_template(1,2), temp_address, ierror)
277 src_extent = temp_address - base_address
278 CALL mpi_get_address(dst_template(1,1), base_address, ierror)
279 CALL mpi_get_address(dst_template(1,2), temp_address, ierror)
280 dst_extent = temp_address - base_address
283 num_slice, displacements)
287 CALL test_repeated_redist_ds1_with_gap(redist_repeat)
290 END SUBROUTINE test_repeated_redist_with_gap
292 SUBROUTINE test_repeated_overlapping_redist
296 INTEGER,
PARAMETER :: npt = 9, selection_len = 6
297 TYPE(xt_xmap) :: xmap
298 TYPE(xt_redist) :: redist, redist_repeat
299 INTEGER(mpi_address_kind) :: src_extent, dst_extent
300 INTEGER(mpi_address_kind) :: base_address, temp_address
301 INTEGER(c_int),
PARAMETER :: displacements(2) = (/ 0, 1 /)
302 INTEGER :: i, j, ierror
303 INTEGER,
PARAMETER :: src_pos(npt) = (/ (i, i=1,npt) /), &
304 dst_pos(npt) = (/ (2*i, i = 0, npt-1) /)
305 DOUBLE PRECISION,
TARGET :: src_data(npt), dst_data(npt)
306 #if __INTEL_COMPILER >= 1600 && __INTEL_COMPILER <= 1602 || defined __PGI 307 DOUBLE PRECISION :: ref_dst_data(npt)
309 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(npt) &
310 = (/ ((dble(((2-j)*3+i+101)*((abs(j)+j)/abs(j+1)) &
311 & +(j-1-abs(j-1))/2), &
312 & i=1,3 ),j=2,0,-1) /)
314 DOUBLE PRECISION,
TARGET :: src_template(2), dst_template(2)
316 xmap = build_odd_selection_xmap(selection_len)
323 #if __INTEL_COMPILER >= 1600 && __INTEL_COMPILER <= 1602 || defined __PGI 326 ref_dst_data(i + (2-j)*3) = dble(((2-j)*3+i+101)*((abs(j)+j)/abs(j+1)) &
332 src_data(i) = 1.0d2 + dble(i)
337 CALL redist_dbl(redist, src_data, dst_data)
338 CALL redist_dbl(redist, src_data(2:), dst_data(2:))
340 IF (any(dst_data /= ref_dst_data)) &
341 CALL test_abort(
"error in xt_redist_s_exchange1", &
346 CALL mpi_get_address(src_template(1), base_address, ierror)
347 CALL mpi_get_address(src_template(2), temp_address, ierror)
348 src_extent = temp_address - base_address
349 CALL mpi_get_address(dst_template(1), base_address, ierror)
350 CALL mpi_get_address(dst_template(2), temp_address, ierror)
351 dst_extent = temp_address - base_address
358 CALL check_redist(redist_repeat, src_data,
SIZE(dst_data), &
359 dst_data, ref_dst_data)
362 END SUBROUTINE test_repeated_overlapping_redist
365 SUBROUTINE redist_dbl(redist, src_data, dst_data)
366 TYPE(xt_redist),
INTENT(in) :: redist
367 DOUBLE PRECISION,
TARGET,
INTENT(in) :: src_data(*)
368 DOUBLE PRECISION,
TARGET,
INTENT(inout) :: dst_data(*)
370 END SUBROUTINE redist_dbl
372 END PROGRAM test_redist_repeat