⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datatype_internal.h

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 H
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2006 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2006 High Performance Computing Center Stuttgart, *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */#ifndef DATATYPE_INTERNAL_H_HAS_BEEN_INCLUDED#define DATATYPE_INTERNAL_H_HAS_BEEN_INCLUDED#include "opal/util/output.h"extern int ompi_ddt_dfd;#if defined(VERBOSE)#  define DDT_DUMP_STACK( PSTACK, STACK_POS, PDESC, NAME ) \     ompi_ddt_dump_stack( (PSTACK), (STACK_POS), (PDESC), (NAME) )#  if defined(ACCEPT_C99)#    define DUMP( ARGS... )          opal_output(ompi_ddt_dfd, __VA_ARGS__)#  else#    if defined(__GNUC__) && !defined(__STDC__)#      define DUMP(ARGS...)          opal_output( ompi_ddt_dfd, ARGS)#  elsestatic inline void DUMP( char* fmt, ... ){   va_list list;   va_start( list, fmt );   opal_output( ompi_ddt_dfd, fmt, list );   va_end( list );}#      define DUMP                   printf#    endif  /* __GNUC__ && !__STDC__ */#  endif  /* ACCEPT_C99 */#else#  define DDT_DUMP_STACK( PSTACK, STACK_POS, PDESC, NAME )#  if defined(ACCEPT_C99)#    define DUMP(ARGS...)#  else#    if defined(__GNUC__) && !defined(__STDC__)#      define DUMP(ARGS...)#    else       static inline void DUMP( char* fmt, ...) { #if defined(__PGI)           /* Some compilers complain if we have ... and no              corresponding va_start() */           va_list arglist;           va_start(arglist, fmt);           va_end(arglist);#endif       }#    endif  /* __GNUC__ && !__STDC__ */#  endif  /* ACCEPT_C99 */#endif  /* VERBOSE *//* There 3 types of predefined data types.  * - the basic one composed by just one basic datatype which are definitively contiguous * - the derived ones where the same basic type is used multiple times. They should be most *   of the time contiguous. * - and finally the derived one where multiple basic types are used. Depending on the architecture *   they can be contiguous or not. * * At this level we do not care from which language the datatype came from (C, C++ or FORTRAN), * we only focus on their internal representation in the host memory. */#define DT_LOOP                    0x00#define DT_END_LOOP                0x01#define DT_LB                      0x02#define DT_UB                      0x03#define DT_CHAR                    0x04#define DT_CHARACTER               0x05#define DT_UNSIGNED_CHAR           0x06#define DT_SIGNED_CHAR             0x07#define DT_BYTE                    0x08#define DT_SHORT                   0x09#define DT_UNSIGNED_SHORT          0x0A#define DT_INT                     0x0B#define DT_UNSIGNED_INT            0x0C#define DT_LONG                    0x0D#define DT_UNSIGNED_LONG           0x0E#define DT_LONG_LONG_INT           0x0F#define DT_UNSIGNED_LONG_LONG      0x10#define DT_FLOAT                   0x11#define DT_DOUBLE                  0x12#define DT_LONG_DOUBLE             0x13#define DT_PACKED                  0x14#define DT_WCHAR                   0x15#define DT_CXX_BOOL                0x16#define DT_LOGIC                   0x17#define DT_INTEGER                 0x18#define DT_REAL                    0x19#define DT_DBLPREC                 0x1A/* * This is not a datatype. It contain the number of basic datatypes. */#define DT_MAX_BASIC               0x1B/* * Derived datatypes supposely contiguous */#define DT_COMPLEX_FLOAT           0x1B#define DT_COMPLEX_DOUBLE          0x1C#define DT_COMPLEX_LONG_DOUBLE     0x1D#define DT_2INT                    0x1E#define DT_2INTEGER                0x1F#define DT_2REAL                   0x20#define DT_2DBLPREC                0x21#define DT_2COMPLEX                0x22#define DT_2DOUBLE_COMPLEX         0x23/* * Derived datatypes which will definitively be non contiguous on some architectures. */#define DT_FLOAT_INT               0x24#define DT_DOUBLE_INT              0x25#define DT_LONG_DOUBLE_INT         0x26#define DT_LONG_INT                0x27#define DT_SHORT_INT               0x28#define DT_UNAVAILABLE             0x29/* If the number of basic datatype should change update * DT_MAX_PREDEFINED in datatype.h */#if DT_MAX_PREDEFINED <= DT_UNAVAILABLE#error DT_MAX_PREDEFINED should be updated to the next value after the DT_UNAVAILABLE define#endif  /* safe check for max predefined datatypes. */#define DT_INCREASE_STACK     8#if defined(c_plusplus) || defined(__cplusplus)extern "C" {#endifstruct ddt_elem_id_description {    uint16_t   flags;  /**< flags for the record */    uint16_t   type;   /**< the basic data type id */};typedef struct ddt_elem_id_description ddt_elem_id_description;/* the basic element. A data description is composed * by a set of basic elements. */struct ddt_elem_desc {    ddt_elem_id_description common;   /**< basic data description and flags */    uint32_t                count;    /**< number of blocks */    uint32_t                blocklen; /**< number of elements on each block */    ptrdiff_t               extent;   /**< extent of each block (in bytes) */    ptrdiff_t               disp;     /**< displacement of the first block */};typedef struct ddt_elem_desc ddt_elem_desc_t;struct ddt_loop_desc {    ddt_elem_id_description common; /**< basic data description and flags */    uint32_t                loops;  /**< number of elements */    uint32_t                items;  /**< number of items in the loop */    size_t                  unused; /**< not used right now */    ptrdiff_t               extent; /**< extent of the whole loop */};typedef struct ddt_loop_desc ddt_loop_desc_t;struct ddt_endloop_desc {    ddt_elem_id_description common;           /**< basic data description and flags */    uint32_t                items;            /**< number of elements */    uint32_t                unused;           /**< not used right now */    size_t                  size;             /**< real size of the data in the loop */    ptrdiff_t               first_elem_disp;  /**< the displacement of the first block in the loop */};typedef struct ddt_endloop_desc ddt_endloop_desc_t;union dt_elem_desc {    ddt_elem_desc_t    elem;    ddt_loop_desc_t    loop;    ddt_endloop_desc_t end_loop;};#define CREATE_LOOP_START( _place, _count, _items, _extent, _flags ) \    do {                                                             \        (_place)->loop.common.type   = DT_LOOP;                      \        (_place)->loop.common.flags  = (_flags) & ~DT_FLAG_DATA;     \        (_place)->loop.loops         = (_count);                     \        (_place)->loop.items         = (_items);                     \        (_place)->loop.extent        = (_extent);                    \        (_place)->loop.unused        = -1;                           \    } while(0)#define CREATE_LOOP_END( _place, _items, _first_item_disp, _size, _flags ) \    do {                                                                   \        (_place)->end_loop.common.type = DT_END_LOOP;                      \        (_place)->end_loop.common.flags = (_flags) & ~DT_FLAG_DATA;        \        (_place)->end_loop.items = (_items);                               \        (_place)->end_loop.first_elem_disp = (_first_item_disp);           \        (_place)->end_loop.size = (_size);  /* the size inside the loop */ \        (_place)->end_loop.unused = -1;                                    \    } while(0)#define CREATE_ELEM( _place, _type, _flags, _count, _disp, _extent )    \    do {                                                                \        (_place)->elem.common.flags = (_flags) | DT_FLAG_DATA_C | DT_FLAG_DATA; \        (_place)->elem.common.type  = (_type);                          \        (_place)->elem.count        = (_count);                         \        (_place)->elem.disp         = (_disp);                          \        (_place)->elem.extent       = (_extent);                        \        (_place)->elem.blocklen     = 1;                                \    } while(0)typedef struct {    float r;    float i;} ompi_complex_float_t;typedef struct {    double r;    double i;} ompi_complex_double_t;typedef struct {    long double r;    long double i;} ompi_complex_long_double_t;extern const ompi_datatype_t* ompi_ddt_basicDatatypes[DT_MAX_PREDEFINED];#define BASIC_DDT_FROM_ELEM( ELEM ) (ompi_ddt_basicDatatypes[(ELEM).elem.common.type])int32_t ompi_ddt_default_convertors_init( void );int32_t ompi_ddt_default_convertors_fini( void );#define SAVE_STACK( PSTACK, INDEX, TYPE, COUNT, DISP) \do { \   (PSTACK)->index    = (INDEX); \   (PSTACK)->type     = (TYPE); \   (PSTACK)->count    = (COUNT); \   (PSTACK)->disp     = (DISP); \} while(0)#define PUSH_STACK( PSTACK, STACK_POS, INDEX, TYPE, COUNT, DISP) \do { \   dt_stack_t* pTempStack = (PSTACK) + 1; \   SAVE_STACK( pTempStack, (INDEX), (TYPE), (COUNT), (DISP) );  \   (STACK_POS)++; \   (PSTACK) = pTempStack; \} while(0)#if OMPI_ENABLE_DEBUGOMPI_DECLSPEC int ompi_ddt_safeguard_pointer_debug_breakpoint( const void* actual_ptr, int length,                                                               const void* initial_ptr,                                                               const ompi_datatype_t* pData,                                                               int count );#define OMPI_DDT_SAFEGUARD_POINTER( ACTPTR, LENGTH, INITPTR, PDATA, COUNT ) \    {                                                                   \        char *__lower_bound = (char*)(INITPTR), *__upper_bound;         \        assert( ((LENGTH) != 0) && ((COUNT) != 0) );                    \        __lower_bound += (PDATA)->true_lb;                              \        __upper_bound = (INITPTR) + (PDATA)->true_ub +                  \            ((PDATA)->ub - (PDATA)->lb) * ((COUNT) - 1);                \        if( ((ACTPTR) < __lower_bound) || ((ACTPTR) >= __upper_bound) ) { \            ompi_ddt_safeguard_pointer_debug_breakpoint( (ACTPTR), (LENGTH), (INITPTR), (PDATA), (COUNT) ); \            opal_output( 0, "%s:%d\n\tPointer %p size %lu is outside [%p,%p] for\n\tbase ptr %p count %d and data \n", \                         __FILE__, __LINE__, (ACTPTR), (unsigned long)(LENGTH), __lower_bound, __upper_bound, \                         (INITPTR), (COUNT) );                          \            ompi_ddt_dump( (PDATA) );                                   \        }                                                               \    }#else#define OMPI_DDT_SAFEGUARD_POINTER( ACTPTR, LENGTH, INITPTR, PDATA, COUNT )#endif  /* OMPI_ENABLE_DEBUG */static inline int GET_FIRST_NON_LOOP( const dt_elem_desc_t* _pElem ){    int index = 0;    /* We dont have to check for the end as we always put an END_LOOP     * at the end of all datatype descriptions.     */    while( _pElem->elem.common.type == DT_LOOP ) {        ++_pElem; index++;    }    return index;}#define UPDATE_INTERNAL_COUNTERS( DESCRIPTION, POSITION, ELEMENT, COUNTER ) \    do {                                                                \        (ELEMENT) = &((DESCRIPTION)[(POSITION)]);                       \        (COUNTER) = (ELEMENT)->elem.count;                              \    } while (0)OMPI_DECLSPEC int32_t ompi_ddt_print_args( const ompi_datatype_t* pData );#if defined(c_plusplus) || defined(__cplusplus)}#endif#endif  /* DATATYPE_INTERNAL_H_HAS_BEEN_INCLUDED */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -