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

📄 copy_functions.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* * Copyright (c) 2004-2006 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */#include "ompi_config.h"#include "ompi/datatype/datatype.h"#include "ompi/datatype/convertor.h"#include "ompi/datatype/datatype_internal.h"#include "ompi/datatype/datatype_checksum.h"#include "ompi/datatype/convertor_internal.h"/*  * This function is used to copy data from one buffer to another.  The assumption *     is that the number of bytes per element to copy at the source and destination  *     are the same. *   count - number of instances of a given data-type to copy *   from - point to the source buffer *   to - pointer to the destination buffer *   from_len - length of source buffer (in bytes) *   to_len - length of destination buffer (in bytes) *   from_extent - extent of the source data type (in bytes) *   to_extent - extent of the destination data type (in bytes) *    * Return value: Number of elements of type TYPE copied */#define COPY_TYPE( TYPENAME, TYPE, COUNT )                                      \static int copy_##TYPENAME( ompi_convertor_t *pConvertor, uint32_t count,       \                            char* from, size_t from_len, ptrdiff_t from_extent, \                            char* to, size_t to_len, ptrdiff_t to_extent,       \                            ptrdiff_t *advance)                         \{                                                                       \    uint32_t i;                                                         \    size_t remote_TYPE_size = sizeof(TYPE) * (COUNT); /* TODO */        \    size_t local_TYPE_size = (COUNT) * sizeof(TYPE);                    \                                                                        \    /* make sure the remote buffer is large enough to hold the data */  \    if( (remote_TYPE_size * count) > from_len ) {                       \        count = (uint32_t)(from_len / remote_TYPE_size);                \        if( (count * remote_TYPE_size) != from_len ) {                  \            DUMP( "oops should I keep this data somewhere (excedent %d bytes)?\n", \                  from_len - (count * remote_TYPE_size) );              \        }                                                               \        DUMP( "correct: copy %s count %d from buffer %p with length %d to %p space %d\n", \              #TYPE, count, from, from_len, to, to_len );               \    } else                                                              \        DUMP( "         copy %s count %d from buffer %p with length %d to %p space %d\n", \              #TYPE, count, from, from_len, to, to_len );               \                                                                        \    if( (from_extent == (ptrdiff_t)local_TYPE_size) &&                  \        (to_extent == (ptrdiff_t)remote_TYPE_size) ) {                  \        /* copy of contigous data at both source and destination */     \        MEMCPY( to, from, count * local_TYPE_size );                    \    } else {                                                            \        /* source or destination are non-contigous */                   \        for( i = 0; i < count; i++ ) {                                  \            MEMCPY( to, from, local_TYPE_size );                        \            to += to_extent;                                            \            from += from_extent;                                        \        }                                                               \    }                                                                   \    *advance = count * from_extent;                                     \    return count;                                                       \}/*  * This function is used to copy data from one buffer to another.  The assumption *     is that the number of bytes per element to copy at the source and destination  *     are the same. *   count - number of instances of a given data-type to copy *   from - point to the source buffer *   to - pointer to the destination buffer *   from_len - length of source buffer (in bytes) *   to_len - length of destination buffer (in bytes) *   from_extent - extent of the source data type (in bytes) *   to_extent - extent of the destination data type (in bytes) *    * Return value: Number of elements of type TYPE copied */#define COPY_CONTIGUOUS_BYTES( TYPENAME, COUNT )                                          \static int copy_##TYPENAME##_##COUNT( ompi_convertor_t *pConvertor, uint32_t count,       \                                      char* from, size_t from_len, ptrdiff_t from_extent, \                                      char* to, size_t to_len, ptrdiff_t to_extent,       \                                      ptrdiff_t *advance )              \{                                                                       \    uint32_t i;                                                         \    size_t remote_TYPE_size = (size_t)(COUNT); /* TODO */               \    size_t local_TYPE_size = (size_t)(COUNT);                           \                                                                        \    if( (remote_TYPE_size * count) > from_len ) {                       \        count = (uint32_t)(from_len / remote_TYPE_size);                \        if( (count * remote_TYPE_size) != from_len ) {                  \            DUMP( "oops should I keep this data somewhere (excedent %d bytes)?\n", \                  from_len - (count * remote_TYPE_size) );              \        }                                                               \        DUMP( "correct: copy %s count %d from buffer %p with length %d to %p space %d\n", \              #TYPENAME, count, from, from_len, to, to_len );           \    } else                                                              \        DUMP( "         copy %s count %d from buffer %p with length %d to %p space %d\n", \              #TYPENAME, count, from, from_len, to, to_len );           \                                                                        \    if( (from_extent == (ptrdiff_t)local_TYPE_size) &&                  \        (to_extent == (ptrdiff_t)remote_TYPE_size) ) {                  \        MEMCPY( to, from, count * local_TYPE_size );                    \    } else {                                                            \        for( i = 0; i < count; i++ ) {                                  \            MEMCPY( to, from, local_TYPE_size );                        \            to += to_extent;                                            \            from += from_extent;                                        \        }                                                               \    }                                                                   \    *advance = count * from_extent;                                     \    return count;                                                       \}/* set up copy functions for the basic C MPI data types */COPY_TYPE( char, char, 1 )COPY_TYPE( short, short, 1 )COPY_TYPE( int, int, 1 )COPY_TYPE( float, float, 1 )COPY_TYPE( long, long, 1 )COPY_TYPE( double, double, 1 )COPY_TYPE( long_long, long long, 1 )COPY_TYPE( long_double, long double, 1 )COPY_TYPE( complex_float, ompi_complex_float_t, 1 )COPY_TYPE( complex_double, ompi_complex_double_t, 1 )COPY_TYPE( complex_long_double, ompi_complex_long_double_t, 1 )COPY_TYPE( wchar, wchar_t, 1 )COPY_TYPE( 2int, int, 2 )COPY_TYPE( 2float, float, 2 )COPY_TYPE( 2double, double, 2 )COPY_TYPE( 2complex_float, ompi_complex_float_t, 2 )COPY_TYPE( 2complex_double, ompi_complex_double_t, 2 )#if OMPI_SIZEOF_FORTRAN_LOGICAL == 1 || SIZEOF_BOOL == 1#define REQUIRE_COPY_BYTES_1 1#else#define REQUIRE_COPY_BYTES_1 0#endif#if OMPI_SIZEOF_FORTRAN_LOGICAL == 2 || SIZEOF_BOOL == 2#define REQUIRE_COPY_BYTES_2 1#else#define REQUIRE_COPY_BYTES_2 0#endif#if OMPI_SIZEOF_FORTRAN_LOGICAL == 4 || SIZEOF_BOOL == 4#define REQUIRE_COPY_BYTES_4 1#else#define REQUIRE_COPY_BYTES_4 0#endif#if (SIZEOF_FLOAT + SIZEOF_INT) == 8 || (SIZEOF_LONG + SIZEOF_INT) == 8 || SIZEOF_BOOL == 8#define REQUIRE_COPY_BYTES_8 1#else#define REQUIRE_COPY_BYTES_8 0#endif#if (SIZEOF_DOUBLE + SIZEOF_INT) == 12 || (SIZEOF_LONG + SIZEOF_INT) == 12#define REQUIRE_COPY_BYTES_12 1#else#define REQUIRE_COPY_BYTES_12 0#endif#if (SIZEOF_LONG_DOUBLE + SIZEOF_INT) == 16#define REQUIRE_COPY_BYTES_16 1#else#define REQUIRE_COPY_BYTES_16 0#endif#if (SIZEOF_LONG_DOUBLE + SIZEOF_INT) == 20#define REQUIRE_COPY_BYTES_20 1#else#define REQUIRE_COPY_BYTES_20 0#endif#if REQUIRE_COPY_BYTES_1COPY_CONTIGUOUS_BYTES( bytes, 1 )#endif  /* REQUIRE_COPY_BYTES_1 */#if REQUIRE_COPY_BYTES_2COPY_CONTIGUOUS_BYTES( bytes, 2 )#endif  /* REQUIRE_COPY_BYTES_2 */#if REQUIRE_COPY_BYTES_4COPY_CONTIGUOUS_BYTES( bytes, 4 )#endif  /* REQUIRE_COPY_BYTES_4 */#if REQUIRE_COPY_BYTES_8COPY_CONTIGUOUS_BYTES( bytes, 8 )#endif  /* REQUIRE_COPY_BYTES_8 */#if REQUIRE_COPY_BYTES_12COPY_CONTIGUOUS_BYTES( bytes, 12 )#endif  /* REQUIRE_COPY_BYTES_12 */#if REQUIRE_COPY_BYTES_16COPY_CONTIGUOUS_BYTES( bytes, 16 )#endif  /* REQUIRE_COPY_BYTES_16 */#if REQUIRE_COPY_BYTES_20COPY_CONTIGUOUS_BYTES( bytes, 20 )#endif  /* REQUIRE_COPY_BYTES_20 *//* table of predefined copy functions - one for each MPI type */conversion_fct_t ompi_ddt_copy_functions[DT_MAX_PREDEFINED] = {   (conversion_fct_t)NULL,                      /* DT_LOOP                */   (conversion_fct_t)NULL,                      /* DT_END_LOOP            */   (conversion_fct_t)NULL,                      /* DT_LB                  */   (conversion_fct_t)NULL,                      /* DT_UB                  */   (conversion_fct_t)copy_char,                 /* DT_CHAR                */   (conversion_fct_t)copy_char,                 /* DT_CHARACTER           */   (conversion_fct_t)copy_char,                 /* DT_UNSIGNED_CHAR       */   (conversion_fct_t)copy_char,                 /* DT_SIGNED_CHAR       */   (conversion_fct_t)copy_char,                 /* DT_BYTE                */   (conversion_fct_t)copy_short,                /* DT_SHORT               */   (conversion_fct_t)copy_short,                /* DT_UNSIGNED_SHORT      */   (conversion_fct_t)copy_int,                  /* DT_INT                 */   (conversion_fct_t)copy_int,                  /* DT_UNSIGNED_INT        */   (conversion_fct_t)copy_long,                 /* DT_LONG                */   (conversion_fct_t)copy_long,                 /* DT_UNSIGNED_LONG       */   (conversion_fct_t)copy_long_long,            /* DT_LONG_LONG_INT       */   (conversion_fct_t)copy_long_long,            /* DT_UNSIGNED_LONG_LONG  */   (conversion_fct_t)copy_float,                /* DT_FLOAT               */   (conversion_fct_t)copy_double,               /* DT_DOUBLE              */   (conversion_fct_t)copy_long_double,          /* DT_LONG_DOUBLE         */   (conversion_fct_t)NULL,                      /* DT_PACKED              */   (conversion_fct_t)copy_wchar,                /* DT_WCHAR               */#if SIZEOF_BOOL == 1   (conversion_fct_t)copy_bytes_1,              /* DT_CXX_BOOL            */#elif SIZEOF_BOOL == 4   (conversion_fct_t)copy_bytes_4,              /* DT_CXX_BOOL            */#elif SIZEOF_BOOL == 8   (conversion_fct_t)copy_bytes_8,              /* DT_CXX_BOOL            */#else#error Complete me please#endif#if OMPI_SIZEOF_FORTRAN_LOGICAL == 1   (conversion_fct_t)copy_bytes_1,              /* DT_LOGIC               */#elif OMPI_SIZEOF_FORTRAN_LOGICAL == 4   (conversion_fct_t)copy_bytes_4,              /* DT_LOGIC               */#elif 1 /* always, some compiler complain if there is not value */   NULL,                                        /* DT_LOGIC               */#endif   (conversion_fct_t)copy_int,                  /* DT_INTEGER             */   (conversion_fct_t)copy_float,                /* DT_REAL                */   (conversion_fct_t)copy_double,               /* DT_DBLPREC             */   (conversion_fct_t)copy_complex_float,        /* DT_COMPLEX_FLOAT       */   (conversion_fct_t)copy_complex_double,       /* DT_COMPLEX_DOUBLE      */   (conversion_fct_t)copy_complex_long_double,  /* DT_COMPLEX_LONG_DOUBLE */   (conversion_fct_t)copy_2int,                 /* DT_2INT                */   (conversion_fct_t)copy_2int,                 /* DT_2INTEGER            */   (conversion_fct_t)copy_2float,               /* DT_2REAL               */   (conversion_fct_t)copy_2double,              /* DT_2DBLPREC            */   (conversion_fct_t)copy_2complex_float,       /* DT_2COMPLEX            */   (conversion_fct_t)copy_2complex_double,      /* DT_2DOUBLE_COMPLEX     */#if (SIZEOF_FLOAT + SIZEOF_INT) == 8   (conversion_fct_t)copy_bytes_8,              /* DT_FLOAT_INT           */#else#error Complete me please#endif#if (SIZEOF_DOUBLE + SIZEOF_INT) == 12   (conversion_fct_t)copy_bytes_12,             /* DT_DOUBLE_INT          */#else#error Complete me please#endif#if (SIZEOF_LONG_DOUBLE + SIZEOF_INT) == 12   (conversion_fct_t)copy_bytes_12,             /* DT_LONG_DOUBLE_INT     */#elif (SIZEOF_LONG_DOUBLE + SIZEOF_INT) == 16   (conversion_fct_t)copy_bytes_16,             /* DT_LONG_DOUBLE_INT     */#elif (SIZEOF_LONG_DOUBLE + SIZEOF_INT) == 20   (conversion_fct_t)copy_bytes_20,             /* DT_LONG_DOUBLE_INT     */#else#error Complete me please#endif#if (SIZEOF_LONG + SIZEOF_INT) == 8   (conversion_fct_t)copy_bytes_8,              /* DT_LONG_INT            */#elif (SIZEOF_LONG + SIZEOF_INT) == 12   (conversion_fct_t)copy_bytes_12,             /* DT_LONG_INT            */#else#error Complete me please#endif   (conversion_fct_t)NULL,                      /* DT_SHORT_INT           */   (conversion_fct_t)NULL,                      /* DT_UNAVAILABLE         */};

⌨️ 快捷键说明

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