/* * Copyright (c) 2016 UChicago Argonne, LLC * * See COPYRIGHT in top-level directory. */ #pragma once // "simple static group" interface // // Contains trivial wireup and connection management functionality, with a // model of a static (at startup) member list. #ifdef __cplusplus extern "C" { #endif #include #include #ifdef HAVE_MPI #include #endif // using pointer so that we can use proc (proc has to allocate in this case) 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) 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 // config file based - load up the given config file // containing a set of hostnames // 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 ssg_t ssg_init_config(margo_instance_id mid, const char * fname, int is_member); #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 ssg_t ssg_init_mpi(margo_instance_id mid, MPI_Comm comm); #endif /// finalization // teardown all state associated with the given ssg group void ssg_finalize(ssg_t s); /// accessors // get my rank in the group int ssg_get_group_rank(const ssg_t s); // get the size of the group int ssg_get_group_size(const ssg_t s); // get the HG address for the group member at the given rank hg_addr_t ssg_get_addr(const ssg_t s, int rank); // 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 #if 0 // group serialization mechanism hg_return_t hg_proc_ssg_t(hg_proc_t proc, ssg_t *s); /// 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); // 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); #endif #ifdef __cplusplus } #endif /** * vim: ft=c sw=4 ts=4 sts=4 tw=80 expandtab */