mpidpkt.h 15.2 KB
Newer Older
1
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 3 4 5 6 7 8
/*
 *  (C) 2001 by Argonne National Laboratory.
 *      See COPYRIGHT in top-level directory.
 */

#ifndef HAVE_MPIDPKT_H
#define HAVE_MPIDPKT_H
9

10 11
#include "oputil.h"

12 13 14 15 16 17 18
#ifdef HAVE_STDINT_H
#  include <stdint.h>
#endif
#ifdef HAVE_INTTYPES_H
#  include <inttypes.h>
#endif

19 20 21
/* Enable the use of data within the message packet for small messages */
#define USE_EAGER_SHORT
#define MPIDI_EAGER_SHORT_INTS 4
22
/* FIXME: This appears to assume that sizeof(int) == 4 (or at least >= 4) */
23 24
#define MPIDI_EAGER_SHORT_SIZE 16

25 26 27
/* This is the number of ints that can be carried within an RMA packet */
#define MPIDI_RMA_IMMED_INTS 1

28 29 30
/* Union over all types (integer, logical, and multi-language types) that are
   allowed in a CAS operation.  This is used to allocate enough space in the
   packet header for immediate data.  */
31
typedef union {
32
#define MPIR_OP_TYPE_MACRO(mpi_type_, c_type_, type_name_) c_type_ cas_##type_name_;
33 34 35 36 37 38 39 40
    MPIR_OP_TYPE_GROUP(C_INTEGER)
    MPIR_OP_TYPE_GROUP(FORTRAN_INTEGER)
    MPIR_OP_TYPE_GROUP(LOGICAL)
    MPIR_OP_TYPE_GROUP(BYTE)
    MPIR_OP_TYPE_GROUP(C_INTEGER_EXTRA)
    MPIR_OP_TYPE_GROUP(FORTRAN_INTEGER_EXTRA)
    MPIR_OP_TYPE_GROUP(LOGICAL_EXTRA)
    MPIR_OP_TYPE_GROUP(BYTE_EXTRA)
41
#undef MPIR_OP_TYPE_MACRO
42 43
} MPIDI_CH3_CAS_Immed_u;

44 45 46 47 48 49 50
/* Union over all types (all predefined types) that are allowed in a
   Fetch-and-op operation.  This can be too large for the packet header, so we
   limit the immediate space in the header to FOP_IMMED_INTS. */

#define MPIDI_RMA_FOP_IMMED_INTS 2
#define MPIDI_RMA_FOP_RESP_IMMED_INTS 8

51 52 53
/* *INDENT-OFF* */
/* Indentation turned off because "indent" is getting confused with
 * the lack of a semi-colon in the fields below */
54
typedef union {
55
#define MPIR_OP_TYPE_MACRO(mpi_type_, c_type_, type_name_) c_type_ fop##type_name_;
56 57
    MPIR_OP_TYPE_GROUP_ALL_BASIC
    MPIR_OP_TYPE_GROUP_ALL_EXTRA
58
#undef MPIR_OP_TYPE_MACRO
59
} MPIDI_CH3_FOP_Immed_u;
60
/* *INDENT-ON* */
61

62
/*
63
 * Predefined packet types.  This simplifies some of the code.
64
 */
65 66
/* FIXME: Having predefined names makes it harder to add new message types,
   such as different RMA types. */
Pavan Balaji's avatar
Pavan Balaji committed
67 68 69
/* We start with an arbitrarily chosen number (42), to help with
 * debugging when a packet type is not initialized or wrongly
 * initialized. */
