ssg.h 2.91 KB
Newer Older
Jonathan Jenkins's avatar
Jonathan Jenkins committed
1
2
3
4
5
6
7
8
/*
 * Copyright (c) 2016 UChicago Argonne, LLC
 *
 * See COPYRIGHT in top-level directory.
 */

#pragma once

Jonathan Jenkins's avatar
Jonathan Jenkins committed
9
// "simple static group" interface
Jonathan Jenkins's avatar
Jonathan Jenkins committed
10
11
12
13
14
15
16
17
18
//
// Contains trivial wireup and connection management functionality, with a
// model of a static (at startup) member list.

#ifdef __cplusplus
extern "C" {
#endif

#include <mercury.h>
Shane Snyder's avatar
Shane Snyder committed
19
20
21
22
23
#include <margo.h>

#ifdef HAVE_MPI
#include <mpi.h>
#endif
Jonathan Jenkins's avatar
Jonathan Jenkins committed
24

Jonathan Jenkins's avatar
Jonathan Jenkins committed
25
// using pointer so that we can use proc (proc has to allocate in this case)
Jonathan Jenkins's avatar
Jonathan Jenkins committed
26
27
28
29
30
31
32
33
34
35
36
typedef struct ssg *ssg_t;

// some defines
// null pointer shim
#define SSG_NULL ((ssg_t)NULL)
// after init, rank is possibly unknown
#define SSG_RANK_UNKNOWN (-1)
// if ssg_t is gotten from another process (RPC output), then, by definition,
// the receiving entity is not part of the group
#define SSG_EXTERNAL_RANK (-2)

37
38
39
40
41
42
43
44
45
typedef enum ssg_member_status
{
    SSG_MEMBER_UNKNOWN = 0,
    SSG_MEMBER_ALIVE,
    SSG_MEMBER_SUSPECT,
    SSG_MEMBER_DEAD
} ssg_member_status_t;

/// group member initialization
Jonathan Jenkins's avatar
Jonathan Jenkins committed
46

47
// config file based - load up the given config file
Jonathan Jenkins's avatar
Jonathan Jenkins committed
48
// containing a set of hostnames
49
50
51
// is_member - nonzero if caller is expected to be in the group, zero otherwise
//           - ssg_lookup fails if caller is unable to identify with one of the
//             config entries
52
ssg_t ssg_init_config(margo_instance_id mid, const char * fname, int is_member);
Jonathan Jenkins's avatar
Jonathan Jenkins committed
53

Shane Snyder's avatar
Shane Snyder committed
54
55
56
57
#ifdef HAVE_MPI
// mpi based (no config file) - all participants (defined by the input
// communicator) do a global address exchange
// in this case, the caller has already initialized HG with its address
58
ssg_t ssg_init_mpi(margo_instance_id mid, MPI_Comm comm);
Shane Snyder's avatar
Shane Snyder committed
59
60
#endif

Jonathan Jenkins's avatar
Jonathan Jenkins committed
61
62
/// finalization

63
// teardown all state associated with the given ssg group
Jonathan Jenkins's avatar
Jonathan Jenkins committed
64
65
66
67
void ssg_finalize(ssg_t s);

/// accessors

68
69
// get my rank in the group
int ssg_get_group_rank(const ssg_t s);
Jonathan Jenkins's avatar
Jonathan Jenkins committed
70

71
72
// get the size of the group
int ssg_get_group_size(const ssg_t s);
Jonathan Jenkins's avatar
Jonathan Jenkins committed
73

74
// get the HG address for the group member at the given rank
Jonathan Jenkins's avatar
Jonathan Jenkins committed
75
hg_addr_t ssg_get_addr(const ssg_t s, int rank);
Jonathan Jenkins's avatar
Jonathan Jenkins committed
76
77
78
79
80
81

// get the string hostname for the group member at the given rank
const char * ssg_get_addr_str(const ssg_t s, int rank);

/// mercury support

82
#if 0
Jonathan Jenkins's avatar
Jonathan Jenkins committed
83
84
85
// group serialization mechanism
hg_return_t hg_proc_ssg_t(hg_proc_t proc, ssg_t *s);

86
87
88
89
90
91
92
/// utility functions

// dump address list to the given file
// returns -1 on error, corresponding to the return code of open/write/close,
// and sets errno
int ssg_dump(const ssg_t s, const char *fname);

Shane Snyder's avatar
Shane Snyder committed
93
94
95
96
97
98
99
100
101
// set up barrier data structures. Separate call to resolve the margo -> barrier
// race condition - call this before kicking off the progress loop with margo
void ssg_register_barrier(ssg_t s, hg_class_t *hgcl);

// perform a naive N-1 barrier using margo.
// requires ssg_set_margo_id to have been called.
// NOTE: rank must be set on all ranks prior to calling this. I.e. should init
// the rank prior to starting up margo
hg_return_t ssg_barrier_margo(ssg_t s);
102
#endif
Shane Snyder's avatar
Shane Snyder committed
103

Jonathan Jenkins's avatar
Jonathan Jenkins committed
104
105
106
107
108
109
110
#ifdef __cplusplus
}
#endif

/**
 * vim: ft=c sw=4 ts=4 sts=4 tw=80 expandtab
 */