1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 #ifndef OSHMEM_MCA_SCOLL_H
  22 #define OSHMEM_MCA_SCOLL_H
  23 
  24 #include "oshmem_config.h"
  25 #include "oshmem/types.h"
  26 #include "oshmem/constants.h"
  27 
  28 #include "opal/util/output.h"
  29 #include "mpi.h"
  30 #include "oshmem/mca/mca.h"
  31 #include "opal/mca/base/base.h"
  32 
  33 BEGIN_C_DECLS
  34 
  35 
  36 
  37 struct oshmem_group_t;
  38 struct oshmem_op_t;
  39 
  40 
  41 
  42 typedef int (*mca_scoll_base_component_init_fn_t)(bool enable_progress_threads,
  43                                                   bool enable_threads);
  44 
  45 typedef struct mca_scoll_base_module_1_0_0_t* (*mca_scoll_base_component_query_fn_t)(struct oshmem_group_t *group,
  46                                                                                      int *priority);
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 
  55 
  56 
  57 
  58 struct mca_scoll_base_component_1_0_0_t {
  59     
  60     mca_base_component_t scoll_version;
  61     
  62     mca_base_component_data_t scoll_data;
  63 
  64     
  65     mca_scoll_base_component_init_fn_t scoll_init;
  66     mca_scoll_base_component_query_fn_t scoll_query;
  67 };
  68 typedef struct mca_scoll_base_component_1_0_0_t mca_scoll_base_component_1_0_0_t;
  69 
  70 
  71 
  72 
  73 typedef struct mca_scoll_base_component_1_0_0_t mca_scoll_base_component_t;
  74 
  75 
  76 
  77 
  78 
  79 
  80 
  81 
  82 
  83 
  84 
  85 
  86 
  87 
  88 
  89 typedef int
  90 (*mca_scoll_base_module_enable_1_0_0_fn_t)(struct mca_scoll_base_module_1_0_0_t* module,
  91                                            struct oshmem_group_t *comm);
  92 
  93 #define SCOLL_DEFAULT_ALG   (-1)
  94 
  95 #define SCOLL_ALG_BARRIER_CENTRAL_COUNTER       0
  96 #define SCOLL_ALG_BARRIER_TOURNAMENT            1
  97 #define SCOLL_ALG_BARRIER_RECURSIVE_DOUBLING    2
  98 #define SCOLL_ALG_BARRIER_DISSEMINATION         3
  99 #define SCOLL_ALG_BARRIER_BASIC                 4
 100 #define SCOLL_ALG_BARRIER_ADAPTIVE              5
 101 
 102 #define SCOLL_ALG_BROADCAST_CENTRAL_COUNTER     0
 103 #define SCOLL_ALG_BROADCAST_BINOMIAL            1
 104 
 105 #define SCOLL_ALG_COLLECT_CENTRAL_COUNTER       0
 106 #define SCOLL_ALG_COLLECT_TOURNAMENT            1
 107 #define SCOLL_ALG_COLLECT_RECURSIVE_DOUBLING    2
 108 #define SCOLL_ALG_COLLECT_RING                  3
 109 
 110 #define SCOLL_ALG_REDUCE_CENTRAL_COUNTER        0
 111 #define SCOLL_ALG_REDUCE_TOURNAMENT             1
 112 #define SCOLL_ALG_REDUCE_RECURSIVE_DOUBLING     2
 113 #define SCOLL_ALG_REDUCE_LEGACY_LINEAR          3   
 114 #define SCOLL_ALG_REDUCE_LEGACY_LOG             4   
 115 
 116 typedef int (*mca_scoll_base_module_barrier_fn_t)(struct oshmem_group_t *group,
 117                                                   long *pSync,
 118                                                   int alg);
 119 typedef int (*mca_scoll_base_module_broadcast_fn_t)(struct oshmem_group_t *group,
 120                                                     int PE_root,
 121                                                     void *target,
 122                                                     const void *source,
 123                                                     size_t nlong,
 124                                                     long *pSync,
 125                                                     bool nlong_type,
 126                                                     int alg);
 127 typedef int (*mca_scoll_base_module_collect_fn_t)(struct oshmem_group_t *group,
 128                                                   void *target,
 129                                                   const void *source,
 130                                                   size_t nlong,
 131                                                   long *pSync,
 132                                                   bool nlong_type,
 133                                                   int alg);
 134 typedef int (*mca_scoll_base_module_reduce_fn_t)(struct oshmem_group_t *group,
 135                                                  struct oshmem_op_t *op,
 136                                                  void *target,
 137                                                  const void *source,
 138                                                  size_t nlong,
 139                                                  long *pSync,
 140                                                  void *pWrk,
 141                                                  int alg);
 142 typedef int (*mca_scoll_base_module_alltoall_fn_t)(struct oshmem_group_t *group,
 143                                                   void *target,
 144                                                   const void *source,
 145                                                   ptrdiff_t dst, ptrdiff_t sst,
 146                                                   size_t nelems,
 147                                                   size_t element_size,
 148                                                   long *pSync,
 149                                                   int alg);
 150 
 151 struct mca_scoll_base_module_1_0_0_t {
 152     
 153     opal_object_t super;
 154 
 155     
 156     mca_scoll_base_module_barrier_fn_t scoll_barrier;
 157     mca_scoll_base_module_broadcast_fn_t scoll_broadcast;
 158     mca_scoll_base_module_collect_fn_t scoll_collect;
 159     mca_scoll_base_module_reduce_fn_t scoll_reduce;
 160     mca_scoll_base_module_alltoall_fn_t scoll_alltoall;
 161     mca_scoll_base_module_enable_1_0_0_fn_t scoll_module_enable;
 162 };
 163 typedef struct mca_scoll_base_module_1_0_0_t mca_scoll_base_module_1_0_0_t;
 164 
 165 
 166 
 167 
 168 typedef struct mca_scoll_base_module_1_0_0_t mca_scoll_base_module_t;
 169 OSHMEM_DECLSPEC OBJ_CLASS_DECLARATION(mca_scoll_base_module_t);
 170 
 171 
 172 
 173 
 174 
 175 
 176 #define MCA_SCOLL_BASE_VERSION_2_0_0 \
 177     OSHMEM_MCA_BASE_VERSION_2_1_0("scoll", 1, 0, 0)
 178 
 179 
 180 
 181 
 182 
 183 
 184 
 185 
 186 struct mca_scoll_base_group_scoll_t {
 187     mca_scoll_base_module_barrier_fn_t scoll_barrier;
 188     mca_scoll_base_module_1_0_0_t *scoll_barrier_module;
 189     mca_scoll_base_module_broadcast_fn_t scoll_broadcast;
 190     mca_scoll_base_module_1_0_0_t *scoll_broadcast_module;
 191     mca_scoll_base_module_collect_fn_t scoll_collect;
 192     mca_scoll_base_module_1_0_0_t *scoll_collect_module;
 193     mca_scoll_base_module_reduce_fn_t scoll_reduce;
 194     mca_scoll_base_module_1_0_0_t *scoll_reduce_module;
 195     mca_scoll_base_module_alltoall_fn_t scoll_alltoall;
 196     mca_scoll_base_module_1_0_0_t *scoll_alltoall_module;
 197 };
 198 typedef struct mca_scoll_base_group_scoll_t mca_scoll_base_group_scoll_t;
 199 
 200 #define PREVIOUS_SCOLL_FN(module, __api, group, ...) do { \
 201     group->g_scoll.scoll_ ## __api ## _module = (mca_scoll_base_module_1_0_0_t*) module->previous_ ## __api ## _module; \
 202     rc = module->previous_ ## __api (group, __VA_ARGS__); \
 203     group->g_scoll.scoll_ ## __api ## _module = (mca_scoll_base_module_1_0_0_t*) module; \
 204 } while(0)
 205 
 206 END_C_DECLS
 207 
 208 #endif