70
typedef enum {
Pavan Balaji's avatar
Pavan Balaji committed
71
    MPIDI_CH3_PKT_EAGER_SEND = 42,
72
#if defined(USE_EAGER_SHORT)
73
    MPIDI_CH3_PKT_EAGERSHORT_SEND,
74
#endif /* defined(USE_EAGER_SHORT) */
75
    MPIDI_CH3_PKT_EAGER_SYNC_SEND,      /* FIXME: no sync eager */
76 77 78 79
    MPIDI_CH3_PKT_EAGER_SYNC_ACK,
    MPIDI_CH3_PKT_READY_SEND,
    MPIDI_CH3_PKT_RNDV_REQ_TO_SEND,
    MPIDI_CH3_PKT_RNDV_CLR_TO_SEND,
80
    MPIDI_CH3_PKT_RNDV_SEND,    /* FIXME: should be stream put */
81 82
    MPIDI_CH3_PKT_CANCEL_SEND_REQ,
    MPIDI_CH3_PKT_CANCEL_SEND_RESP,
83
    MPIDI_CH3_PKT_PUT,  /* RMA Packets begin here */
84 85 86 87 88
    MPIDI_CH3_PKT_GET,
    MPIDI_CH3_PKT_GET_RESP,
    MPIDI_CH3_PKT_ACCUMULATE,
    MPIDI_CH3_PKT_LOCK,
    MPIDI_CH3_PKT_LOCK_GRANTED,
89
    MPIDI_CH3_PKT_UNLOCK,
90
    MPIDI_CH3_PKT_FLUSH,
Xin Zhao's avatar
Xin Zhao committed
91
    MPIDI_CH3_PKT_FLUSH_ACK,
92 93 94 95 96
    MPIDI_CH3_PKT_LOCK_PUT_UNLOCK,      /* optimization for single puts */
    MPIDI_CH3_PKT_LOCK_GET_UNLOCK,      /* optimization for single gets */
    MPIDI_CH3_PKT_LOCK_ACCUM_UNLOCK,    /* optimization for single accumulates */
    /* RMA Packets end here */
    MPIDI_CH3_PKT_ACCUM_IMMED,  /* optimization for short accumulate */
97
    /* FIXME: Add PUT, GET_IMMED packet types */
98 99
    MPIDI_CH3_PKT_CAS,
    MPIDI_CH3_PKT_CAS_RESP,
100 101
    MPIDI_CH3_PKT_FOP,
    MPIDI_CH3_PKT_FOP_RESP,
102 103
    MPIDI_CH3_PKT_GET_ACCUM,
    MPIDI_CH3_PKT_GET_ACCUM_RESP,
104
    MPIDI_CH3_PKT_FLOW_CNTL_UPDATE,     /* FIXME: Unused */
105
    MPIDI_CH3_PKT_CLOSE,
Wesley Bland's avatar
Wesley Bland committed
106
    MPIDI_CH3_PKT_REVOKE,
Pavan Balaji's avatar
Pavan Balaji committed
107
    MPIDI_CH3_PKT_END_CH3,
108
    /* The channel can define additional types by defining the value
109
     * MPIDI_CH3_PKT_ENUM */
110
# if defined(MPIDI_CH3_PKT_ENUM)
Pavan Balaji's avatar
Pavan Balaji committed
111
    MPIDI_CH3_PKT_ENUM,
112
# endif
Pavan Balaji's avatar
Pavan Balaji committed
113
    MPIDI_CH3_PKT_END_ALL,
114
    MPIDI_CH3_PKT_INVALID = -1  /* forces a signed enum to quash warnings */
Pavan Balaji's avatar
Pavan Balaji committed
115
} MPIDI_CH3_Pkt_type_t;
116

117
/* These flags can be "OR'ed" together */
118 119 120 121 122 123 124 125 126 127 128
typedef enum {
    MPIDI_CH3_PKT_FLAG_NONE = 0,
    MPIDI_CH3_PKT_FLAG_RMA_LOCK = 1,
    MPIDI_CH3_PKT_FLAG_RMA_UNLOCK = 2,
    MPIDI_CH3_PKT_FLAG_RMA_FLUSH = 4,
    MPIDI_CH3_PKT_FLAG_RMA_REQ_ACK = 8,
    MPIDI_CH3_PKT_FLAG_RMA_AT_COMPLETE = 16,
    MPIDI_CH3_PKT_FLAG_RMA_NOCHECK = 32,
    MPIDI_CH3_PKT_FLAG_RMA_SHARED = 64,
    MPIDI_CH3_PKT_FLAG_RMA_EXCLUSIVE = 128
} MPIDI_CH3_Pkt_flags_t;
129

