Blame src/include/mpir_dataloop.h

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2001 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
#ifndef MPIR_DATALOOP_H_INCLUDED
Packit Service c5cf8c
#define MPIR_DATALOOP_H_INCLUDED
Packit Service c5cf8c
Packit Service c5cf8c
#include <mpi.h>
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
 * The following macro allows us to reference the regular
Packit Service c5cf8c
 * value for the 3 fields (NULL,_size,_depth) in the
Packit Service c5cf8c
 * MPIR_Datatype structure.  This is used in the many
Packit Service c5cf8c
 * macros that access fields of the datatype.  We need this macro
Packit Service c5cf8c
 * to simplify the definition of the other macros.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#define MPIR_DATALOOP_GET_FIELD(value_,fieldname_) \
Packit Service c5cf8c
      value_ = ((MPIR_Datatype *)ptr)->dataloop##fieldname_
Packit Service c5cf8c
Packit Service c5cf8c
#define MPIR_DATALOOP_SET_FIELD(value_,fieldname_) \
Packit Service c5cf8c
    ((MPIR_Datatype *)ptr)->dataloop##fieldname_ = value_
Packit Service c5cf8c
Packit Service c5cf8c
/* These following dataloop-specific types will be used throughout the DLOOP
Packit Service c5cf8c
 * instance:
Packit Service c5cf8c
 */
Packit Service c5cf8c
#define DLOOP_Offset     MPI_Aint
Packit Service c5cf8c
#define DLOOP_Count      MPI_Aint
Packit Service c5cf8c
#define DLOOP_Handle     MPI_Datatype
Packit Service c5cf8c
#define DLOOP_Type       MPI_Datatype
Packit Service c5cf8c
#define DLOOP_Buffer     void *
Packit Service c5cf8c
#define DLOOP_VECTOR     MPL_IOV
Packit Service c5cf8c
#define DLOOP_VECTOR_LEN MPL_IOV_LEN
Packit Service c5cf8c
#define DLOOP_VECTOR_BUF MPL_IOV_BUF
Packit Service c5cf8c
#define DLOOP_Size       MPI_Aint
Packit Service c5cf8c
Packit Service c5cf8c
/* The following accessor functions must also be defined:
Packit Service c5cf8c
 *
Packit Service c5cf8c
 * DLOOP_Handle_extent()
Packit Service c5cf8c
 * DLOOP_Handle_size()
Packit Service c5cf8c
 * DLOOP_Handle_loopptr()
Packit Service c5cf8c
 * DLOOP_Handle_loopdepth()
Packit Service c5cf8c
 * DLOOP_Handle_hasloop()
Packit Service c5cf8c
 *
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
/* USE THE NOTATION THAT BILL USED IN MPIIMPL.H AND MAKE THESE MACROS */
Packit Service c5cf8c
Packit Service c5cf8c
/* NOTE: put get size into mpiimpl.h; the others go here until such time
Packit Service c5cf8c
 * as we see that we need them elsewhere.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#define DLOOP_Handle_get_loopdepth_macro(handle_,depth_) \
Packit Service c5cf8c
    MPIR_Datatype_get_loopdepth_macro(handle_,depth_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_get_loopsize_macro(handle_,size_) \
Packit Service c5cf8c
    MPIR_Datatype_get_loopsize_macro(handle_,size_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_get_loopptr_macro(handle_,lptr_) \
Packit Service c5cf8c
    MPIR_Datatype_get_loopptr_macro(handle_,lptr_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_set_loopptr_macro(handle_,lptr_) \
Packit Service c5cf8c
    MPIR_Datatype_set_loopptr_macro(handle_,lptr_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_set_loopdepth_macro(handle_,depth_) \
Packit Service c5cf8c
    MPIR_Datatype_set_loopdepth_macro(handle_,depth_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_set_loopsize_macro(handle_,size_) \
Packit Service c5cf8c
    MPIR_Datatype_set_loopsize_macro(handle_,size_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_get_size_macro(handle_,size_) \
Packit Service c5cf8c
    MPIR_Datatype_get_size_macro(handle_,size_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_get_basic_type_macro(handle_,basic_type_) \
Packit Service c5cf8c
    MPIR_Datatype_get_basic_type(handle_, basic_type_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_get_extent_macro(handle_,extent_) \
Packit Service c5cf8c
    MPIR_Datatype_get_extent_macro(handle_,extent_)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Handle_hasloop_macro(handle_)                           \
Packit Service c5cf8c
    ((HANDLE_GET_KIND(handle_) == HANDLE_KIND_BUILTIN) ? 0 : 1)
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_Ensure_Offset_fits_in_pointer(value_) \
Packit Service c5cf8c
    MPIR_Ensure_Aint_fits_in_pointer(value_)
Packit Service c5cf8c
Packit Service c5cf8c
/* allocate and free functions must also be defined. */
Packit Service c5cf8c
#define DLOOP_Malloc MPL_malloc
Packit Service c5cf8c
#define DLOOP_Free   MPL_free
Packit Service c5cf8c
Packit Service c5cf8c
/* assert function */
Packit Service c5cf8c
#define DLOOP_Assert MPIR_Assert
Packit Service c5cf8c
Packit Service c5cf8c
/* memory copy function */
Packit Service c5cf8c
#define DLOOP_Memcpy MPIR_Memcpy
Packit Service c5cf8c
Packit Service c5cf8c
/* casting macros */
Packit Service c5cf8c
#define DLOOP_OFFSET_CAST_TO_VOID_PTR MPIR_AINT_CAST_TO_VOID_PTR
Packit Service c5cf8c
#define DLOOP_VOID_PTR_CAST_TO_OFFSET MPIR_VOID_PTR_CAST_TO_MPI_AINT
Packit Service c5cf8c
#define DLOOP_PTR_DISP_CAST_TO_OFFSET MPIR_PTR_DISP_CAST_TO_MPI_AINT
Packit Service c5cf8c
Packit Service c5cf8c
/* printing macros */
Packit Service c5cf8c
#define DLOOP_OFFSET_FMT_DEC_SPEC MPI_AINT_FMT_DEC_SPEC
Packit Service c5cf8c
#define DLOOP_OFFSET_FMT_HEX_SPEC MPI_AINT_FMT_HEX_SPEC
Packit Service c5cf8c
Packit Service c5cf8c
/* Redefine all of the internal structures in terms of the prefix */
Packit Service c5cf8c
#define DLOOP_Dataloop              MPIR_Dataloop
Packit Service c5cf8c
#define DLOOP_Dataloop_contig       MPIR_Dataloop_contig
Packit Service c5cf8c
#define DLOOP_Dataloop_vector       MPIR_Dataloop_vector
Packit Service c5cf8c
#define DLOOP_Dataloop_blockindexed MPIR_Dataloop_blockindexed
Packit Service c5cf8c
#define DLOOP_Dataloop_indexed      MPIR_Dataloop_indexed
Packit Service c5cf8c
#define DLOOP_Dataloop_struct       MPIR_Dataloop_struct
Packit Service c5cf8c
#define DLOOP_Dataloop_common       MPIR_Dataloop_common
Packit Service c5cf8c
#define DLOOP_Segment               MPIR_Segment
Packit Service c5cf8c
#define DLOOP_Dataloop_stackelm     MPIR_Dataloop_stackelm
Packit Service c5cf8c
Packit Service c5cf8c
/* These flags are used at creation time to specify what types of
Packit Service c5cf8c
 * optimizations may be applied.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#define DLOOP_DATALOOP_DEFAULT       0
Packit Service c5cf8c
#define DLOOP_DATALOOP_ALL_BYTES     1
Packit Service c5cf8c
Packit Service c5cf8c
/* NOTE: ASSUMING LAST TYPE IS SIGNED */
Packit Service c5cf8c
#define SEGMENT_IGNORE_LAST ((DLOOP_Offset) -1)
Packit Service c5cf8c
/*
Packit Service c5cf8c
 * Each of the MPI datatypes can be mapped into one of 5 very simple
Packit Service c5cf8c
 * loops.  This loop has the following parameters:
Packit Service c5cf8c
 * - count
Packit Service c5cf8c
 * - blocksize[]
Packit Service c5cf8c
 * - offset[]
Packit Service c5cf8c
 * - stride
Packit Service c5cf8c
 * - datatype[]
Packit Service c5cf8c
 *
Packit Service c5cf8c
 * where each [] indicates that a field may be *either* an array or a scalar.
Packit Service c5cf8c
 * For each such type, we define a struct that describes these parameters
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Dataloop_contig - Description of a contiguous dataloop
Packit Service c5cf8c
Packit Service c5cf8c
  Fields:
Packit Service c5cf8c
+ count - Number of elements
Packit Service c5cf8c
- dataloop - Dataloop of the elements
Packit Service c5cf8c
Packit Service c5cf8c
  Module:
Packit Service c5cf8c
  Datatype
Packit Service c5cf8c
  S*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop_contig {
Packit Service c5cf8c
    DLOOP_Count count;
Packit Service c5cf8c
    struct DLOOP_Dataloop *dataloop;
Packit Service c5cf8c
} DLOOP_Dataloop_contig;
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Dataloop_vector - Description of a vector or strided dataloop
Packit Service c5cf8c
Packit Service c5cf8c
  Fields:
Packit Service c5cf8c
+ count - Number of elements
Packit Service c5cf8c
. blocksize - Number of dataloops in each element
Packit Service c5cf8c
. stride - Stride (in bytes) between each block
Packit Service c5cf8c
- dataloop - Dataloop of each element
Packit Service c5cf8c
Packit Service c5cf8c
  Module:
Packit Service c5cf8c
  Datatype
Packit Service c5cf8c
  S*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop_vector {
Packit Service c5cf8c
    DLOOP_Count count;
Packit Service c5cf8c
    struct DLOOP_Dataloop *dataloop;
Packit Service c5cf8c
    DLOOP_Count blocksize;
Packit Service c5cf8c
    DLOOP_Offset stride;
Packit Service c5cf8c
} DLOOP_Dataloop_vector;
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Dataloop_blockindexed - Description of a block-indexed dataloop
Packit Service c5cf8c
Packit Service c5cf8c
  Fields:
Packit Service c5cf8c
+ count - Number of blocks
Packit Service c5cf8c
. blocksize - Number of elements in each block
Packit Service c5cf8c
. offset_array - Array of offsets (in bytes) to each block
Packit Service c5cf8c
- dataloop - Dataloop of each element
Packit Service c5cf8c
Packit Service c5cf8c
  Module:
Packit Service c5cf8c
  Datatype
Packit Service c5cf8c
Packit Service c5cf8c
  S*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop_blockindexed {
Packit Service c5cf8c
    DLOOP_Count count;
Packit Service c5cf8c
    struct DLOOP_Dataloop *dataloop;
Packit Service c5cf8c
    DLOOP_Count blocksize;
Packit Service c5cf8c
    DLOOP_Offset *offset_array;
Packit Service c5cf8c
} DLOOP_Dataloop_blockindexed;
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Dataloop_indexed - Description of an indexed dataloop
Packit Service c5cf8c
Packit Service c5cf8c
  Fields:
Packit Service c5cf8c
+ count - Number of blocks
Packit Service c5cf8c
. blocksize_array - Array giving the number of elements in each block
Packit Service c5cf8c
. offset_array - Array of offsets (in bytes) to each block
Packit Service c5cf8c
. total_blocks - count of total blocks in the array (cached value)
Packit Service c5cf8c
- dataloop - Dataloop of each element
Packit Service c5cf8c
Packit Service c5cf8c
  Module:
Packit Service c5cf8c
  Datatype
Packit Service c5cf8c
Packit Service c5cf8c
  S*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop_indexed {
Packit Service c5cf8c
    DLOOP_Count count;
Packit Service c5cf8c
    struct DLOOP_Dataloop *dataloop;
Packit Service c5cf8c
    DLOOP_Count *blocksize_array;
Packit Service c5cf8c
    DLOOP_Offset *offset_array;
Packit Service c5cf8c
    DLOOP_Count total_blocks;
Packit Service c5cf8c
} DLOOP_Dataloop_indexed;
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Dataloop_struct - Description of a structure dataloop
Packit Service c5cf8c
Packit Service c5cf8c
  Fields:
Packit Service c5cf8c
+ count - Number of blocks
Packit Service c5cf8c
. blocksize_array - Array giving the number of elements in each block
Packit Service c5cf8c
. offset_array - Array of offsets (in bytes) to each block
Packit Service c5cf8c
- dataloop_array - Array of dataloops describing the elements of each block
Packit Service c5cf8c
Packit Service c5cf8c
  Module:
Packit Service c5cf8c
  Datatype
Packit Service c5cf8c
Packit Service c5cf8c
  S*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop_struct {
Packit Service c5cf8c
    DLOOP_Count count;
Packit Service c5cf8c
    struct DLOOP_Dataloop **dataloop_array;
Packit Service c5cf8c
    DLOOP_Count *blocksize_array;
Packit Service c5cf8c
    DLOOP_Offset *offset_array;
Packit Service c5cf8c
    DLOOP_Offset *el_extent_array;      /* need more than one */
