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