1 /**
2 * Copyright (C) Mellanox Technologies Ltd. 2001-2016.  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_tag.h"
9 
10 #include <common/test_helpers.h>
11 
12 #if _OPENMP
13 #include "omp.h"
14 #endif
15 
16 using namespace ucs; /* For vector<char> serialization */
17 
18 
19 class test_ucp_tag_mt : public test_ucp_tag {
20 public:
init()21     virtual void init()
22     {
23         test_ucp_tag::init();
24         ucp_test_param param = GetParam();
25     }
26 
enum_test_params(const ucp_params_t & ctx_params,const std::string & name,const std::string & test_case_name,const std::string & tls)27     static std::vector<ucp_test_param> enum_test_params(const ucp_params_t& ctx_params,
28                                                         const std::string& name,
29                                                         const std::string& test_case_name,
30                                                         const std::string& tls)
31     {
32         std::vector<ucp_test_param> result;
33 
34         generate_test_params_variant(ctx_params, name,
35                                      test_case_name, tls, RECV_REQ_INTERNAL,
36                                      result, MULTI_THREAD_CONTEXT);
37         generate_test_params_variant(ctx_params, name,
38                                      test_case_name, tls, RECV_REQ_EXTERNAL,
39                                      result, MULTI_THREAD_CONTEXT);
40         generate_test_params_variant(ctx_params, name,
41                                      test_case_name, tls, RECV_REQ_INTERNAL,
42                                      result, MULTI_THREAD_WORKER);
43         generate_test_params_variant(ctx_params, name,
44                                      test_case_name, tls, RECV_REQ_EXTERNAL,
45                                      result, MULTI_THREAD_WORKER);
46         return result;
47     }
48 
is_external_request()49     virtual bool is_external_request()
50     {
51         return GetParam().variant == RECV_REQ_EXTERNAL;
52     }
53 };
54 
UCS_TEST_P(test_ucp_tag_mt,send_recv)55 UCS_TEST_P(test_ucp_tag_mt, send_recv) {
56     uint64_t            send_data[MT_TEST_NUM_THREADS] GTEST_ATTRIBUTE_UNUSED_;
57     uint64_t            recv_data[MT_TEST_NUM_THREADS] GTEST_ATTRIBUTE_UNUSED_;
58     ucp_tag_recv_info_t info[MT_TEST_NUM_THREADS] GTEST_ATTRIBUTE_UNUSED_;
59 
60     for (int i = 0; i < MT_TEST_NUM_THREADS; i++) {
61         send_data[i] = 0xdeadbeefdeadbeef + 10 * i;
62         recv_data[i] = 0;
63     }
64 
65 #if _OPENMP && ENABLE_MT
66 #pragma omp parallel for
67     for (int i = 0; i < MT_TEST_NUM_THREADS; i++) {
68         ucs_status_t status;
69         int worker_index = 0;
70 
71         if (GetParam().thread_type == MULTI_THREAD_CONTEXT) {
72             worker_index = i;
73         }
74 
75         send_b(&(send_data[i]), sizeof(send_data[i]), DATATYPE, 0x111337+i, i);
76 
77         short_progress_loop(worker_index); /* Receive messages as unexpected */
78 
79         status = recv_b(&(recv_data[i]), sizeof(recv_data[i]), DATATYPE, 0x1337+i,
80                         0xffff, &(info[i]), i);
81         ASSERT_UCS_OK(status);
82 
83         EXPECT_EQ(sizeof(send_data[i]),   info[i].length);
84         EXPECT_EQ((ucp_tag_t)(0x111337+i), info[i].sender_tag);
85         EXPECT_EQ(send_data[i], recv_data[i]);
86     }
87 #endif
88 }
89 
90 UCP_INSTANTIATE_TEST_CASE(test_ucp_tag_mt)
91