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

📄 datatype.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 (c) 2007      Los Alamos National Security, LLC.  All rights *                         reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ *//** * ompi_datatype_t interface for OMPI internal data type representation * * ompi_datatype_t is a class which represents contiguous or * non-contiguous data together with constituent type-related * information. */#ifndef DATATYPE_H_HAS_BEEN_INCLUDED#define DATATYPE_H_HAS_BEEN_INCLUDED#include "ompi_config.h"#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>#endif#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <stddef.h>#include <string.h>#include "ompi/constants.h"#include "opal/class/opal_object.h"#include "opal/class/opal_hash_table.h"#include "ompi/class/ompi_pointer_array.h"#include "mpi.h"#if defined(c_plusplus) || defined(__cplusplus)extern "C" {#endifextern ompi_pointer_array_t *ompi_datatype_f_to_c_table;/* if there are more basic datatypes than the number of bytes in the int type * the bdt_used field of the data description struct should be changed to long. */#define DT_MAX_PREDEFINED  0x2A/* flags for the datatypes. */#define DT_FLAG_DESTROYED     0x0001  /**< user destroyed but some other layers still have a reference */#define DT_FLAG_COMMITED      0x0002  /**< ready to be used for a send/recv operation */#define DT_FLAG_CONTIGUOUS    0x0004  /**< contiguous datatype */#define DT_FLAG_OVERLAP       0x0008  /**< datatype is unpropper for a recv operation */#define DT_FLAG_USER_LB       0x0010  /**< has a user defined LB */#define DT_FLAG_USER_UB       0x0020  /**< has a user defined UB */#define DT_FLAG_PREDEFINED    0x0040  /**< cannot be removed: initial and predefined datatypes */#define DT_FLAG_NO_GAPS       0x0080  /**< no gaps around the datatype */#define DT_FLAG_DATA          0x0100  /**< data or control structure */#define DT_FLAG_ONE_SIDED     0x0200  /**< datatype can be used for one sided operations */#define DT_FLAG_UNAVAILABLE   0x0400  /**< datatypes unavailable on the build (OS or compiler dependant) */#define DT_FLAG_VECTOR        0x0800  /**< valid only for loops. The loop contain only one element                                       **< without extent. It correspond to the vector type. *//* Keep trace of the type of the predefined datatypes */#define DT_FLAG_DATA_INT      0x1000#define DT_FLAG_DATA_FLOAT    0x2000#define DT_FLAG_DATA_COMPLEX  0x3000#define DT_FLAG_DATA_TYPE     0x3000/* In which language the datatype is intended for to be used */#define DT_FLAG_DATA_C        0x4000#define DT_FLAG_DATA_CPP      0x8000#define DT_FLAG_DATA_FORTRAN  0xC000#define DT_FLAG_DATA_LANGUAGE 0xC000/*  * We should make the difference here between the predefined contiguous and non contiguous * datatypes. The DT_FLAG_BASIC is held by all predefined contiguous datatypes. */#define DT_FLAG_BASIC         (DT_FLAG_PREDEFINED | DT_FLAG_CONTIGUOUS | DT_FLAG_NO_GAPS | DT_FLAG_DATA | DT_FLAG_COMMITED)typedef union dt_elem_desc dt_elem_desc_t;typedef struct dt_type_desc {    uint32_t          length;  /* the maximum number of elements in the description array */    uint32_t          used;    /* the number of used elements in the description array */    dt_elem_desc_t*   desc;} dt_type_desc_t;/* the data description. */typedef struct ompi_datatype_t {    opal_object_t      super;    /**< basic superclass */    size_t             size;     /**< total size in bytes of the memory used by the data if                                  * the data is put on a contiguous buffer */    uint32_t           align;    /**< data should be aligned to */    ptrdiff_t          true_lb;    ptrdiff_t          true_ub;  /**< the true ub of the data without user defined lb and ub */    ptrdiff_t          lb;       /**< lower bound in memory */    ptrdiff_t          ub;       /**< upper bound in memory */    uint16_t           flags;    /**< the flags */    uint16_t           id;       /**< data id, normally the index in the data array. */    uint32_t           nbElems;  /**< total number of elements inside the datatype */    uint64_t           bdt_used; /**< which basic datatypes are used in the data description */    /* Attribute fields */    opal_hash_table_t *d_keyhash;    int32_t            d_f_to_c_index;    char               name[MPI_MAX_OBJECT_NAME];    dt_type_desc_t     desc;     /**< the data description */    dt_type_desc_t     opt_desc; /**< short description of the data used when conversion is useless                                  * or in the send case (without conversion) */    void*              args;     /**< data description for the user */    void*              packed_description;  /**< the packed description of the datatype */    /* basic elements count used to compute the size of the datatype for     * remote nodes */    uint32_t           btypes[DT_MAX_PREDEFINED];} ompi_datatype_t;OMPI_DECLSPEC OBJ_CLASS_DECLARATION( ompi_datatype_t );int ompi_ddt_register_params(void);int32_t ompi_ddt_init( void );int32_t ompi_ddt_finalize( void );ompi_datatype_t* ompi_ddt_create( int32_t expectedSize );int32_t ompi_ddt_commit( ompi_datatype_t** );int32_t ompi_ddt_destroy( ompi_datatype_t** );static inline int32_t ompi_ddt_is_committed( const ompi_datatype_t* type ){ return ((type->flags & DT_FLAG_COMMITED) == DT_FLAG_COMMITED); }static inline int32_t ompi_ddt_is_overlapped( const ompi_datatype_t* type ){ return ((type->flags & DT_FLAG_OVERLAP) == DT_FLAG_OVERLAP); }static inline int32_t ompi_ddt_is_acceptable_for_one_sided( const ompi_datatype_t* type ){ return true; }static inline int32_t ompi_ddt_is_valid( const ompi_datatype_t* type ){ return !((type->flags & DT_FLAG_UNAVAILABLE) == DT_FLAG_UNAVAILABLE); }static inline int32_t ompi_ddt_is_predefined( const ompi_datatype_t* type ){ return (type->flags & DT_FLAG_PREDEFINED); }void ompi_ddt_dump( const ompi_datatype_t* pData );/* data creation functions */OMPI_DECLSPEC int32_t ompi_ddt_duplicate( const ompi_datatype_t* oldType, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_contiguous( int count, const ompi_datatype_t* oldType, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_vector( int count, int bLength, int stride,                                              const ompi_datatype_t* oldType, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_hvector( int count, int bLength, MPI_Aint stride,                                               const ompi_datatype_t* oldType, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_indexed( int count, const int* pBlockLength, const int* pDisp,                                               const ompi_datatype_t* oldType, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_hindexed( int count, const int* pBlockLength, const MPI_Aint* pDisp,                                                const ompi_datatype_t* oldType, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_indexed_block( int count, int bLength, const int* pDisp,                                                     const ompi_datatype_t* oldType, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_struct( int count, const int* pBlockLength, const MPI_Aint* pDisp,                                              ompi_datatype_t* const* pTypes, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_create_resized( const ompi_datatype_t* oldType, MPI_Aint lb, MPI_Aint extent, ompi_datatype_t** newType );OMPI_DECLSPEC int32_t ompi_ddt_add( ompi_datatype_t* pdtBase, const ompi_datatype_t* pdtAdd, uint32_t count,                                    ptrdiff_t disp, ptrdiff_t extent );static inline int32_t ompi_ddt_type_lb( const ompi_datatype_t* pData, ptrdiff_t* disp ){ *disp = pData->lb; return 0; }static inline int32_t ompi_ddt_type_ub( const ompi_datatype_t* pData, ptrdiff_t* disp ){ *disp = pData->ub; return 0; }static inline int32_t ompi_ddt_type_size ( const ompi_datatype_t* pData, size_t *size ){ *size = pData->size; return 0; }static inline int32_t ompi_ddt_type_extent( const ompi_datatype_t* pData, ptrdiff_t* extent ){ *extent = pData->ub - pData->lb; return 0; }static inline int32_t ompi_ddt_get_extent( const ompi_datatype_t* pData, ptrdiff_t* lb, ptrdiff_t* extent){ *lb = pData->lb; *extent = pData->ub - pData->lb; return 0; }static inline int32_t ompi_ddt_get_true_extent( const ompi_datatype_t* pData, ptrdiff_t* true_lb, ptrdiff_t* true_extent){ *true_lb = pData->true_lb; *true_extent = (pData->true_ub - pData->true_lb); return 0; }/* * This function return true (1) if the datatype representation depending on the count * is contiguous in the memory. And false (0) otherwise. */static inline int32_t ompi_ddt_is_contiguous_memory_layout( const ompi_datatype_t* datatype, int32_t count ){   if( !(datatype->flags & DT_FLAG_CONTIGUOUS) ) return 0;   if( (count == 1) || (datatype->flags & DT_FLAG_NO_GAPS) ) return 1;   assert( (ptrdiff_t)datatype->size != (datatype->ub - datatype->lb) );   return 0;}OMPI_DECLSPEC int32_t ompi_ddt_get_element_count( const ompi_datatype_t* pData, size_t iSize );OMPI_DECLSPEC int32_t ompi_ddt_set_element_count( const ompi_datatype_t* pData, uint32_t count, size_t* length );OMPI_DECLSPEC int32_t ompi_ddt_copy_content_same_ddt( const ompi_datatype_t* pData, int32_t count,                                                      char* pDestBuf, char* pSrcBuf );OMPI_DECLSPEC const ompi_datatype_t* ompi_ddt_match_size( int size, uint16_t datakind, uint16_t datalang );/* * */OMPI_DECLSPEC int32_t ompi_ddt_sndrcv( void *sbuf, int32_t scount, const ompi_datatype_t* sdtype, void *rbuf,                                       int32_t rcount, const ompi_datatype_t* rdtype);/* * */OMPI_DECLSPEC int32_t ompi_ddt_get_args( const ompi_datatype_t* pData, int32_t which,                                         int32_t * ci, int32_t * i,                                         int32_t * ca, MPI_Aint* a,                                         int32_t * cd, ompi_datatype_t** d, int32_t * type);OMPI_DECLSPEC int32_t ompi_ddt_set_args( ompi_datatype_t* pData,                                         int32_t ci, int32_t ** i,                                         int32_t ca, MPI_Aint* a,                                         int32_t cd, ompi_datatype_t** d,int32_t type);OMPI_DECLSPEC int32_t ompi_ddt_copy_args( const ompi_datatype_t* source_data,                                          ompi_datatype_t* dest_data );OMPI_DECLSPEC int32_t ompi_ddt_release_args( ompi_datatype_t* pData );/* * */OMPI_DECLSPEC size_t ompi_ddt_pack_description_length( const ompi_datatype_t* datatype );/* * */OMPI_DECLSPEC int ompi_ddt_get_pack_description( ompi_datatype_t* datatype,                                                 const void** packed_buffer );/* * */struct ompi_proc_t;OMPI_DECLSPEC ompi_datatype_t*ompi_ddt_create_from_packed_description( void** packed_buffer,                                         struct ompi_proc_t* remote_processor );#if defined(c_plusplus) || defined(__cplusplus)}#endif#endif  /* DATATYPE_H_HAS_BEEN_INCLUDED */

⌨️ 快捷键说明

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