Packit Service c5cf8c
} DLOOP_Dataloop_struct;
Packit Service c5cf8c
Packit Service c5cf8c
/* In many cases, we need the count and the next dataloop item. This
Packit Service c5cf8c
   common structure gives a quick access to both.  Note that all other
Packit Service c5cf8c
   structures must use the same ordering of elements.
Packit Service c5cf8c
   Question: should we put the pointer first in case
Packit Service c5cf8c
   sizeof(pointer)>sizeof(int) ?
Packit Service c5cf8c
*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop_common {
Packit Service c5cf8c
    DLOOP_Count count;
Packit Service c5cf8c
    struct DLOOP_Dataloop *dataloop;
Packit Service c5cf8c
} DLOOP_Dataloop_common;
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Dataloop - Description of the structure used to hold a dataloop
Packit Service c5cf8c
  description
Packit Service c5cf8c
Packit Service c5cf8c
  Fields:
Packit Service c5cf8c
+  kind - Describes the type of the dataloop.  This is divided into three
Packit Service c5cf8c
   separate bit fields\:
Packit Service c5cf8c
.vb
Packit Service c5cf8c
     Dataloop type (e.g., DLOOP_CONTIG etc.).  3 bits
Packit Service c5cf8c
     IsFinal (a "leaf" dataloop; see text) 1 bit
Packit Service c5cf8c
     Element Size (units for fields.) 2 bits
Packit Service c5cf8c
        Element size has 4 values
Packit Service c5cf8c
        0   - Elements are in units of bytes
Packit Service c5cf8c
        1   - Elements are in units of 2 bytes
Packit Service c5cf8c
        2   - Elements are in units of 4 bytes
Packit Service c5cf8c
        3   - Elements are in units of 8 bytes
Packit Service c5cf8c
.ve
Packit Service c5cf8c
  The dataloop type is one of 'DLOOP_CONTIG', 'DLOOP_VECTOR',
Packit Service c5cf8c
  'DLOOP_BLOCKINDEXED', 'DLOOP_INDEXED', or 'DLOOP_STRUCT'.
Packit Service c5cf8c
. loop_parms - A union containing the 5 dataloop structures, e.g.,
Packit Service c5cf8c
  'DLOOP_Dataloop_contig', 'DLOOP_Dataloop_vector', etc.  A sixth element in
Packit Service c5cf8c
  this union, 'count', allows quick access to the shared 'count' field in the
Packit Service c5cf8c
  five dataloop structure.
Packit Service c5cf8c
. extent - The extent of the dataloop
Packit Service c5cf8c
Packit Service c5cf8c
  Module:
Packit Service c5cf8c
  Datatype
Packit Service c5cf8c
Packit Service c5cf8c
  S*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop {
Packit Service c5cf8c
    int kind;                   /* Contains both the loop type
Packit Service c5cf8c
                                 * (contig, vector, blockindexed, indexed,
Packit Service c5cf8c
                                 * or struct) and a bit that indicates
Packit Service c5cf8c
                                 * whether the dataloop is a leaf type. */
