This source file includes following definitions.
- mca_btl_vader_sc_emu_atomic_64
- mca_btl_vader_sc_emu_atomic_32
- mca_btl_vader_sc_emu_rdma
- mca_btl_vader_sc_emu_init
1
2
3
4
5
6
7
8
9
10
11
12 #include "btl_vader.h"
13 #include "btl_vader_frag.h"
14
15 #if OPAL_HAVE_ATOMIC_MATH_64
16 static void mca_btl_vader_sc_emu_atomic_64 (int64_t *operand, opal_atomic_int64_t *addr, mca_btl_base_atomic_op_t op)
17 {
18 int64_t result = 0;
19
20 switch (op) {
21 case MCA_BTL_ATOMIC_ADD:
22 result = opal_atomic_fetch_add_64 (addr, *operand);
23 break;
24 case MCA_BTL_ATOMIC_AND:
25 result = opal_atomic_fetch_and_64 (addr, *operand);
26 break;
27 case MCA_BTL_ATOMIC_OR:
28 result = opal_atomic_fetch_or_64 (addr, *operand);
29 break;
30 case MCA_BTL_ATOMIC_XOR:
31 result = opal_atomic_fetch_xor_64 (addr, *operand);
32 break;
33 case MCA_BTL_ATOMIC_SWAP:
34 result = opal_atomic_swap_64 (addr, *operand);
35 break;
36 #if OPAL_HAVE_ATOMIC_MIN_64
37 case MCA_BTL_ATOMIC_MIN:
38 result = opal_atomic_fetch_min_64 (addr, *operand);
39 break;
40 #endif
41 #if OPAL_HAVE_ATOMIC_MAX_64
42 case MCA_BTL_ATOMIC_MAX:
43 result = opal_atomic_fetch_max_64 (addr, *operand);
44 break;
45 #endif
46 default:
47 assert (0);
48 }
49
50 *operand = result;
51 }
52 #endif
53
54 #if OPAL_HAVE_ATOMIC_MATH_32
55 static void mca_btl_vader_sc_emu_atomic_32 (int32_t *operand, opal_atomic_int32_t *addr, mca_btl_base_atomic_op_t op)
56 {
57 int32_t result = 0;
58
59 switch (op) {
60 case MCA_BTL_ATOMIC_ADD:
61 result = opal_atomic_fetch_add_32 (addr, *operand);
62 break;
63 case MCA_BTL_ATOMIC_AND:
64 result = opal_atomic_fetch_and_32 (addr, *operand);
65 break;
66 case MCA_BTL_ATOMIC_OR:
67 result = opal_atomic_fetch_or_32 (addr, *operand);
68 break;
69 case MCA_BTL_ATOMIC_XOR:
70 result = opal_atomic_fetch_xor_32 (addr, *operand);
71 break;
72 case MCA_BTL_ATOMIC_SWAP:
73 result = opal_atomic_swap_32 (addr, *operand);
74 break;
75 #if OPAL_HAVE_ATOMIC_MIN_32
76 case MCA_BTL_ATOMIC_MIN:
77 result = opal_atomic_fetch_min_32 (addr, *operand);
78 break;
79 #endif
80 #if OPAL_HAVE_ATOMIC_MAX_32
81 case MCA_BTL_ATOMIC_MAX:
82 result = opal_atomic_fetch_max_32 (addr, *operand);
83 break;
84 #endif
85 default:
86 assert (0);
87 }
88
89 *operand = result;
90 }
91 #endif
92
93 static void mca_btl_vader_sc_emu_rdma (mca_btl_base_module_t *btl, mca_btl_base_tag_t tag, mca_btl_base_descriptor_t *desc, void *ctx)
94 {
95 mca_btl_vader_sc_emu_hdr_t *hdr = (mca_btl_vader_sc_emu_hdr_t *) desc->des_segments[0].seg_addr.pval;
96 size_t size = desc->des_segments[0].seg_len - sizeof (*hdr);
97 void *data = (void *)(hdr + 1);
98
99 switch (hdr->type) {
100 case MCA_BTL_VADER_OP_PUT:
101 memcpy ((void *) hdr->addr, data, size);
102 break;
103 case MCA_BTL_VADER_OP_GET:
104 memcpy (data, (void *) hdr->addr, size);
105 break;
106 #if OPAL_HAVE_ATOMIC_MATH_64
107 case MCA_BTL_VADER_OP_ATOMIC:
108 if (!(hdr->flags & MCA_BTL_ATOMIC_FLAG_32BIT)) {
109 mca_btl_vader_sc_emu_atomic_64 (hdr->operand, (void *) hdr->addr, hdr->op);
110 #if OPAL_HAVE_ATOMIC_MATH_32
111 } else {
112 int32_t tmp = (int32_t) hdr->operand[0];
113 mca_btl_vader_sc_emu_atomic_32 (&tmp, (void *) hdr->addr, hdr->op);
114 hdr->operand[0] = tmp;
115 #else
116 } else {
117
118 assert (0);
119 #endif
120 }
121 break;
122 #endif
123 #if OPAL_HAVE_ATOMIC_MATH_64
124 case MCA_BTL_VADER_OP_CSWAP:
125 if (!(hdr->flags & MCA_BTL_ATOMIC_FLAG_32BIT)) {
126 opal_atomic_compare_exchange_strong_64 ((opal_atomic_int64_t *) hdr->addr, &hdr->operand[0], hdr->operand[1]);
127 #if OPAL_HAVE_ATOMIC_MATH_32
128 } else {
129 opal_atomic_compare_exchange_strong_32 ((opal_atomic_int32_t *) hdr->addr, (int32_t *) &hdr->operand[0],
130 (int32_t) hdr->operand[1]);
131 #else
132 } else {
133
134 assert (0);
135 #endif
136 }
137 break;
138 #endif
139 }
140 }
141
142 void mca_btl_vader_sc_emu_init (void)
143 {
144 mca_btl_base_active_message_trigger[MCA_BTL_TAG_VADER].cbfunc = mca_btl_vader_sc_emu_rdma;
145 mca_btl_base_active_message_trigger[MCA_BTL_TAG_VADER].cbdata = NULL;
146 }