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