Packit Service c5cf8c
    union {
Packit Service c5cf8c
        DLOOP_Count count;
Packit Service c5cf8c
        DLOOP_Dataloop_contig c_t;
Packit Service c5cf8c
        DLOOP_Dataloop_vector v_t;
Packit Service c5cf8c
        DLOOP_Dataloop_blockindexed bi_t;
Packit Service c5cf8c
        DLOOP_Dataloop_indexed i_t;
Packit Service c5cf8c
        DLOOP_Dataloop_struct s_t;
Packit Service c5cf8c
        DLOOP_Dataloop_common cm_t;
Packit Service c5cf8c
    } loop_params;
Packit Service c5cf8c
    DLOOP_Offset el_size;
Packit Service c5cf8c
    DLOOP_Offset el_extent;
Packit Service c5cf8c
    DLOOP_Type el_type;
Packit Service c5cf8c
} DLOOP_Dataloop;
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_FINAL_MASK  0x00000008
Packit Service c5cf8c
#define DLOOP_KIND_MASK   0x00000007
Packit Service c5cf8c
#define DLOOP_KIND_CONTIG 0x1
Packit Service c5cf8c
#define DLOOP_KIND_VECTOR 0x2
Packit Service c5cf8c
#define DLOOP_KIND_BLOCKINDEXED 0x3
Packit Service c5cf8c
#define DLOOP_KIND_INDEXED 0x4
Packit Service c5cf8c
#define DLOOP_KIND_STRUCT 0x5
Packit Service c5cf8c
Packit Service c5cf8c
/* The max datatype depth is the maximum depth of the stack used to
Packit Service c5cf8c
   evaluate datatypes.  It represents the length of the chain of
Packit Service c5cf8c
   datatype dependencies.  Defining this and testing when a datatype
Packit Service c5cf8c
   is created removes a test in the datatype evaluation loop. */
Packit Service c5cf8c
#define DLOOP_MAX_DATATYPE_DEPTH 16
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Dataloop_stackelm - Structure for an element of the stack used
Packit Service c5cf8c
  to process dataloops
Packit Service c5cf8c
Packit Service c5cf8c
  Fields:
Packit Service c5cf8c
+ curcount - Current loop count value (between 0 and
Packit Service c5cf8c
             loop.loop_params.count-1)
