48 MODULE redist_collection_displace
50 USE ftest_common
, ONLY: test_abort
51 USE yaxt, ONLY: xt_int_kind, xi => xt_int_kind, &
57 #if defined __PGI && (__PGIC__ < 12 || (__PGIC__ == 12 && __PGIC_MINOR__ <= 10)) 60 USE test_redist_common
, ONLY: build_odd_selection_xmap
61 USE iso_c_binding
, ONLY: c_ptr
64 INTEGER,
PARAMETER :: cache_size = 16, cache_overrun = 2
65 INTEGER(xt_int_kind),
PARAMETER :: num_slice = 3_xi, dst_step = 2_xi
66 INTEGER,
PARAMETER :: src_slice_len = 5
67 INTEGER,
PARAMETER :: dst_slice_len &
68 = (src_slice_len + dst_step - 1)/dst_step
69 PUBLIC :: test_displacement_variations
74 SUBROUTINE test_displacement_variations
76 TYPE(
xt_redist) :: redist, redists(num_slice), redist_coll, &
79 xmap = build_odd_selection_xmap(src_slice_len)
88 cache_size, mpi_comm_world)
92 CALL run_displacement_check(redist_coll)
94 CALL run_displacement_check(redist_coll_copy)
99 END SUBROUTINE test_displacement_variations
101 SUBROUTINE run_displacement_check(redist_coll)
102 TYPE(
xt_redist),
INTENT(in) :: redist_coll
103 INTEGER(xt_int_kind) :: i, j
105 DOUBLE PRECISION,
TARGET,
SAVE :: src_data(src_slice_len, num_slice) &
106 = reshape((/ (dble(i), i = 1_xi, src_slice_len*num_slice) /), &
107 (/ int(src_slice_len), int(num_slice) /))
108 DOUBLE PRECISION,
TARGET :: dst_data(dst_slice_len, num_slice)
109 DOUBLE PRECISION,
TARGET :: &
110 src_data_(src_slice_len + cache_size + cache_overrun), &
111 dst_data_(dst_slice_len + cache_size + cache_overrun)
112 TYPE(c_ptr) :: src_data_p(num_slice), dst_data_p(num_slice)
113 DOUBLE PRECISION,
PARAMETER :: ref_dst_data(dst_slice_len, num_slice) = &
114 reshape((/ ((dble(i + j * src_slice_len), &
115 & i = 1_xi, src_slice_len, dst_step), &
116 & j = 0_xi, num_slice - 1_xi) /), &
117 & (/ int(dst_slice_len), int(num_slice) /))
121 DO i = 1, num_slice - 1
122 CALL xt_slice_c_loc(src_data(:, i), src_data_p(i))
123 CALL xt_slice_c_loc(dst_data(:, i), dst_data_p(i))
127 DO k = 1, cache_size + cache_overrun
128 src_data_(k:k+src_slice_len-1) = src_data(:,num_slice)
129 dst_data_(k:k+dst_slice_len-1) = -1.0d0
132 CALL xt_slice_c_loc(src_data_(k:k+src_slice_len-1), src_data_p(3))
133 CALL xt_slice_c_loc(dst_data_(k:k+dst_slice_len-1), dst_data_p(3))
138 IF (any(ref_dst_data(:, 1:num_slice-1) /= dst_data(:, 1:2)) &
139 .OR. any(ref_dst_data(:,3) /= dst_data_(k:k+dst_slice_len-1))) &
140 CALL test_abort(
"error in xt_redist_s_exchange", &
144 END SUBROUTINE run_displacement_check
146 END MODULE redist_collection_displace