This source file includes following definitions.
- ompi_attr_create_predefined
- ompi_attr_free_predefined
- create_comm
- free_comm
- create_win
- free_win
- set_f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 #include "ompi_config.h"
80
81 #include <stdlib.h>
82
83 #include "mpi.h"
84
85 #include "ompi/attribute/attribute.h"
86
87 #include "ompi/errhandler/errcode.h"
88 #include "ompi/communicator/communicator.h"
89 #include "ompi/mca/pml/pml.h"
90
91
92
93
94 static int create_comm(int target_keyval, bool want_inherit);
95 static int free_comm(int keyval);
96
97 static int create_win(int target_keyval);
98 static int free_win(int keyval);
99
100 static int set_f(int keyval, MPI_Fint value);
101
102
103 int ompi_attr_create_predefined(void)
104 {
105 int ret;
106 char *univ_size;
107 int usize;
108
109
110
111
112
113
114
115 if (OMPI_SUCCESS != (ret = create_comm(MPI_TAG_UB, true)) ||
116 OMPI_SUCCESS != (ret = create_comm(MPI_HOST, true)) ||
117 OMPI_SUCCESS != (ret = create_comm(MPI_IO, true)) ||
118 OMPI_SUCCESS != (ret = create_comm(MPI_WTIME_IS_GLOBAL, true)) ||
119 OMPI_SUCCESS != (ret = create_comm(MPI_APPNUM, true)) ||
120 OMPI_SUCCESS != (ret = create_comm(MPI_LASTUSEDCODE, false)) ||
121 OMPI_SUCCESS != (ret = create_comm(MPI_UNIVERSE_SIZE, true)) ||
122 OMPI_SUCCESS != (ret = create_win(MPI_WIN_BASE)) ||
123 OMPI_SUCCESS != (ret = create_win(MPI_WIN_SIZE)) ||
124 OMPI_SUCCESS != (ret = create_win(MPI_WIN_DISP_UNIT)) ||
125 OMPI_SUCCESS != (ret = create_win(MPI_WIN_CREATE_FLAVOR)) ||
126 OMPI_SUCCESS != (ret = create_win(MPI_WIN_MODEL))) {
127 return ret;
128 }
129
130
131
132 if (OMPI_SUCCESS != (ret = set_f(MPI_TAG_UB, mca_pml.pml_max_tag)) ||
133 OMPI_SUCCESS != (ret = set_f(MPI_HOST, MPI_PROC_NULL)) ||
134 OMPI_SUCCESS != (ret = set_f(MPI_IO, MPI_ANY_SOURCE)) ||
135 OMPI_SUCCESS != (ret = set_f(MPI_WTIME_IS_GLOBAL, 0)) ||
136 OMPI_SUCCESS != (ret = set_f(MPI_LASTUSEDCODE,
137 ompi_mpi_errcode_lastused))) {
138 return ret;
139 }
140
141
142
143 univ_size = getenv("OMPI_UNIVERSE_SIZE");
144 if (NULL == univ_size || (usize = strtol(univ_size, NULL, 0)) <= 0) {
145 ret = set_f(MPI_UNIVERSE_SIZE, ompi_comm_size(MPI_COMM_WORLD));
146 } else {
147 ret = set_f(MPI_UNIVERSE_SIZE, usize);
148 }
149 if (OMPI_SUCCESS != ret) {
150 return ret;
151 }
152
153 ret = set_f(MPI_APPNUM, ompi_process_info.app_num);
154
155 return ret;
156 }
157
158
159 int ompi_attr_free_predefined(void)
160 {
161 int ret;
162
163 if (OMPI_SUCCESS != (ret = free_comm(MPI_TAG_UB)) ||
164 OMPI_SUCCESS != (ret = free_comm(MPI_HOST)) ||
165 OMPI_SUCCESS != (ret = free_comm(MPI_IO)) ||
166 OMPI_SUCCESS != (ret = free_comm(MPI_WTIME_IS_GLOBAL)) ||
167 OMPI_SUCCESS != (ret = free_comm(MPI_APPNUM)) ||
168 OMPI_SUCCESS != (ret = free_comm(MPI_LASTUSEDCODE)) ||
169 OMPI_SUCCESS != (ret = free_comm(MPI_UNIVERSE_SIZE)) ||
170 OMPI_SUCCESS != (ret = free_win(MPI_WIN_BASE)) ||
171 OMPI_SUCCESS != (ret = free_win(MPI_WIN_SIZE)) ||
172 OMPI_SUCCESS != (ret = free_win(MPI_WIN_DISP_UNIT)) ||
173 OMPI_SUCCESS != (ret = free_win(MPI_WIN_CREATE_FLAVOR)) ||
174 OMPI_SUCCESS != (ret = free_win(MPI_WIN_MODEL))) {
175 return ret;
176 }
177 return OMPI_SUCCESS;
178 }
179
180
181 static int create_comm(int target_keyval, bool want_inherit)
182 {
183 int err;
184 int keyval;
185 ompi_attribute_fn_ptr_union_t copy;
186 ompi_attribute_fn_ptr_union_t del;
187
188 keyval = -1;
189 copy.attr_communicator_copy_fn = (MPI_Comm_internal_copy_attr_function*)
190 (want_inherit ? MPI_COMM_DUP_FN : MPI_COMM_NULL_COPY_FN);
191 del.attr_communicator_delete_fn = MPI_COMM_NULL_DELETE_FN;
192 err = ompi_attr_create_keyval(COMM_ATTR, copy, del,
193 &keyval, NULL, OMPI_KEYVAL_PREDEFINED, NULL);
194 if (MPI_SUCCESS != err) {
195 return err;
196 }
197 if (target_keyval != keyval) {
198 return OMPI_ERR_BAD_PARAM;
199 }
200 return OMPI_SUCCESS;
201 }
202
203
204 static int free_comm(int keyval)
205 {
206 int key = keyval;
207 return ompi_attr_free_keyval (COMM_ATTR, &key, true);
208 }
209
210
211 static int create_win(int target_keyval)
212 {
213 int err;
214 int keyval;
215 ompi_attribute_fn_ptr_union_t copy;
216 ompi_attribute_fn_ptr_union_t del;
217
218 keyval = -1;
219 copy.attr_win_copy_fn = (MPI_Win_internal_copy_attr_function*)MPI_WIN_NULL_COPY_FN;
220 del.attr_win_delete_fn = MPI_WIN_NULL_DELETE_FN;
221 err = ompi_attr_create_keyval(WIN_ATTR, copy, del,
222 &keyval, NULL, OMPI_KEYVAL_PREDEFINED, NULL);
223 if (MPI_SUCCESS != err) {
224 return err;
225 }
226 if (target_keyval != keyval) {
227 return OMPI_ERR_BAD_PARAM;
228 }
229 return OMPI_SUCCESS;
230 }
231
232
233 static int free_win(int keyval)
234 {
235 int key = keyval;
236 return ompi_attr_free_keyval (WIN_ATTR, &key, true);
237 }
238
239
240 static int set_f(int keyval, MPI_Fint value)
241 {
242 return ompi_attr_set_fint(COMM_ATTR, MPI_COMM_WORLD,
243 &MPI_COMM_WORLD->c_keyhash,
244 keyval, value,
245 true);
246 }