Packit Service c5cf8c
. orig_count - original count value (cached so we don't have to look it up)
Packit Service c5cf8c
. curoffset - Offset into memory relative to the pointer to the buffer
Packit Service c5cf8c
              passed in by the user.  Used to maintain our position as we
Packit Service c5cf8c
              move up and down the stack.  NEED MORE NOTES ON THIS!!!
Packit Service c5cf8c
. orig_offset - original offset, set before the stackelm is processed, so that
Packit Service c5cf8c
                we know where the offset was.  this is used in processing indexed
Packit Service c5cf8c
                types and possibly others.  it is set for all types, but not
Packit Service c5cf8c
                referenced in some cases.
Packit Service c5cf8c
. curblock - Current block value...NEED MORE NOTES ON THIS!!!
Packit Service c5cf8c
. orig_block - original block value (caches so we don't have to look it up);
Packit Service c5cf8c
               INVALID FOR INDEX AND STRUCT TYPES.
Packit Service c5cf8c
- loop_p  - pointer to Loop-based description of the dataloop
Packit Service c5cf8c
Packit Service c5cf8c
S*/
Packit Service c5cf8c
typedef struct DLOOP_Dataloop_stackelm {
Packit Service c5cf8c
    int may_require_reloading;  /* indicates that items below might
Packit Service c5cf8c
                                 * need reloading (e.g. this is a struct)
Packit Service c5cf8c
                                 */
Packit Service c5cf8c
Packit Service c5cf8c
    DLOOP_Count curcount;
Packit Service c5cf8c
    DLOOP_Offset curoffset;
Packit Service c5cf8c
    DLOOP_Count curblock;
Packit Service c5cf8c
Packit Service c5cf8c
    DLOOP_Count orig_count;
Packit Service c5cf8c
    DLOOP_Offset orig_offset;
Packit Service c5cf8c
    DLOOP_Count orig_block;
Packit Service c5cf8c
Packit Service c5cf8c
    struct DLOOP_Dataloop *loop_p;
Packit Service c5cf8c
} DLOOP_Dataloop_stackelm;
Packit Service c5cf8c
Packit Service c5cf8c
/*S
Packit Service c5cf8c
  DLOOP_Segment - Description of the Segment datatype
Packit Service c5cf8c
Packit Service c5cf8c
  Notes:
Packit Service c5cf8c
  This has no corresponding MPI datatype.
Packit Service c5cf8c
Packit Service c5cf8c
  Module:
Packit Service c5cf8c
  Segment
Packit Service c5cf8c
Packit Service c5cf8c
  Questions:
Packit Service c5cf8c
  Should this have an id for allocation and similarity purposes?
Packit Service c5cf8c
  S*/
Packit Service c5cf8c
typedef struct DLOOP_Segment {
Packit Service c5cf8c
    void *ptr;                  /* pointer to datatype buffer */
Packit Service c5cf8c
    DLOOP_Handle handle;
Packit Service c5cf8c
    DLOOP_Offset stream_off;    /* next offset into data stream resulting from datatype
Packit Service c5cf8c
                                 * processing.  in other words, how many bytes have
Packit Service c5cf8c
                                 * we created/used by parsing so far?  that amount + 1.
Packit Service c5cf8c
                                 */
Packit Service c5cf8c
    DLOOP_Dataloop_stackelm stackelm[DLOOP_MAX_DATATYPE_DEPTH];
Packit Service c5cf8c
    int cur_sp;                 /* Current stack pointer when using dataloop */
Packit Service c5cf8c
    int valid_sp;               /* maximum valid stack pointer.  This is used to
Packit Service c5cf8c
                                 * maintain information on the stack after it has
Packit Service c5cf8c
                                 * been placed there by following the datatype field
Packit Service c5cf8c
                                 * in a DLOOP_Dataloop_st for any type except struct */
Packit Service c5cf8c
Packit Service c5cf8c
    struct DLOOP_Dataloop builtin_loop; /* used for both predefined types (which
Packit Service c5cf8c
                                         * won't have a loop already) and for
Packit Service c5cf8c
                                         * situations where a count is passed in
Packit Service c5cf8c
                                         * and we need to create a contig loop
Packit Service c5cf8c
                                         * to handle it
Packit Service c5cf8c
                                         */
Packit Service c5cf8c
    /* other, device-specific information */
Packit Service c5cf8c
} DLOOP_Segment;
Packit Service c5cf8c
Packit Service c5cf8c
/* Dataloop functions (dataloop.c) */
Packit Service c5cf8c
void MPIR_Dataloop_copy(void *dest, void *src, DLOOP_Size size);
Packit Service c5cf8c
void MPIR_Dataloop_update(DLOOP_Dataloop * dataloop, DLOOP_Offset ptrdiff);
Packit Service c5cf8c
DLOOP_Offset
Packit Service c5cf8c
MPIR_Dataloop_stream_size(DLOOP_Dataloop * dl_p, DLOOP_Offset(*sizefn) (DLOOP_Type el_type));
Packit Service c5cf8c
void MPIR_Dataloop_print(DLOOP_Dataloop * dataloop, int depth);
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Dataloop_alloc(int kind,
Packit Service c5cf8c
                         DLOOP_Count count,
Packit Service c5cf8c
                         DLOOP_Dataloop ** new_loop_p, DLOOP_Size * new_loop_sz_p);
Packit Service c5cf8c
void MPIR_Dataloop_alloc_and_copy(int kind,
Packit Service c5cf8c
                                  DLOOP_Count count,
Packit Service c5cf8c
                                  DLOOP_Dataloop * old_loop,
Packit Service c5cf8c
                                  DLOOP_Size old_loop_sz,
Packit Service c5cf8c
                                  DLOOP_Dataloop ** new_loop_p, DLOOP_Size * new_loop_sz_p);
Packit Service c5cf8c
void MPIR_Dataloop_struct_alloc(DLOOP_Count count,
Packit Service c5cf8c
                                DLOOP_Size old_loop_sz,
Packit Service c5cf8c
                                int basic_ct,
Packit Service c5cf8c
                                DLOOP_Dataloop ** old_loop_p,
Packit Service c5cf8c
                                DLOOP_Dataloop ** new_loop_p, DLOOP_Size * new_loop_sz_p);
Packit Service c5cf8c
void MPIR_Dataloop_dup(DLOOP_Dataloop * old_loop,
Packit Service c5cf8c
                       DLOOP_Size old_loop_sz, DLOOP_Dataloop ** new_loop_p);
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Dataloop_free(DLOOP_Dataloop ** dataloop);
Packit Service c5cf8c
Packit Service c5cf8c
/* Segment functions (segment.c) */
Packit Service c5cf8c
DLOOP_Segment *MPIR_Segment_alloc(void);
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Segment_free(DLOOP_Segment * segp);
Packit Service c5cf8c
Packit Service c5cf8c
int MPIR_Segment_init(const DLOOP_Buffer buf,
Packit Service c5cf8c
                      DLOOP_Count count, DLOOP_Handle handle, DLOOP_Segment * segp);
Packit Service c5cf8c
Packit Service c5cf8c
void
Packit Service c5cf8c
MPIR_Segment_manipulate(DLOOP_Segment * segp,
Packit Service c5cf8c
                        DLOOP_Offset first,
Packit Service c5cf8c
                        DLOOP_Offset * lastp,
Packit Service c5cf8c
                        int (*piecefn) (DLOOP_Offset * blocks_p,
Packit Service c5cf8c
                                        DLOOP_Type el_type,
Packit Service c5cf8c
                                        DLOOP_Offset rel_off,
Packit Service c5cf8c
                                        DLOOP_Buffer bufp,
Packit Service c5cf8c
                                        void *v_paramp),
Packit Service c5cf8c
                        int (*vectorfn) (DLOOP_Offset * blocks_p,
Packit Service c5cf8c
                                         DLOOP_Count count,
Packit Service c5cf8c
                                         DLOOP_Count blklen,
Packit Service c5cf8c
                                         DLOOP_Offset stride,
Packit Service c5cf8c
                                         DLOOP_Type el_type,
Packit Service c5cf8c
                                         DLOOP_Offset rel_off,
Packit Service c5cf8c
                                         DLOOP_Buffer bufp,
Packit Service c5cf8c
                                         void *v_paramp),
Packit Service c5cf8c
                        int (*blkidxfn) (DLOOP_Offset * blocks_p,
Packit Service c5cf8c
                                         DLOOP_Count count,
Packit Service c5cf8c
                                         DLOOP_Count blklen,
Packit Service c5cf8c
                                         DLOOP_Offset * offsetarray,
Packit Service c5cf8c
                                         DLOOP_Type el_type,
Packit Service c5cf8c
                                         DLOOP_Offset rel_off,
Packit Service c5cf8c
                                         DLOOP_Buffer bufp,
Packit Service c5cf8c
                                         void *v_paramp),
Packit Service c5cf8c
                        int (*indexfn) (DLOOP_Offset * blocks_p,
Packit Service c5cf8c
                                        DLOOP_Count count,
Packit Service c5cf8c
                                        DLOOP_Count * blockarray,
Packit Service c5cf8c
                                        DLOOP_Offset * offsetarray,
Packit Service c5cf8c
                                        DLOOP_Type el_type,
Packit Service c5cf8c
                                        DLOOP_Offset rel_off,
Packit Service c5cf8c
                                        DLOOP_Buffer bufp,
Packit Service c5cf8c
                                        void *v_paramp),
Packit Service c5cf8c
                        DLOOP_Offset(*sizefn) (DLOOP_Type el_type), void *pieceparams);
Packit Service c5cf8c
Packit Service c5cf8c
/* Common segment operations (segment_ops.c) */
Packit Service c5cf8c
void MPIR_Segment_count_contig_blocks(DLOOP_Segment * segp,
Packit Service c5cf8c
                                      DLOOP_Offset first,
Packit Service c5cf8c
                                      DLOOP_Offset * lastp, DLOOP_Count * countp);
Packit Service c5cf8c
void MPIR_Segment_mpi_flatten(DLOOP_Segment * segp,
Packit Service c5cf8c
                              DLOOP_Offset first,
Packit Service c5cf8c
                              DLOOP_Offset * lastp,
Packit Service c5cf8c
                              DLOOP_Size * blklens, MPI_Aint * disps, DLOOP_Size * lengthp);
Packit Service c5cf8c
Packit Service c5cf8c
#define DLOOP_M2M_TO_USERBUF   0
Packit Service c5cf8c
#define DLOOP_M2M_FROM_USERBUF 1
Packit Service c5cf8c
Packit Service c5cf8c
struct MPIR_m2m_params {
Packit Service c5cf8c
    int direction;              /* M2M_TO_USERBUF or M2M_FROM_USERBUF */
Packit Service c5cf8c
    char *streambuf;
Packit Service c5cf8c
    char *userbuf;
Packit Service c5cf8c
};
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Segment_pack(struct DLOOP_Segment *segp,
Packit Service c5cf8c
                       DLOOP_Offset first, DLOOP_Offset * lastp, void *streambuf);
Packit Service c5cf8c
void MPIR_Segment_unpack(struct DLOOP_Segment *segp,
Packit Service c5cf8c
                         DLOOP_Offset first, DLOOP_Offset * lastp, void *streambuf);
Packit Service c5cf8c
Packit Service c5cf8c
/* Segment piece functions that are used in specific cases elsewhere */
Packit Service c5cf8c
int MPIR_Segment_contig_m2m(DLOOP_Offset * blocks_p, DLOOP_Type el_type, DLOOP_Offset rel_off, void *bufp,      /* unused */
Packit Service c5cf8c
                            void *v_paramp);
Packit Service c5cf8c
int MPIR_Segment_vector_m2m(DLOOP_Offset * blocks_p, DLOOP_Count count, /* unused */
Packit Service c5cf8c
                            DLOOP_Count blksz, DLOOP_Offset stride, DLOOP_Type el_type, DLOOP_Offset rel_off, void *bufp,       /* unused */
Packit Service c5cf8c
                            void *v_paramp);
Packit Service c5cf8c
int MPIR_Segment_blkidx_m2m(DLOOP_Offset * blocks_p, DLOOP_Count count, DLOOP_Count blocklen, DLOOP_Offset * offsetarray, DLOOP_Type el_type, DLOOP_Offset rel_off, void *bufp, /*unused */
Packit Service c5cf8c
                            void *v_paramp);
Packit Service c5cf8c
int MPIR_Segment_index_m2m(DLOOP_Offset * blocks_p, DLOOP_Count count, DLOOP_Count * blockarray, DLOOP_Offset * offsetarray, DLOOP_Type el_type, DLOOP_Offset rel_off, void *bufp,      /*unused */
Packit Service c5cf8c
                           void *v_paramp);
Packit Service c5cf8c
Packit Service c5cf8c
/* Dataloop construction functions */
Packit Service c5cf8c
void MPIR_Dataloop_create(MPI_Datatype type,
Packit Service c5cf8c
                          DLOOP_Dataloop ** dlp_p, DLOOP_Size * dlsz_p, int *dldepth_p, int flag);
Packit Service c5cf8c
int MPIR_Dataloop_create_contiguous(DLOOP_Count count,
Packit Service c5cf8c
                                    MPI_Datatype oldtype,
Packit Service c5cf8c
                                    DLOOP_Dataloop ** dlp_p,
Packit Service c5cf8c
                                    DLOOP_Size * dlsz_p, int *dldepth_p, int flag);
Packit Service c5cf8c
int MPIR_Dataloop_create_vector(DLOOP_Count count,
Packit Service c5cf8c
                                DLOOP_Size blocklength,
Packit Service c5cf8c
                                MPI_Aint stride,
Packit Service c5cf8c
                                int strideinbytes,
Packit Service c5cf8c
                                MPI_Datatype oldtype,
Packit Service c5cf8c
                                DLOOP_Dataloop ** dlp_p,
Packit Service c5cf8c
                                DLOOP_Size * dlsz_p, int *dldepth_p, int flag);
Packit Service c5cf8c
int MPIR_Dataloop_create_blockindexed(DLOOP_Count count,
Packit Service c5cf8c
                                      DLOOP_Size blklen,
Packit Service c5cf8c
                                      const void *disp_array,
Packit Service c5cf8c
                                      int dispinbytes,
Packit Service c5cf8c
                                      MPI_Datatype oldtype,
Packit Service c5cf8c
                                      DLOOP_Dataloop ** dlp_p,
Packit Service c5cf8c
                                      DLOOP_Size * dlsz_p, int *dldepth_p, int flag);
Packit Service c5cf8c
/* we bump up the size of the blocklength array because create_struct might use
Packit Service c5cf8c
 * create_indexed in an optimization, and in course of doing so, generate a
Packit Service c5cf8c
 * request of a large blocklength. */
Packit Service c5cf8c
int MPIR_Dataloop_create_indexed(DLOOP_Count count,
Packit Service c5cf8c
                                 const DLOOP_Size * blocklength_array,
Packit Service c5cf8c
                                 const void *displacement_array,
Packit Service c5cf8c
                                 int dispinbytes,
Packit Service c5cf8c
                                 MPI_Datatype oldtype,
Packit Service c5cf8c
                                 DLOOP_Dataloop ** dlp_p,
Packit Service c5cf8c
                                 DLOOP_Size * dlsz_p, int *dldepth_p, int flag);
Packit Service c5cf8c
int MPIR_Dataloop_create_struct(DLOOP_Count count,
Packit Service c5cf8c
                                const int *blklen_array,
Packit Service c5cf8c
                                const MPI_Aint * disp_array,
Packit Service c5cf8c
                                const MPI_Datatype * oldtype_array,
Packit Service c5cf8c
                                DLOOP_Dataloop ** dlp_p,
Packit Service c5cf8c
                                DLOOP_Size * dlsz_p, int *dldepth_p, int flag);
Packit Service c5cf8c
int MPIR_Dataloop_create_pairtype(MPI_Datatype type,
Packit Service c5cf8c
                                  DLOOP_Dataloop ** dlp_p,
Packit Service c5cf8c
                                  DLOOP_Size * dlsz_p, int *dldepth_p, int flag);
Packit Service c5cf8c
Packit Service c5cf8c
/* Helper functions for dataloop construction */
Packit Service c5cf8c
int MPIR_Type_convert_subarray(int ndims,
Packit Service c5cf8c
                               int *array_of_sizes,
Packit Service c5cf8c
                               int *array_of_subsizes,
Packit Service c5cf8c
                               int *array_of_starts,
Packit Service c5cf8c
                               int order, MPI_Datatype oldtype, MPI_Datatype * newtype);
Packit Service c5cf8c
int MPIR_Type_convert_darray(int size,
Packit Service c5cf8c
                             int rank,
Packit Service c5cf8c
                             int ndims,
Packit Service c5cf8c
                             int *array_of_gsizes,
Packit Service c5cf8c
                             int *array_of_distribs,
Packit Service c5cf8c
                             int *array_of_dargs,
Packit Service c5cf8c
                             int *array_of_psizes,
Packit Service c5cf8c
                             int order, MPI_Datatype oldtype, MPI_Datatype * newtype);
Packit Service c5cf8c
Packit Service c5cf8c
DLOOP_Count MPIR_Type_indexed_count_contig(DLOOP_Count count,
Packit Service c5cf8c
                                           const DLOOP_Count * blocklength_array,
Packit Service c5cf8c
                                           const void *displacement_array,
Packit Service c5cf8c
                                           int dispinbytes, DLOOP_Offset old_extent);
Packit Service c5cf8c
Packit Service c5cf8c
DLOOP_Count MPIR_Type_blockindexed_count_contig(DLOOP_Count count,
Packit Service c5cf8c
                                                DLOOP_Count blklen,
Packit Service c5cf8c
                                                const void *disp_array,
Packit Service c5cf8c
                                                int dispinbytes, DLOOP_Offset old_extent);
Packit Service c5cf8c
Packit Service c5cf8c
int MPIR_Type_blockindexed(int count,
Packit Service c5cf8c
                           int blocklength,
Packit Service c5cf8c
                           const void *displacement_array,
Packit Service c5cf8c
                           int dispinbytes, MPI_Datatype oldtype, MPI_Datatype * newtype);
Packit Service c5cf8c
Packit Service c5cf8c
int MPIR_Type_commit(MPI_Datatype * type);
Packit Service c5cf8c
Packit Service c5cf8c
/* Segment functions specific to MPICH */
Packit Service c5cf8c
void MPIR_Segment_pack_vector(struct DLOOP_Segment *segp,
Packit Service c5cf8c
                              DLOOP_Offset first,
Packit Service c5cf8c
                              DLOOP_Offset * lastp, DLOOP_VECTOR * vector, int *lengthp);
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Segment_unpack_vector(struct DLOOP_Segment *segp,
Packit Service c5cf8c
                                DLOOP_Offset first,
Packit Service c5cf8c
                                DLOOP_Offset * lastp, DLOOP_VECTOR * vector, int *lengthp);
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Segment_flatten(struct DLOOP_Segment *segp,
Packit Service c5cf8c
                          DLOOP_Offset first,
Packit Service c5cf8c
                          DLOOP_Offset * lastp,
Packit Service c5cf8c
                          DLOOP_Offset * offp, DLOOP_Size * sizep, DLOOP_Offset * lengthp);
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Segment_pack_external32(struct DLOOP_Segment *segp,
Packit Service c5cf8c
                                  DLOOP_Offset first, DLOOP_Offset * lastp, void *pack_buffer);
Packit Service c5cf8c
Packit Service c5cf8c
void MPIR_Segment_unpack_external32(struct DLOOP_Segment *segp,
Packit Service c5cf8c
                                    DLOOP_Offset first,
Packit Service c5cf8c
                                    DLOOP_Offset * lastp, DLOOP_Buffer unpack_buffer);
Packit Service c5cf8c
Packit Service c5cf8c
/* These values are defined by DLOOP code.
Packit Service c5cf8c
 *
Packit Service c5cf8c
 * Note: DLOOP_DATALOOP_ALL_BYTES is used only when the device
Packit Service c5cf8c
 * defines MPID_NEEDS_DLOOP_ALL_BYTES.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#define MPIR_DATALOOP_DEFAULT       DLOOP_DATALOOP_DEFAULT
Packit Service c5cf8c
#define MPIR_DATALOOP_ALL_BYTES     DLOOP_DATALOOP_ALL_BYTES
Packit Service c5cf8c
Packit Service c5cf8c
DLOOP_Count DLOOP_Stackelm_blocksize(struct DLOOP_Dataloop_stackelm *elmp);
Packit Service c5cf8c
DLOOP_Offset DLOOP_Stackelm_offset(struct DLOOP_Dataloop_stackelm *elmp);
Packit Service c5cf8c
void DLOOP_Stackelm_load(struct DLOOP_Dataloop_stackelm *elmp,
Packit Service c5cf8c
                         struct DLOOP_Dataloop *dlp, int branch_flag);
Packit Service c5cf8c
Packit Service c5cf8c
#endif /* MPIR_DATALOOP_H_INCLUDED */