|
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 */
|