130
typedef struct MPIDI_CH3_Pkt_send {
131 132
    MPIDI_CH3_Pkt_type_t type;  /* XXX - uint8_t to conserve space ??? */
    MPIDI_Message_match match;
133
    MPI_Request sender_req_id;  /* needed for ssend and send cancel */
134 135 136
    MPIDI_msg_sz_t data_sz;
#if defined(MPID_USE_SEQUENCE_NUMBERS)
    MPID_Seqnum_t seqnum;
137 138
#endif
} MPIDI_CH3_Pkt_send_t;
139

140
/* NOTE: Normal and synchronous eager sends, as well as all ready-mode sends,
141 142 143 144
   use the same structure but have a different type value. */
typedef MPIDI_CH3_Pkt_send_t MPIDI_CH3_Pkt_eager_send_t;
typedef MPIDI_CH3_Pkt_send_t MPIDI_CH3_Pkt_eager_sync_send_t;
typedef MPIDI_CH3_Pkt_send_t MPIDI_CH3_Pkt_ready_send_t;
145 146

#if defined(USE_EAGER_SHORT)
147
typedef struct MPIDI_CH3_Pkt_eagershort_send {
148 149 150 151 152 153
    MPIDI_CH3_Pkt_type_t type;  /* XXX - uint8_t to conserve space ??? */
    MPIDI_Message_match match;
    MPIDI_msg_sz_t data_sz;
#if defined(MPID_USE_SEQUENCE_NUMBERS)
    MPID_Seqnum_t seqnum;
#endif
154 155
    int data[MPIDI_EAGER_SHORT_INTS];   /* FIXME: Experimental for now */
} MPIDI_CH3_Pkt_eagershort_send_t;
156
#endif /* defined(USE_EAGER_SHORT) */
157

158
typedef struct MPIDI_CH3_Pkt_eager_sync_ack {
159 160
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request sender_req_id;
161
} MPIDI_CH3_Pkt_eager_sync_ack_t;
162 163 164

typedef MPIDI_CH3_Pkt_send_t MPIDI_CH3_Pkt_rndv_req_to_send_t;

165
typedef struct MPIDI_CH3_Pkt_rndv_clr_to_send {
166 167 168
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request sender_req_id;
    MPI_Request receiver_req_id;
169
} MPIDI_CH3_Pkt_rndv_clr_to_send_t;
170

171
typedef struct MPIDI_CH3_Pkt_rndv_send {
172 173
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request receiver_req_id;
174
} MPIDI_CH3_Pkt_rndv_send_t;
175

176
typedef struct MPIDI_CH3_Pkt_cancel_send_req {
177 178 179
    MPIDI_CH3_Pkt_type_t type;
    MPIDI_Message_match match;
    MPI_Request sender_req_id;
180
} MPIDI_CH3_Pkt_cancel_send_req_t;
181

182
typedef struct MPIDI_CH3_Pkt_cancel_send_resp {
183 184 185
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request sender_req_id;
    int ack;
186
} MPIDI_CH3_Pkt_cancel_send_resp_t;
187

188 189 190
/* *INDENT-OFF* */
/* Indentation turned off because "indent" is getting confused with
 * the lack of a semi-colon in the field below */
191 192 193
#if defined(MPIDI_CH3_PKT_DEFS)
MPIDI_CH3_PKT_DEFS
#endif
194
/* *INDENT-ON* */
195

196
typedef struct MPIDI_CH3_Pkt_put {
197
    MPIDI_CH3_Pkt_type_t type;
198
    MPIDI_CH3_Pkt_flags_t flags;
199 200 201
    void *addr;
    int count;
    MPI_Datatype datatype;
202 203 204 205 206 207 208 209 210 211 212
    int dataloop_size;          /* for derived datatypes */
    MPI_Win target_win_handle;  /* Used in the last RMA operation in each
                                 * epoch for decrementing rma op counter in
                                 * active target rma and for unlocking window
                                 * in passive target rma. Otherwise set to NULL*/
    MPI_Win source_win_handle;  /* Used in the last RMA operation in an
                                 * epoch in the case of passive target rma
                                 * with shared locks. Otherwise set to NULL*/
} MPIDI_CH3_Pkt_put_t;

