Fenix @develop
 
Loading...
Searching...
No Matches
fenix.hpp
1/*
2//@HEADER
3// ************************************************************************
4//
5//
6// _|_|_|_| _|_|_|_| _| _| _|_|_| _| _|
7// _| _| _|_| _| _| _| _|
8// _|_|_| _|_|_| _| _| _| _| _|
9// _| _| _| _|_| _| _| _|
10// _| _|_|_|_| _| _| _|_|_| _| _|
11//
12//
13//
14//
15// Copyright (C) 2016 Rutgers University and Sandia Corporation
16//
17// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
18// the U.S. Government retains certain rights in this software.
19//
20// Redistribution and use in source and binary forms, with or without
21// modification, are permitted provided that the following conditions are
22// met:
23//
24// 1. Redistributions of source code must retain the above copyright
25// notice, this list of conditions and the following disclaimer.
26//
27// 2. Redistributions in binary form must reproduce the above copyright
28// notice, this list of conditions and the following disclaimer in the
29// documentation and/or other materials provided with the distribution.
30//
31// 3. Neither the name of the Corporation nor the names of the
32// contributors may be used to endorse or promote products derived from
33// this software without specific prior written permission.
34//
35// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
36// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
39// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
40// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
41// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
42// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
43// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46//
47// Author Marc Gamell, Eric Valenzuela, Keita Teranishi, Manish Parashar,
48// Rob Van der Wijngaart, Michael Heroux, and Matthew Whitlock
49//
50// Questions? Contact Keita Teranishi (knteran@sandia.gov) and
51// Marc Gamell (mgamell@cac.rutgers.edu)
52//
53// ************************************************************************
54//@HEADER
55*/
56
57#ifndef __FENIX_HPP__
58#define __FENIX_HPP__
59
60#include <mpi.h>
61#include <functional>
62#include <vector>
63#include <optional>
64#include <variant>
65
66#include "fenix.h"
67#include "fenix_exception.hpp"
68#include "fenix/data/subset.hpp"
69
70namespace fenix {
71
72using Role = Fenix_Rank_role;
73constexpr Role INITIAL_RANK = FENIX_ROLE_INITIAL_RANK;
74constexpr Role RECOVERED_RANK = FENIX_ROLE_RECOVERED_RANK;
75constexpr Role SURVIVOR_RANK = FENIX_ROLE_SURVIVOR_RANK;
76constexpr Role SPARE_RANK = FENIX_ROLE_SPARE_RANK;
77
78using SettingName = Fenix_Setting_name;
79constexpr SettingName RECOVERY_MODE = FENIX_RECOVERY_MODE;
80constexpr SettingName RESUME_MODE = FENIX_RESUME_MODE;
81constexpr SettingName UNHANDLED_MODE = FENIX_UNHANDLED_MODE;
82constexpr SettingName CALLBACK_EXCEPTION_MODE = FENIX_CALLBACK_EXCEPTION_MODE;
83constexpr SettingName MLOG_RECOVERY_MODE = FENIX_MLOG_RECOVERY_MODE;
84constexpr SettingName SPARE_WAIT_MODE = FENIX_SPARE_WAIT_MODE;
85constexpr SettingName SPARE_FINALIZE_MODE = FENIX_SPARE_FINALIZE_MODE;
86
87using RecoveryMode = Fenix_Recovery_mode;
88constexpr RecoveryMode IGNORE = FENIX_RECOVERY_IGNORE;
89constexpr RecoveryMode NOOP = FENIX_RECOVERY_NOOP;
90constexpr RecoveryMode REPAIR = FENIX_RECOVERY_REPAIR;
91constexpr RecoveryMode SPAWN = FENIX_RECOVERY_SPAWN;
92
93using ResumeMode = Fenix_Resume_mode;
94constexpr ResumeMode JUMP = FENIX_RESUME_JUMP;
95constexpr ResumeMode RETURN = FENIX_RESUME_RETURN;
96constexpr ResumeMode THROW = FENIX_RESUME_THROW;
97
98using UnhandledMode = Fenix_Unhandled_mode;
99constexpr UnhandledMode SILENT = FENIX_UNHANDLED_SILENT;
100constexpr UnhandledMode PRINT = FENIX_UNHANDLED_PRINT;
101constexpr UnhandledMode ABORT = FENIX_UNHANDLED_ABORT;
102
103using CallbackExceptionMode = Fenix_Callback_exception_mode;
104constexpr CallbackExceptionMode RETHROW = FENIX_CALLBACK_EXCEPTION_RETHROW;
105constexpr CallbackExceptionMode SQUASH = FENIX_CALLBACK_EXCEPTION_SQUASH;
106
107using MlogRecoveryMode = Fenix_Mlog_recovery_mode;
108constexpr MlogRecoveryMode MANUAL = FENIX_MLOG_RECOVERY_MANUAL;
109constexpr MlogRecoveryMode INLINE = FENIX_MLOG_RECOVERY_INLINE;
110constexpr MlogRecoveryMode INLINE_AUTOSYNC =
112
113using SpareWaitMode = Fenix_Spare_wait_mode;
114constexpr SpareWaitMode BUSY = FENIX_SPARE_WAIT_BUSY;
115constexpr SpareWaitMode YIELD = FENIX_SPARE_WAIT_YIELD;
116constexpr SpareWaitMode SLEEP = FENIX_SPARE_WAIT_SLEEP;
117
118using SpareFinalizeMode = Fenix_Spare_finalize_mode;
119constexpr SpareFinalizeMode RELEASE = FENIX_SPARE_FINALIZE_RELEASE;
120constexpr SpareFinalizeMode EXIT = FENIX_SPARE_FINALIZE_EXIT;
121
122constexpr int STOREV_ALL = FENIX_STOREV_ALL;
123
124enum CallbackLocation { PRE_RECOVERY, POST_RECOVERY };
125
126namespace args {
128 int* role = nullptr;
129 MPI_Comm in_comm = MPI_COMM_WORLD;
130 MPI_Comm* out_comm = nullptr;
131 int* argc = nullptr;
132 char*** argv = nullptr;
133 int spares = 0;
134 int* err = nullptr;
135};
136}
137
138void init(const args::FenixInitArgs args);
139
141void set_option(SettingName setting, unsigned option);
142
144unsigned get_option(SettingName setting);
145
147void throw_exception();
148
150Fenix_Rank_role role();
151
153int error();
154
156int nspare();
157
158using FenixCallbackFunc = std::function<void(MPI_Comm, int)>;
159
161int callback_register(
162 FenixCallbackFunc callback, CallbackLocation loc = POST_RECOVERY
163);
164
165//@!brief Overload of #Fenix_Callback_pop
166int callback_pop(CallbackLocation loc = POST_RECOVERY);
167
168//@!brief Overload of #Fenix_Callback_invoke_all
169int callback_invoke_all(CallbackLocation loc = POST_RECOVERY);
170
175std::vector<int> fail_list();
176
178int detect_failures(bool recover = true);
179
181bool initialized();
182
184bool finalized();
185
187int comm_revoke(MPI_Comm comm);
188
189} // namespace fenix
190
191namespace fenix::data {
192
193extern const DataSubset& SUBSET_FULL;
194extern const DataSubset& SUBSET_EMPTY;
195extern const DataSubset& SUBSET_PRESTAGED;
196extern DataSubset SUBSET_IGNORE;
197
198//@!brief Overload of #Fenix_Data_group_create
199int group_create(
200 int group_id, MPI_Comm comm, int start_time_stamp, int depth, int policy_name,
201 void* policy_value, int* flag
202);
203
205 // MPI_COMM_NULL defaults to the resilient communicator
206 MPI_Comm comm = MPI_COMM_NULL;
207 int start_time_stamp = 0;
208 int depth = 1;
209 int policy_name = FENIX_DATA_POLICY_IMR;
210 void* policy_value = nullptr;
211 int* flag = nullptr;
212};
213int group_create(int group_id, GroupCreateArgs args = {});
214
215//@!brief Overload of #Fenix_Data_group_created
216bool group_created(int group_id);
217
218//@!brief Overload of #Fenix_Data_member_create
219int member_create(
220 int group_id, int member_id, void* buffer, int count, MPI_Datatype datatype
221);
222
224using SerializeFileFunc = std::function<void(FILE*, int, void*, int, int)>;
226using SerializeStreamFunc =
227 std::function<void(std::iostream&, int, void*, int, int)>;
228
229using SerializeFunc = std::variant<SerializeFileFunc, SerializeStreamFunc>;
230
232int member_create(
233 int group_id, int member_id, void* buffer, int count, MPI_Datatype datatype,
234 SerializeFunc serializer
235);
236
238int member_define(
239 int group_id, int member_id, void* buffer, int count, MPI_Datatype datatype
240);
242int member_define(
243 int group_id, int member_id, void* buffer, int count, MPI_Datatype datatype,
244 SerializeFunc serializer
245);
246
247//@!brief Overload of #Fenix_Data_member_created
248bool member_created(int group_id, int member_id);
249
250int member_attr_set(
251 int group_id, int member_id, int attr, void* value, int* flag
252);
253
254int member_attr_get(
255 int group_id, int member_id, int attr, void* value, int* flag
256);
257
259int member_stage(
260 int group_id, int member_id, const DataSubset& subset = SUBSET_FULL
261);
262
264int member_stage_inplace(
265 int group_id, int member_id, void* buf, const DataSubset& subset = SUBSET_FULL
266);
267
269int member_stage_begin(int group_id, int member_id, FILE** fp);
271int member_stage_begin(int group_id, int member_id, std::iostream** stream);
272
274int member_stage_end(int group_id, int member_id);
275
277int member_store(
278 int group_id, int member_id, const DataSubset& subset = SUBSET_FULL
279);
281inline int member_store(int group_id, const DataSubset& subset = SUBSET_FULL) {
282 return member_store(group_id, FENIX_DATA_MEMBER_ALL, subset);
283}
284
286int member_storev(int group_id, int member_id, const DataSubset& subset);
288inline int member_storev(int group_id, const DataSubset& subset) {
289 return member_storev(group_id, FENIX_DATA_MEMBER_ALL, subset);
290}
291
293int member_istore(
294 int group_id, int member_id, const DataSubset& subset, Fenix_Request* request
295);
296
298 int member_id = FENIX_DATA_MEMBER_ALL;
299 const DataSubset& subset = SUBSET_FULL;
300};
302inline int member_istore(
303 int group_id, Fenix_Request* request, MemberIstoreArgs args = {}
304) {
305 return member_istore(group_id, args.member_id, args.subset, request);
306}
307
309int member_istorev(
310 int group_id, int member_id, const DataSubset& subset, Fenix_Request* request
311);
313inline int member_istorev(
314 int group_id, const DataSubset& subset, Fenix_Request* request
315) {
316 return member_istorev(group_id, FENIX_DATA_MEMBER_ALL, subset, request);
317}
318
320int member_repair(int group_id, int member_id);
321
323int member_load(
324 int group_id, int member_id, int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
325 DataSubset& data_found = SUBSET_IGNORE
326);
327
329int member_load(
330 int group_id, int member_id, void* target,
331 int target_count = FENIX_DATA_RESTORE_FULL,
332 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
333 DataSubset& data_found = SUBSET_IGNORE
334);
335
337int member_load_begin(
338 int group_id, int member_id, FILE** fp,
339 int time_stamp = FENIX_DATA_SNAPSHOT_LATEST,
340 DataSubset& data_found = SUBSET_IGNORE
341);
342
344int member_load_begin(
345 int group_id, int member_id, std::iostream** strm,
346 int time_stamp = FENIX_DATA_SNAPSHOT_LATEST,
347 DataSubset& data_found = SUBSET_IGNORE
348);
349
350//@!brief Overload of #Fenix_Data_member_load_end
351int member_load_end(int group_id, int member_id);
352
354int member_restore(
355 int group_id, int member_id, void* target_buffer = FENIX_DATA_RESTORE_INPLACE,
356 int max_length = FENIX_DATA_RESTORE_FULL,
357 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
358 DataSubset& data_found = SUBSET_IGNORE
359);
360
362[[deprecated("Use member_load functions instead")]]
363int member_lrestore(
364 int group_id, int member_id, void* target_buffer = FENIX_DATA_RESTORE_INPLACE,
365 int max_length = FENIX_DATA_RESTORE_FULL,
366 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
367 DataSubset& data_found = SUBSET_IGNORE
368);
369
371int commit(int group_id, int* time_stamp = nullptr);
372
374int commit_barrier(int group_id, int* time_stamp = nullptr);
375
377int checkpoint(
378 int group_id, const DataSubset& subset,
379 const std::vector<int>& storev_ids = {}, int* time_stamp = nullptr
380);
381
383int checkpointv(
384 int group_id, const DataSubset& subset, int* time_stamp = nullptr
385);
386
391std::optional<std::vector<int>> group_members(int group_id);
392
397std::optional<std::vector<int>> group_snapshots(int group_id);
398
399//@!brief Overload of #Fenix_Data_group_get_cohort
400MPI_Group group_cohort(int group_id);
401
402//@!brief Overload of #Fenix_Data_snapshot_delete
403int snapshot_delete(int group_id, int timestamp);
404
405//@!brief Overload of #Fenix_Data_group_delete
406int group_delete(int group_id);
407
408//@!brief Overload of #Fenix_Data_member_delete
409int member_delete(int group_id, int member_id);
410
411} // namespace fenix::data
412
413namespace fenix::mlog {
414
415//@brief Overload of #Fenix_Mlog_create
416int create(int mlog_id, MPI_Comm& comm, int depth);
417
418//@brief Overload of #Fenix_Mlog_activate
419int activate(int mlog_id);
420
421//@brief Overload of Fenix_Mlog_active, returns active log
422int active();
423
424//@brief Overload of #Fenix_Mlog_begin_region
425int begin_region(int mlog_id, int region_id);
426
427//@brief Overload of #Fenix_Mlog_activate_region
428int activate(int mlog_id, int region_id);
429
430//@brief Overload of #Fenix_Mlog_sync
431int sync(int mlog_id, int region_id = FENIX_MLOG_CONTINUE);
432
433//@brief Overload of #Fenix_Mlog_create_data_member
434int create_data_member(int mlog_id, int group_id, int member_id);
435
436//@brief Overload of #Fenix_Mlog_define_data_member
437int define_data_member(int mlog_id, int group_id, int member_id);
438
439//@brief Overload of #Fenix_Mlog_delete
440int mlog_delete(int mlog_id);
441
442} // namespace fenix::mlog
443
444#endif
Contains all API function calls and Fenix types. This is the only header file a user should include.
Fenix_Unhandled_mode
Options for dealing with 'unhandled' errors, e.g. invalid rank IDs.
Definition fenix.h:274
Fenix_Spare_finalize_mode
Options for what spare ranks should do when Fenix_Finalize is called. Must be set before Fenix_Init t...
Definition fenix.h:319
Fenix_Resume_mode
Options for passing control back to application after recovery.
Definition fenix.h:247
Fenix_Recovery_mode
Options for recovering after a failed rank is detected.
Definition fenix.h:205
Fenix_Spare_wait_mode
Options for how spare ranks wait to be needed. Must be set before Fenix_Init to take effect.
Definition fenix.h:290
Fenix_Callback_exception_mode
Options for dealing with CommExceptions generated in callbacks.
Definition fenix.h:305
Fenix_Setting_name
Global Fenix settings.
Definition fenix.h:182
Fenix_Mlog_recovery_mode
Definition fenix.h:223
Fenix_Rank_role
All possible roles returned by Fenix_Init.
Definition fenix.h:168
@ FENIX_UNHANDLED_PRINT
Print error and continue without handling.
Definition fenix.h:278
@ FENIX_UNHANDLED_SILENT
Ignore unhandled errors.
Definition fenix.h:276
@ FENIX_UNHANDLED_ABORT
Print error and abort Fenix's world (default)
Definition fenix.h:280
@ FENIX_SPARE_FINALIZE_EXIT
Finalize MPI and exit (default),.
Definition fenix.h:323
@ FENIX_SPARE_FINALIZE_RELEASE
Continue from Fenix_Init with Fenix_Rank_role FENIX_RANK_ROLE_SPARE.
Definition fenix.h:321
@ FENIX_RESUME_THROW
Throw a fenix::CommException.
Definition fenix.h:265
@ FENIX_RESUME_JUMP
Return to Fenix_Init via longjmp (default)
Definition fenix.h:261
@ FENIX_RESUME_RETURN
Return the error code inline.
Definition fenix.h:263
@ FENIX_RECOVERY_IGNORE
Do not repair communicator, immediately resume per FENIX_RESUME_MODE.
Definition fenix.h:207
@ FENIX_RECOVERY_REPAIR
Repair the communicator with spares or by shrinking.
Definition fenix.h:215
@ FENIX_RECOVERY_SPAWN
<span class="mlabel"> UNIMPLEMENTED </span> As REPAIR, but attempt to respawn failed processes
Definition fenix.h:217
@ FENIX_RECOVERY_NOOP
Do not repair communicator, otherwise behave normally.
Definition fenix.h:213
@ FENIX_SPARE_WAIT_YIELD
Tell MPI to yield this thread while waiting (if supported, else busy wait)
Definition fenix.h:294
@ FENIX_SPARE_WAIT_SLEEP
Sleep 100ms between checks to see if this thread is needed for recovery.
Definition fenix.h:296
@ FENIX_SPARE_WAIT_BUSY
Busy wait, consuming CPU time in exchange for faster response.
Definition fenix.h:292
@ FENIX_CALLBACK_EXCEPTION_SQUASH
CommExceptions from callbacks are squashed.
Definition fenix.h:309
@ FENIX_CALLBACK_EXCEPTION_RETHROW
CommExceptions are allowed to propagate out of callbacks.
Definition fenix.h:307
@ FENIX_RESUME_MODE
See Fenix_Resume_mode.
Definition fenix.h:186
@ FENIX_MLOG_RECOVERY_MODE
See Fenix_Mlog_recovery_mode.
Definition fenix.h:192
@ FENIX_SPARE_FINALIZE_MODE
See Fenix_Spare_finalize_mode.
Definition fenix.h:196
@ FENIX_SPARE_WAIT_MODE
See Fenix_Spare_wait_mode.
Definition fenix.h:194
@ FENIX_CALLBACK_EXCEPTION_MODE
See Fenix_Callback_exception_mode.
Definition fenix.h:190
@ FENIX_RECOVERY_MODE
See Fenix_Recovery_mode.
Definition fenix.h:184
@ FENIX_UNHANDLED_MODE
See Fenix_Unhandled_mode.
Definition fenix.h:188
@ FENIX_MLOG_RECOVERY_MANUAL
All message logging recovery is manual.
Definition fenix.h:225
@ FENIX_MLOG_RECOVERY_INLINE_AUTOSYNC
As INLINE, but automatically sync logs with FENIX_MLOG_CONTINUE.
Definition fenix.h:239
@ FENIX_MLOG_RECOVERY_INLINE
Automatically repeats failed, logged MPI operations without disrupting normal application control flo...
Definition fenix.h:232
@ FENIX_ROLE_SPARE_RANK
This rank was a spare when Fenix finalized.
Definition fenix.h:176
@ FENIX_ROLE_RECOVERED_RANK
This rank was a spare before the most recent failure, or was just spawned.
Definition fenix.h:172
@ FENIX_ROLE_INITIAL_RANK
No failures have occurred yet.
Definition fenix.h:170
@ FENIX_ROLE_SURVIVOR_RANK
This rank was not a spare before the most recent failure.
Definition fenix.h:174
<span class="mlabel"> UNIMPLEMENTED </span> As MPI_Request, but for Fenix asynchronous data recove...
Definition fenix.h:611
Definition subset.hpp:152
Definition fenix.hpp:127
Definition fenix.hpp:204
Definition fenix.hpp:297