1 /**
2 * Copyright (C) Mellanox Technologies Ltd. 2001-2015. ALL RIGHTS RESERVED.
3 * Copyright (c) UT-Battelle, LLC. 2015. ALL RIGHTS RESERVED.
4 *
5 * See file LICENSE for terms.
6 */
7
8 #include "test_ucp_memheap.h"
9 #include <ucs/sys/sys.h>
10
11
12 class test_ucp_rma : public test_ucp_memheap {
13 private:
send_completion(void * request,ucs_status_t status)14 static void send_completion(void *request, ucs_status_t status){}
15 public:
get_ctx_params()16 static ucp_params_t get_ctx_params() {
17 ucp_params_t params = ucp_test::get_ctx_params();
18 params.features |= UCP_FEATURE_RMA;
19 return params;
20 }
21
22 std::vector<ucp_test_param>
enum_test_params(const ucp_params_t & ctx_params,const std::string & name,const std::string & test_case_name,const std::string & tls)23 static enum_test_params(const ucp_params_t& ctx_params,
24 const std::string& name,
25 const std::string& test_case_name,
26 const std::string& tls)
27 {
28 std::vector<ucp_test_param> result;
29 generate_test_params_variant(ctx_params, name, test_case_name, tls, 0,
30 result);
31 generate_test_params_variant(ctx_params, name, test_case_name + "/map_nb",
32 tls, UCP_MEM_MAP_NONBLOCK, result);
33 return result;
34 }
35
nonblocking_put_nbi(entity * e,size_t max_size,void * memheap_addr,ucp_rkey_h rkey,std::string & expected_data)36 void nonblocking_put_nbi(entity *e, size_t max_size,
37 void *memheap_addr,
38 ucp_rkey_h rkey,
39 std::string& expected_data)
40 {
41 ucs_status_t status;
42 status = ucp_put_nbi(e->ep(), &expected_data[0], expected_data.length(),
43 (uintptr_t)memheap_addr, rkey);
44 ASSERT_UCS_OK_OR_INPROGRESS(status);
45 }
46
nonblocking_put_nb(entity * e,size_t max_size,void * memheap_addr,ucp_rkey_h rkey,std::string & expected_data)47 void nonblocking_put_nb(entity *e, size_t max_size,
48 void *memheap_addr,
49 ucp_rkey_h rkey,
50 std::string& expected_data)
51 {
52 void *status;
53
54 status = ucp_put_nb(e->ep(), &expected_data[0], expected_data.length(),
55 (uintptr_t)memheap_addr, rkey, send_completion);
56 ASSERT_UCS_PTR_OK(status);
57 if (UCS_PTR_IS_PTR(status)) {
58 wait(status);
59 }
60 }
61
nonblocking_get_nbi(entity * e,size_t max_size,void * memheap_addr,ucp_rkey_h rkey,std::string & expected_data)62 void nonblocking_get_nbi(entity *e, size_t max_size,
63 void *memheap_addr,
64 ucp_rkey_h rkey,
65 std::string& expected_data)
66 {
67 ucs_status_t status;
68
69 ucs::fill_random(memheap_addr, ucs_min(max_size, 16384U));
70 status = ucp_get_nbi(e->ep(), (void *)&expected_data[0], expected_data.length(),
71 (uintptr_t)memheap_addr, rkey);
72 ASSERT_UCS_OK_OR_INPROGRESS(status);
73 }
74
nonblocking_get_nb(entity * e,size_t max_size,void * memheap_addr,ucp_rkey_h rkey,std::string & expected_data)75 void nonblocking_get_nb(entity *e, size_t max_size,
76 void *memheap_addr,
77 ucp_rkey_h rkey,
78 std::string& expected_data)
79 {
80 void *status;
81
82 ucs::fill_random(memheap_addr, ucs_min(max_size, 16384U));
83 status = ucp_get_nb(e->ep(), &expected_data[0], expected_data.length(),
84 (uintptr_t)memheap_addr, rkey, send_completion);
85 ASSERT_UCS_PTR_OK(status);
86 if (UCS_PTR_IS_PTR(status)) {
87 wait(status);
88 }
89 }
90
91 void test_message_sizes(blocking_send_func_t func, size_t *msizes, int iters, int is_nbi);
92 };
93
test_message_sizes(blocking_send_func_t func,size_t * msizes,int iters,int is_nbi)94 void test_ucp_rma::test_message_sizes(blocking_send_func_t func, size_t *msizes, int iters, int is_nbi)
95 {
96 int i;
97
98 for (i = 0; msizes[i] > 0; i++) {
99 if (is_nbi) {
100 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(func),
101 msizes[i], i, 1, false, false);
102 } else {
103 test_blocking_xfer(func, msizes[i], iters, 1, false, false);
104 }
105 }
106 }
107
UCS_TEST_P(test_ucp_rma,nbi_small)108 UCS_TEST_P(test_ucp_rma, nbi_small) {
109 size_t sizes[] = { 8, 24, 96, 120, 250, 0};
110
111 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
112 sizes, 1000, 1);
113 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
114 sizes, 1000, 1);
115 }
116
UCS_TEST_P(test_ucp_rma,nbi_med)117 UCS_TEST_P(test_ucp_rma, nbi_med) {
118 size_t sizes[] = { 1000, 3000, 9000, 17300, 31000, 99000, 130000, 0};
119
120 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
121 sizes, 100, 1);
122 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
123 sizes, 100, 1);
124 }
125
UCS_TEST_SKIP_COND_P(test_ucp_rma,nbi_large,RUNNING_ON_VALGRIND)126 UCS_TEST_SKIP_COND_P(test_ucp_rma, nbi_large, RUNNING_ON_VALGRIND) {
127 size_t sizes[] = { 1 * UCS_MBYTE, 3 * UCS_MBYTE, 9 * UCS_MBYTE,
128 17 * UCS_MBYTE, 32 * UCS_MBYTE, 0};
129
130 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
131 sizes, 3, 1);
132 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
133 sizes, 3, 1);
134 }
135
UCS_TEST_P(test_ucp_rma,nb_small)136 UCS_TEST_P(test_ucp_rma, nb_small) {
137 size_t sizes[] = { 8, 24, 96, 120, 250, 0};
138
139 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
140 sizes, 1000, 1);
141 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
142 sizes, 1000, 1);
143 }
144
UCS_TEST_P(test_ucp_rma,nb_med)145 UCS_TEST_P(test_ucp_rma, nb_med) {
146 size_t sizes[] = { 1000, 3000, 9000, 17300, 31000, 99000, 130000, 0};
147
148 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
149 sizes, 100, 1);
150 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
151 sizes, 100, 1);
152 }
153
UCS_TEST_SKIP_COND_P(test_ucp_rma,nb_large,RUNNING_ON_VALGRIND)154 UCS_TEST_SKIP_COND_P(test_ucp_rma, nb_large, RUNNING_ON_VALGRIND) {
155 size_t sizes[] = { 1 * UCS_MBYTE, 3 * UCS_MBYTE, 9 * UCS_MBYTE,
156 17 * UCS_MBYTE, 32 * UCS_MBYTE, 0};
157
158 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
159 sizes, 3, 1);
160 test_message_sizes(static_cast<blocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
161 sizes, 3, 1);
162 }
163
UCS_TEST_P(test_ucp_rma,nonblocking_put_nbi_flush_worker)164 UCS_TEST_P(test_ucp_rma, nonblocking_put_nbi_flush_worker) {
165 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
166 DEFAULT_SIZE, DEFAULT_ITERS,
167 1, false, false);
168 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
169 DEFAULT_SIZE, DEFAULT_ITERS,
170 1, true, false);
171 }
172
UCS_TEST_P(test_ucp_rma,nonblocking_put_nbi_flush_ep)173 UCS_TEST_P(test_ucp_rma, nonblocking_put_nbi_flush_ep) {
174 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
175 DEFAULT_SIZE, DEFAULT_ITERS,
176 1, false, true);
177 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
178 DEFAULT_SIZE, DEFAULT_ITERS,
179 1, true, true);
180 }
181
UCS_TEST_P(test_ucp_rma,nonblocking_stream_put_nbi_flush_worker)182 UCS_TEST_P(test_ucp_rma, nonblocking_stream_put_nbi_flush_worker) {
183 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
184 DEFAULT_SIZE, DEFAULT_ITERS,
185 1, false, false);
186 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
187 DEFAULT_SIZE, DEFAULT_ITERS,
188 1, true, false);
189 }
190
UCS_TEST_P(test_ucp_rma,nonblocking_stream_put_nbi_flush_ep)191 UCS_TEST_P(test_ucp_rma, nonblocking_stream_put_nbi_flush_ep) {
192 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
193 DEFAULT_SIZE, DEFAULT_ITERS,
194 1, false, true);
195 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nbi),
196 DEFAULT_SIZE, DEFAULT_ITERS,
197 1, true, true);
198 }
199
UCS_TEST_P(test_ucp_rma,nonblocking_put_nb_flush_worker)200 UCS_TEST_P(test_ucp_rma, nonblocking_put_nb_flush_worker) {
201 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
202 DEFAULT_SIZE, DEFAULT_ITERS,
203 1, false, false);
204 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
205 DEFAULT_SIZE, DEFAULT_ITERS,
206 1, true, false);
207 }
208
UCS_TEST_P(test_ucp_rma,nonblocking_put_nb_flush_ep)209 UCS_TEST_P(test_ucp_rma, nonblocking_put_nb_flush_ep) {
210 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
211 DEFAULT_SIZE, DEFAULT_ITERS,
212 1, false, true);
213 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
214 DEFAULT_SIZE, DEFAULT_ITERS,
215 1, true, true);
216 }
217
UCS_TEST_P(test_ucp_rma,nonblocking_stream_put_nb_flush_worker)218 UCS_TEST_P(test_ucp_rma, nonblocking_stream_put_nb_flush_worker) {
219 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
220 DEFAULT_SIZE, DEFAULT_ITERS,
221 1, false, false);
222 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
223 DEFAULT_SIZE, DEFAULT_ITERS,
224 1, true, false);
225 }
226
UCS_TEST_P(test_ucp_rma,nonblocking_stream_put_nb_flush_ep)227 UCS_TEST_P(test_ucp_rma, nonblocking_stream_put_nb_flush_ep) {
228 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
229 DEFAULT_SIZE, DEFAULT_ITERS,
230 1, false, true);
231 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_put_nb),
232 DEFAULT_SIZE, DEFAULT_ITERS,
233 1, true, true);
234 }
235
UCS_TEST_P(test_ucp_rma,nonblocking_get_nbi_flush_worker)236 UCS_TEST_P(test_ucp_rma, nonblocking_get_nbi_flush_worker) {
237 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
238 DEFAULT_SIZE, DEFAULT_ITERS,
239 1, false, false);
240 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
241 DEFAULT_SIZE, DEFAULT_ITERS,
242 1, true, false);
243 }
244
UCS_TEST_P(test_ucp_rma,nonblocking_get_nbi_flush_ep)245 UCS_TEST_P(test_ucp_rma, nonblocking_get_nbi_flush_ep) {
246 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
247 DEFAULT_SIZE, DEFAULT_ITERS,
248 1, false, true);
249 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
250 DEFAULT_SIZE, DEFAULT_ITERS,
251 1, true, true);
252 }
253
UCS_TEST_P(test_ucp_rma,nonblocking_stream_get_nbi_flush_worker)254 UCS_TEST_P(test_ucp_rma, nonblocking_stream_get_nbi_flush_worker) {
255 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
256 DEFAULT_SIZE, DEFAULT_ITERS,
257 1, false, false);
258 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
259 DEFAULT_SIZE, DEFAULT_ITERS,
260 1, true, false);
261 }
262
UCS_TEST_P(test_ucp_rma,nonblocking_stream_get_nbi_flush_ep)263 UCS_TEST_P(test_ucp_rma, nonblocking_stream_get_nbi_flush_ep) {
264 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
265 DEFAULT_SIZE, DEFAULT_ITERS,
266 1, false, true);
267 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nbi),
268 DEFAULT_SIZE, DEFAULT_ITERS,
269 1, true, true);
270 }
271
UCS_TEST_P(test_ucp_rma,nonblocking_get_nb_flush_worker)272 UCS_TEST_P(test_ucp_rma, nonblocking_get_nb_flush_worker) {
273 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
274 DEFAULT_SIZE, DEFAULT_ITERS,
275 1, false, false);
276 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
277 DEFAULT_SIZE, DEFAULT_ITERS,
278 1, true, false);
279 }
280
UCS_TEST_P(test_ucp_rma,nonblocking_get_nb_flush_ep)281 UCS_TEST_P(test_ucp_rma, nonblocking_get_nb_flush_ep) {
282 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
283 DEFAULT_SIZE, DEFAULT_ITERS,
284 1, false, true);
285 test_blocking_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
286 DEFAULT_SIZE, DEFAULT_ITERS,
287 1, true, true);
288 }
289
UCS_TEST_P(test_ucp_rma,nonblocking_stream_get_nb_flush_worker)290 UCS_TEST_P(test_ucp_rma, nonblocking_stream_get_nb_flush_worker) {
291 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
292 DEFAULT_SIZE, DEFAULT_ITERS,
293 1, false, false);
294 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
295 DEFAULT_SIZE, DEFAULT_ITERS,
296 1, true, false);
297 }
298
UCS_TEST_P(test_ucp_rma,nonblocking_stream_get_nb_flush_ep)299 UCS_TEST_P(test_ucp_rma, nonblocking_stream_get_nb_flush_ep) {
300 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
301 DEFAULT_SIZE, DEFAULT_ITERS,
302 1, false, true);
303 test_nonblocking_implicit_stream_xfer(static_cast<nonblocking_send_func_t>(&test_ucp_rma::nonblocking_get_nb),
304 DEFAULT_SIZE, DEFAULT_ITERS,
305 1, true, true);
306 }
307
308 UCP_INSTANTIATE_TEST_CASE(test_ucp_rma)
309