typedef struct MPIDI_CH3_Pkt_get {
213
    MPIDI_CH3_Pkt_type_t type;
214
    MPIDI_CH3_Pkt_flags_t flags;
215 216 217
    void *addr;
    int count;
    MPI_Datatype datatype;
218
    int dataloop_size;          /* for derived datatypes */
219
    MPI_Request request_handle;
220 221 222 223 224 225 226 227 228 229
    MPI_Win target_win_handle;  /* Used in the last RMA operation in each
                                 * epoch for decrementing rma op counter in
                                 * active target rma and for unlocking window
                                 * in passive target rma. Otherwise set to NULL*/
    MPI_Win source_win_handle;  /* Used in the last RMA operation in an
                                 * epoch in the case of passive target rma
                                 * with shared locks. Otherwise set to NULL*/
} MPIDI_CH3_Pkt_get_t;

typedef struct MPIDI_CH3_Pkt_get_resp {
230 231
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request request_handle;
232
} MPIDI_CH3_Pkt_get_resp_t;
233

234
typedef struct MPIDI_CH3_Pkt_accum {
235
    MPIDI_CH3_Pkt_type_t type;
236
    MPIDI_CH3_Pkt_flags_t flags;
237
    MPI_Request request_handle; /* For get_accumulate response */
238 239 240
    void *addr;
    int count;
    MPI_Datatype datatype;
241
    int dataloop_size;          /* for derived datatypes */
242
    MPI_Op op;
243 244 245 246 247 248 249 250 251 252
    MPI_Win target_win_handle;  /* Used in the last RMA operation in each
                                 * epoch for decrementing rma op counter in
                                 * active target rma and for unlocking window
                                 * in passive target rma. Otherwise set to NULL*/
    MPI_Win source_win_handle;  /* Used in the last RMA operation in an
                                 * epoch in the case of passive target rma
                                 * with shared locks. Otherwise set to NULL*/
} MPIDI_CH3_Pkt_accum_t;

typedef struct MPIDI_CH3_Pkt_get_accum_resp {
253 254
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request request_handle;
255
} MPIDI_CH3_Pkt_get_accum_resp_t;
256

257
typedef struct MPIDI_CH3_Pkt_accum_immed {
258
    MPIDI_CH3_Pkt_type_t type;
259
    MPIDI_CH3_Pkt_flags_t flags;
260 261 262 263 264 265
    void *addr;
    int count;
    /* FIXME: Compress datatype/op into a single word (immedate mode) */
    MPI_Datatype datatype;
    MPI_Op op;
    /* FIXME: do we need these (use a regular accum packet if we do?) */
266 267 268 269 270 271 272
    MPI_Win target_win_handle;  /* Used in the last RMA operation in each
                                 * epoch for decrementing rma op counter in
                                 * active target rma and for unlocking window
                                 * in passive target rma. Otherwise set to NULL*/
    MPI_Win source_win_handle;  /* Used in the last RMA operation in an
                                 * epoch in the case of passive target rma
                                 * with shared locks. Otherwise set to NULL*/
273
    int data[MPIDI_RMA_IMMED_INTS];
274
} MPIDI_CH3_Pkt_accum_immed_t;
275

276
typedef struct MPIDI_CH3_Pkt_cas {
277
    MPIDI_CH3_Pkt_type_t type;
278
    MPIDI_CH3_Pkt_flags_t flags;
279
    MPI_Datatype datatype;
280
    void *addr;
281
    MPI_Request request_handle;
282 283 284 285
    MPI_Win target_win_handle;  /* Used in the last RMA operation in each
                                 * epoch for decrementing rma op counter in
                                 * active target rma and for unlocking window
                                 * in passive target rma. Otherwise set to NULL*/
286 287
    MPIDI_CH3_CAS_Immed_u origin_data;
    MPIDI_CH3_CAS_Immed_u compare_data;
288
} MPIDI_CH3_Pkt_cas_t;
289

