16
16
* Copyright (c) 2020 Intel, Inc. All rights reserved.
17
17
* Copyright (c) 2022 Amazon.com, Inc. or its affiliates.
18
18
* All Rights reserved.
19
+ * Copyright (c) 2022 Triad National Security, LLC. All rights
20
+ * reserved.
19
21
* $COPYRIGHT$
20
22
*
21
23
* Additional copyrights may follow
95
97
#include "ompi/mca/pml/pml.h"
96
98
#include "ompi/runtime/ompi_rte.h"
97
99
100
+ static bool attrs_predefined_initialized = false;
101
+
98
102
/*
99
103
* Private functions
100
104
*/
@@ -106,33 +110,53 @@ static int free_win(int keyval);
106
110
107
111
static int set_f (int keyval , MPI_Fint value );
108
112
109
-
110
- int ompi_attr_create_predefined (void )
113
+ /*
114
+ * We do not need a lock here as this function is invoked when the
115
+ * instance_lock mutex is held.
116
+ */
117
+ int ompi_attr_create_predefined_keyvals (void )
111
118
{
112
- int ret ;
113
-
114
- /* Create all the keyvals */
115
-
116
- /* DO NOT CHANGE THE ORDER OF CREATING THESE KEYVALS! This order
117
- strictly adheres to the order in mpi.h. If you change the
118
- order here, you must change the order in mpi.h as well! */
119
-
120
- if (OMPI_SUCCESS != (ret = create_comm (MPI_TAG_UB , true)) ||
121
- OMPI_SUCCESS != (ret = create_comm (MPI_HOST , true)) ||
122
- OMPI_SUCCESS != (ret = create_comm (MPI_IO , true)) ||
123
- OMPI_SUCCESS != (ret = create_comm (MPI_WTIME_IS_GLOBAL , true)) ||
124
- OMPI_SUCCESS != (ret = create_comm (MPI_APPNUM , true)) ||
125
- OMPI_SUCCESS != (ret = create_comm (MPI_LASTUSEDCODE , false)) ||
126
- OMPI_SUCCESS != (ret = create_comm (MPI_UNIVERSE_SIZE , true)) ||
127
- OMPI_SUCCESS != (ret = create_win (MPI_WIN_BASE )) ||
128
- OMPI_SUCCESS != (ret = create_win (MPI_WIN_SIZE )) ||
129
- OMPI_SUCCESS != (ret = create_win (MPI_WIN_DISP_UNIT )) ||
130
- OMPI_SUCCESS != (ret = create_win (MPI_WIN_CREATE_FLAVOR )) ||
131
- OMPI_SUCCESS != (ret = create_win (MPI_WIN_MODEL )) ||
132
- OMPI_SUCCESS != (ret = create_comm (MPI_FT , false)) || /* not #if conditional on OPAL_ENABLE_FT_MPI for ABI */
133
- 0 ) {
134
- return ret ;
119
+ int ret = OMPI_SUCCESS , rc ;
120
+
121
+ if (false == attrs_predefined_initialized ) {
122
+
123
+ attrs_predefined_initialized = true;
124
+
125
+ /* Create all the keyvals */
126
+
127
+ /* DO NOT CHANGE THE ORDER OF CREATING THESE KEYVALS! This order
128
+ strictly adheres to the order in mpi.h. If you change the
129
+ order here, you must change the order in mpi.h as well! */
130
+
131
+ if (OMPI_SUCCESS != (rc = create_comm (MPI_TAG_UB , true)) ||
132
+ OMPI_SUCCESS != (rc = create_comm (MPI_HOST , true)) ||
133
+ OMPI_SUCCESS != (rc = create_comm (MPI_IO , true)) ||
134
+ OMPI_SUCCESS != (rc = create_comm (MPI_WTIME_IS_GLOBAL , true)) ||
135
+ OMPI_SUCCESS != (rc = create_comm (MPI_APPNUM , true)) ||
136
+ OMPI_SUCCESS != (rc = create_comm (MPI_LASTUSEDCODE , false)) ||
137
+ OMPI_SUCCESS != (rc = create_comm (MPI_UNIVERSE_SIZE , true)) ||
138
+ OMPI_SUCCESS != (rc = create_win (MPI_WIN_BASE )) ||
139
+ OMPI_SUCCESS != (rc = create_win (MPI_WIN_SIZE )) ||
140
+ OMPI_SUCCESS != (rc = create_win (MPI_WIN_DISP_UNIT )) ||
141
+ OMPI_SUCCESS != (rc = create_win (MPI_WIN_CREATE_FLAVOR )) ||
142
+ OMPI_SUCCESS != (rc = create_win (MPI_WIN_MODEL )) ||
143
+ OMPI_SUCCESS != (rc = create_comm (MPI_FT , false)) || /* not #if conditional on OPAL_ENABLE_FT_MPI for ABI */
144
+ 0 ) {
145
+ ret = rc ;
146
+ }
147
+
135
148
}
149
+
150
+ return ret ;
151
+ }
152
+
153
+ /*
154
+ * This method is only invoked during MPI initialization using the world model
155
+ * (MPI_Init/MPI_Init_thread) so does not need to be thread safe.
156
+ */
157
+ int ompi_attr_set_predefined_keyvals_for_wm (void )
158
+ {
159
+ int ret = OMPI_SUCCESS ;
136
160
137
161
/* Set default values for everything except MPI_UNIVERSE_SIZE */
138
162
@@ -165,26 +189,38 @@ int ompi_attr_create_predefined(void)
165
189
}
166
190
167
191
192
+ /*
193
+ * We do not need a lock here as this function is invoked when the
194
+ * destructor for attr_subsys is invoked.
195
+ */
196
+
168
197
int ompi_attr_free_predefined (void )
169
198
{
170
- int ret ;
171
-
172
- if (OMPI_SUCCESS != (ret = free_comm (MPI_TAG_UB )) ||
173
- OMPI_SUCCESS != (ret = free_comm (MPI_HOST )) ||
174
- OMPI_SUCCESS != (ret = free_comm (MPI_IO )) ||
175
- OMPI_SUCCESS != (ret = free_comm (MPI_WTIME_IS_GLOBAL )) ||
176
- OMPI_SUCCESS != (ret = free_comm (MPI_APPNUM )) ||
177
- OMPI_SUCCESS != (ret = free_comm (MPI_LASTUSEDCODE )) ||
178
- OMPI_SUCCESS != (ret = free_comm (MPI_UNIVERSE_SIZE )) ||
179
- OMPI_SUCCESS != (ret = free_comm (MPI_FT )) || /* not #if conditional on OPAL_ENABLE_FT_MPI for ABI */
180
- OMPI_SUCCESS != (ret = free_win (MPI_WIN_BASE )) ||
181
- OMPI_SUCCESS != (ret = free_win (MPI_WIN_SIZE )) ||
182
- OMPI_SUCCESS != (ret = free_win (MPI_WIN_DISP_UNIT )) ||
183
- OMPI_SUCCESS != (ret = free_win (MPI_WIN_CREATE_FLAVOR )) ||
184
- OMPI_SUCCESS != (ret = free_win (MPI_WIN_MODEL ))) {
185
- return ret ;
199
+ int ret = OMPI_SUCCESS , rc ;
200
+
201
+ if (true == attrs_predefined_initialized ) {
202
+
203
+ attrs_predefined_initialized = false;
204
+
205
+ if (OMPI_SUCCESS != (rc = free_comm (MPI_TAG_UB )) ||
206
+ OMPI_SUCCESS != (rc = free_comm (MPI_HOST )) ||
207
+ OMPI_SUCCESS != (rc = free_comm (MPI_IO )) ||
208
+ OMPI_SUCCESS != (rc = free_comm (MPI_WTIME_IS_GLOBAL )) ||
209
+ OMPI_SUCCESS != (rc = free_comm (MPI_APPNUM )) ||
210
+ OMPI_SUCCESS != (rc = free_comm (MPI_LASTUSEDCODE )) ||
211
+ OMPI_SUCCESS != (rc = free_comm (MPI_UNIVERSE_SIZE )) ||
212
+ OMPI_SUCCESS != (rc = free_comm (MPI_FT )) || /* not #if conditional on OPAL_ENABLE_FT_MPI for ABI */
213
+ OMPI_SUCCESS != (rc = free_win (MPI_WIN_BASE )) ||
214
+ OMPI_SUCCESS != (rc = free_win (MPI_WIN_SIZE )) ||
215
+ OMPI_SUCCESS != (rc = free_win (MPI_WIN_DISP_UNIT )) ||
216
+ OMPI_SUCCESS != (rc = free_win (MPI_WIN_CREATE_FLAVOR )) ||
217
+ OMPI_SUCCESS != (rc = free_win (MPI_WIN_MODEL ))) {
218
+ ret = rc ;
219
+ }
220
+
186
221
}
187
- return OMPI_SUCCESS ;
222
+
223
+ return ret ;
188
224
}
189
225
190
226
0 commit comments