290
typedef struct MPIDI_CH3_Pkt_cas_resp {
291 292 293
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request request_handle;
    MPIDI_CH3_CAS_Immed_u data;
294
} MPIDI_CH3_Pkt_cas_resp_t;
295

296
typedef struct MPIDI_CH3_Pkt_fop {
297
    MPIDI_CH3_Pkt_type_t type;
298
    MPIDI_CH3_Pkt_flags_t flags;
299 300 301 302
    MPI_Datatype datatype;
    void *addr;
    MPI_Op op;
    MPI_Request request_handle;
303 304 305 306
    MPI_Win target_win_handle;  /* Used in the last RMA operation in each
                                 * epoch for decrementing rma op counter in
                                 * active target rma and for unlocking window
                                 * in passive target rma. Otherwise set to NULL*/
307
    int origin_data[MPIDI_RMA_FOP_IMMED_INTS];
308
} MPIDI_CH3_Pkt_fop_t;
309

310
typedef struct MPIDI_CH3_Pkt_fop_resp {
311 312
    MPIDI_CH3_Pkt_type_t type;
    MPI_Request request_handle;
313
    int data[MPIDI_RMA_FOP_RESP_IMMED_INTS];
314
} MPIDI_CH3_Pkt_fop_resp_t;
315

316
typedef struct MPIDI_CH3_Pkt_lock {
317 318 319 320
    MPIDI_CH3_Pkt_type_t type;
    int lock_type;
    MPI_Win target_win_handle;
    MPI_Win source_win_handle;
321
    int target_rank;            /* Used in unluck/flush response to look up the
322
                                 * target state at the origin. */
323
    int origin_rank;
324
} MPIDI_CH3_Pkt_lock_t;
325

326
typedef struct MPIDI_CH3_Pkt_lock_granted {
327 328
    MPIDI_CH3_Pkt_type_t type;
    MPI_Win source_win_handle;
Xin Zhao's avatar
Xin Zhao committed
329
    int target_rank;            /* Used in flush_ack response to look up the
330 331
                                 * target state at the origin. */
} MPIDI_CH3_Pkt_lock_granted_t;
332

Xin Zhao's avatar
Xin Zhao committed
333
typedef MPIDI_CH3_Pkt_lock_granted_t MPIDI_CH3_Pkt_flush_ack_t;
334
typedef MPIDI_CH3_Pkt_lock_t MPIDI_CH3_Pkt_unlock_t;
335
typedef MPIDI_CH3_Pkt_lock_t MPIDI_CH3_Pkt_flush_t;
336

337
typedef struct MPIDI_CH3_Pkt_lock_put_unlock {
338
    MPIDI_CH3_Pkt_type_t type;
339
    MPIDI_CH3_Pkt_flags_t flags;
340 341
    MPI_Win target_win_handle;
    MPI_Win source_win_handle;
342
    int origin_rank;
343 344 345 346
    int lock_type;
    void *addr;
    int count;
    MPI_Datatype datatype;
347
} MPIDI_CH3_Pkt_lock_put_unlock_t;
348

349
typedef struct MPIDI_CH3_Pkt_lock_get_unlock {
350
    MPIDI_CH3_Pkt_type_t type;
351
    MPIDI_CH3_Pkt_flags_t flags;
352 353
    MPI_Win target_win_handle;
    MPI_Win source_win_handle;
354
    int origin_rank;
355 356 357 358 359
    int lock_type;
    void *addr;
    int count;
    MPI_Datatype datatype;
    MPI_Request request_handle;
360
} MPIDI_CH3_Pkt_lock_get_unlock_t;
361

362
typedef struct MPIDI_CH3_Pkt_lock_accum_unlock {
363
    MPIDI_CH3_Pkt_type_t type;
364
    MPIDI_CH3_Pkt_flags_t flags;
365 366
    MPI_Win target_win_handle;
    MPI_Win source_win_handle;
367
    int origin_rank;
368 369 370 371 372
    int lock_type;
    void *addr;
    int count;
    MPI_Datatype datatype;
    MPI_Op op;
373
} MPIDI_CH3_Pkt_lock_accum_unlock_t;
374 375


376
typedef struct MPIDI_CH3_Pkt_close {
377 378
    MPIDI_CH3_Pkt_type_t type;
    int ack;
379
} MPIDI_CH3_Pkt_close_t;
380

381
typedef struct MPIDI_CH3_Pkt_revoke {
Wesley Bland's avatar
Wesley Bland committed
382 383
    MPIDI_CH3_Pkt_type_t type;
    MPIR_Context_id_t revoked_comm;
384
} MPIDI_CH3_Pkt_revoke_t;
Wesley Bland's avatar
Wesley Bland committed
385

386
typedef union MPIDI_CH3_Pkt {
387 388
    MPIDI_CH3_Pkt_type_t type;
    MPIDI_CH3_Pkt_eager_send_t eager_send;
389
#if defined(USE_EAGER_SHORT)
390
    MPIDI_CH3_Pkt_eagershort_send_t eagershort_send;
391
#endif                          /* defined(USE_EAGER_SHORT) */
392 393 394 395 396 397 398 399 400 401 402 403
    MPIDI_CH3_Pkt_eager_sync_send_t eager_sync_send;
    MPIDI_CH3_Pkt_eager_sync_ack_t eager_sync_ack;
    MPIDI_CH3_Pkt_eager_send_t ready_send;
    MPIDI_CH3_Pkt_rndv_req_to_send_t rndv_req_to_send;
    MPIDI_CH3_Pkt_rndv_clr_to_send_t rndv_clr_to_send;
    MPIDI_CH3_Pkt_rndv_send_t rndv_send;
    MPIDI_CH3_Pkt_cancel_send_req_t cancel_send_req;
    MPIDI_CH3_Pkt_cancel_send_resp_t cancel_send_resp;
    MPIDI_CH3_Pkt_put_t put;
    MPIDI_CH3_Pkt_get_t get;
    MPIDI_CH3_Pkt_get_resp_t get_resp;
    MPIDI_CH3_Pkt_accum_t accum;
404
    MPIDI_CH3_Pkt_accum_immed_t accum_immed;
405 406
    MPIDI_CH3_Pkt_lock_t lock;
    MPIDI_CH3_Pkt_lock_granted_t lock_granted;
407
    MPIDI_CH3_Pkt_unlock_t unlock;
408
    MPIDI_CH3_Pkt_flush_t flush;
Xin Zhao's avatar
Xin Zhao committed
409
    MPIDI_CH3_Pkt_flush_ack_t flush_ack;
410 411 412 413
    MPIDI_CH3_Pkt_lock_put_unlock_t lock_put_unlock;
    MPIDI_CH3_Pkt_lock_get_unlock_t lock_get_unlock;
    MPIDI_CH3_Pkt_lock_accum_unlock_t lock_accum_unlock;
    MPIDI_CH3_Pkt_close_t close;
414 415
    MPIDI_CH3_Pkt_cas_t cas;
    MPIDI_CH3_Pkt_cas_resp_t cas_resp;
416 417
    MPIDI_CH3_Pkt_fop_t fop;
    MPIDI_CH3_Pkt_fop_resp_t fop_resp;
418
    MPIDI_CH3_Pkt_get_accum_resp_t get_accum_resp;
Wesley Bland's avatar
Wesley Bland committed
419
    MPIDI_CH3_Pkt_revoke_t revoke;
420
# if defined(MPIDI_CH3_PKT_DECL)
421
     MPIDI_CH3_PKT_DECL
422
# endif
423
} MPIDI_CH3_Pkt_t;
424 425

#if defined(MPID_USE_SEQUENCE_NUMBERS)
426
typedef struct MPIDI_CH3_Pkt_send_container {
427
    MPIDI_CH3_Pkt_send_t pkt;
428 429
    struct MPIDI_CH3_Pkt_send_container_s *next;
} MPIDI_CH3_Pkt_send_container_t;
430 431 432
#endif

#endif