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

📄 op.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,  *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ *  * Additional copyrights may follow *  * $HEADER$ */#include "ompi_config.h"#include "ompi/constants.h"#include "ompi/op/op.h"#include "ompi/op/op_predefined.h"#include "ompi/class/ompi_pointer_array.h"#include "ompi/datatype/datatype_internal.h"/* * Table for Fortran <-> C op handle conversion */ompi_pointer_array_t *ompi_op_f_to_c_table;/* * Create intrinsic op */static int add_intrinsic(ompi_op_t *op, int fort_handle);/* * Class information */static void ompi_op_construct(ompi_op_t *eh);static void ompi_op_destruct(ompi_op_t *eh);/* * Class instance */OBJ_CLASS_INSTANCE(ompi_op_t, opal_object_t,                    ompi_op_construct, ompi_op_destruct);/* * Helpful defines, because there's soooo many names! * * **NOTE** These #define's are strictly ordered!  A series of macros * are built up to assemble a list of function names (or NULLs) that * are put into the intrinsict ompi_op_t's in the middle of this * file.  The order of these function names is critical, and must be * the same as the OMPI_OP_TYPE_* enums in op.h (i.e., the enum's * starting with OMPI_OP_TYPE_UNSIGNED_CHAR -- at the time of this writing, * this is op.h:78). *//** C integer ***********************************************************/#ifdef HAVE_LONG_LONG#define C_INTEGER_LONG_LONG(name) \  { ompi_mpi_op_##name##_long_long_int },  /* OMPI_OP_TYPE_LONG_LONG_INT */ \  { ompi_mpi_op_##name##_unsigned_long_long } /* OMPI_OP_TYPE_UNSIGNED_LONG_LONG */#else#define C_INTEGER_LONG_LONG(name) \  { NULL }, /* OMPI_OP_TYPE_LONG_LONG_INT */ \  { NULL }  /* OMPI_OP_TYPE_UNSIGNED_LONG_LONG */#endif#define C_INTEGER(name) \  { ompi_mpi_op_##name##_unsigned_char },  /* OMPI_OP_TYPE_UNSIGNED_CHAR */ \  { ompi_mpi_op_##name##_signed_char },    /* OMPI_OP_TYPE_SIGNED_CHAR */ \  { ompi_mpi_op_##name##_int },            /* OMPI_OP_TYPE_INT */ \  { ompi_mpi_op_##name##_long },           /* OMPI_OP_TYPE_LONG */ \  { ompi_mpi_op_##name##_short },          /* OMPI_OP_TYPE_SHORT */ \  { ompi_mpi_op_##name##_unsigned_short }, /* OMPI_OP_TYPE_UNSIGNED_SHORT */ \  { ompi_mpi_op_##name##_unsigned },       /* OMPI_OP_TYPE_UNSIGNED */ \  { ompi_mpi_op_##name##_unsigned_long },  /* OMPI_OP_TYPE_UNSIGNED_LONG */ \  C_INTEGER_LONG_LONG(name)#define C_INTEGER_NULL \  { NULL }, /* OMPI_OP_TYPE_UNSIGNED_CHAR */ \  { NULL }, /* OMPI_OP_TYPE_SIGNED_CHAR */ \  { NULL }, /* OMPI_OP_TYPE_INT */ \  { NULL }, /* OMPI_OP_TYPE_LONG */ \  { NULL }, /* OMPI_OP_TYPE_SHORT */ \  { NULL }, /* OMPI_OP_TYPE_UNSIGNED_SHORT */ \  { NULL }, /* OMPI_OP_TYPE_UNSIGNED */ \  { NULL }, /* OMPI_OP_TYPE_UNSIGNED_LONG */ \  { NULL }, /* OMPI_OP_TYPE_LONG_LONG_ING */ \  { NULL }  /* OMPI_OP_TYPE_UNSIGNED_LONG_LONG *//** All the Fortran integers ********************************************/#if OMPI_HAVE_FORTRAN_INTEGER#define FORTRAN_INTEGER_PLAIN(name) { ompi_mpi_op_##name##_fortran_integer }#else#define FORTRAN_INTEGER_PLAIN(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_INTEGER1#define FORTRAN_INTEGER1(name) { ompi_mpi_op_##name##_fortran_integer1 }#else#define FORTRAN_INTEGER1(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_INTEGER2#define FORTRAN_INTEGER2(name) { ompi_mpi_op_##name##_fortran_integer2 }#else#define FORTRAN_INTEGER2(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_INTEGER4#define FORTRAN_INTEGER4(name) { ompi_mpi_op_##name##_fortran_integer4 }#else#define FORTRAN_INTEGER4(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_INTEGER8#define FORTRAN_INTEGER8(name) { ompi_mpi_op_##name##_fortran_integer8 }#else#define FORTRAN_INTEGER8(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_INTEGER16#define FORTRAN_INTEGER16(name) { ompi_mpi_op_##name##_fortran_integer16 }#else#define FORTRAN_INTEGER16(name) { NULL }#endif#define FORTRAN_INTEGER(name) \  FORTRAN_INTEGER_PLAIN(name),      /* OMPI_OP_TYPE_INTEGER */ \  FORTRAN_INTEGER1(name),           /* OMPI_OP_TYPE_INTEGER1 */ \  FORTRAN_INTEGER2(name),           /* OMPI_OP_TYPE_INTEGER2 */ \  FORTRAN_INTEGER4(name),           /* OMPI_OP_TYPE_INTEGER4 */ \  FORTRAN_INTEGER8(name),           /* OMPI_OP_TYPE_INTEGER8 */ \  FORTRAN_INTEGER16(name)           /* OMPI_OP_TYPE_INTEGER16 */#define FORTRAN_INTEGER_NULL \  { NULL },  /* OMPI_OP_TYPE_INTEGER */ \  { NULL },  /* OMPI_OP_TYPE_INTEGER1 */ \  { NULL },  /* OMPI_OP_TYPE_INTEGER2 */ \  { NULL },  /* OMPI_OP_TYPE_INTEGER4 */ \  { NULL },  /* OMPI_OP_TYPE_INTEGER8 */ \  { NULL }  /* OMPI_OP_TYPE_INTEGER16 *//** All the Fortran reals ***********************************************/#if OMPI_HAVE_FORTRAN_REAL#define FLOATING_POINT_FORTRAN_REAL_PLAIN(name) { ompi_mpi_op_##name##_fortran_real }#else#define FLOATING_POINT_FORTRAN_REAL_PLAIN(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_REAL4#define FLOATING_POINT_FORTRAN_REAL4(name) { ompi_mpi_op_##name##_fortran_real4 }#else#define FLOATING_POINT_FORTRAN_REAL4(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_REAL8#define FLOATING_POINT_FORTRAN_REAL8(name) { ompi_mpi_op_##name##_fortran_real8 }#else#define FLOATING_POINT_FORTRAN_REAL8(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_REAL16#define FLOATING_POINT_FORTRAN_REAL16(name) { ompi_mpi_op_##name##_fortran_real16 }#else#define FLOATING_POINT_FORTRAN_REAL16(name) { NULL }#endif#define FLOATING_POINT_FORTRAN_REAL(name) \  FLOATING_POINT_FORTRAN_REAL_PLAIN(name),      /* OMPI_OP_TYPE_REAL */ \  FLOATING_POINT_FORTRAN_REAL4(name),           /* OMPI_OP_TYPE_REAL4 */ \  FLOATING_POINT_FORTRAN_REAL8(name),           /* OMPI_OP_TYPE_REAL8 */ \  FLOATING_POINT_FORTRAN_REAL16(name)           /* OMPI_OP_TYPE_REAL16 *//** Fortran double precision ********************************************/#if OMPI_HAVE_FORTRAN_DOUBLE_PRECISION#define FLOATING_POINT_FORTRAN_DOUBLE_PRECISION(name) \    { ompi_mpi_op_##name##_fortran_double_precision }#else#define FLOATING_POINT_FORTRAN_DOUBLE_PRECISION(name) { NULL }#endif/** Floating point, including all the Fortran reals *********************/#define FLOATING_POINT(name) \  { ompi_mpi_op_##name##_float },                    /* OMPI_OP_TYPE_FLOAT */\  { ompi_mpi_op_##name##_double },                   /* OMPI_OP_TYPE_DOUBLE */\  FLOATING_POINT_FORTRAN_REAL(name),                 /* OMPI_OP_TYPE_REAL */ \  FLOATING_POINT_FORTRAN_DOUBLE_PRECISION(name),     /* OMPI_OP_TYPE_DOUBLE_PRECISION */ \  { ompi_mpi_op_##name##_long_double }               /* OMPI_OP_TYPE_LONG_DOUBLE */#define FLOATING_POINT_NULL \  { NULL }, /* OMPI_OP_TYPE_FLOAT */ \  { NULL }, /* OMPI_OP_TYPE_DOUBLE */ \  { NULL }, /* OMPI_OP_TYPE_REAL */ \  { NULL }, /* OMPI_OP_TYPE_REAL4 */ \  { NULL }, /* OMPI_OP_TYPE_REAL8 */ \  { NULL }, /* OMPI_OP_TYPE_REAL16 */ \  { NULL }, /* OMPI_OP_TYPE_DOUBLE_PRECISION */ \  { NULL }  /* OMPI_OP_TYPE_LONG_DOUBLE *//** Fortran logical *****************************************************/#if OMPI_HAVE_FORTRAN_LOGICAL#define FORTRAN_LOGICAL(name) \  { ompi_mpi_op_##name##_fortran_logical }  /* OMPI_OP_TYPE_LOGICAL */#else#define FORTRAN_LOGICAL(name) { NULL }#endif#define LOGICAL(name) \  FORTRAN_LOGICAL(name), \  { ompi_mpi_op_##name##_bool }  /* OMPI_OP_TYPE_BOOL */#define LOGICAL_NULL \  { NULL },  /* OMPI_OP_TYPE_LOGICAL */ \  { NULL }   /* OMPI_OP_TYPE_BOOL *//** Fortran complex *****************************************************/#if OMPI_HAVE_FORTRAN_REAL && OMPI_HAVE_FORTRAN_COMPLEX#define COMPLEX_PLAIN(name) { ompi_mpi_op_##name##_fortran_complex }#else#define COMPLEX_PLAIN(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_DOUBLE_PRECISION && OMPI_HAVE_FORTRAN_COMPLEX#define COMPLEX_DOUBLE(name) { ompi_mpi_op_##name##_fortran_double_complex }#else#define COMPLEX_DOUBLE(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_REAL4 && OMPI_HAVE_FORTRAN_COMPLEX8#define COMPLEX8(name) { ompi_mpi_op_##name##_fortran_complex8 }#else#define COMPLEX8(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_REAL8 && OMPI_HAVE_FORTRAN_COMPLEX16#define COMPLEX16(name) { ompi_mpi_op_##name##_fortran_complex16 }#else#define COMPLEX16(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_REAL16 && OMPI_HAVE_FORTRAN_COMPLEX32#define COMPLEX32(name) { ompi_mpi_op_##name##_fortran_complex32 }#else#define COMPLEX32(name) { NULL }#endif#define COMPLEX(name) \  COMPLEX_PLAIN(name),  /* OMPI_OP_TYPE_COMPLEX */ \  COMPLEX_DOUBLE(name), /* OMPI_OP_TYPE_DOUBLE_COMPLEX */ \  COMPLEX8(name),       /* OMPI_OP_TYPE_COMPLEX8 */ \  COMPLEX16(name),      /* OMPI_OP_TYPE_COMPLEX16 */ \  COMPLEX32(name)       /* OMPI_OP_TYPE_COMPLEX32 */#define COMPLEX_NULL \  { NULL },  /* OMPI_OP_TYPE_COMPLEX */ \  { NULL },  /* OMPI_OP_TYPE_DOUBLE_COMPLEX */ \  { NULL },  /* OMPI_OP_TYPE_COMPLEX8 */ \  { NULL },  /* OMPI_OP_TYPE_COMPLEX16 */ \  { NULL }   /* OMPI_OP_TYPE_COMPLEX32 *//** Byte ****************************************************************/#define BYTE(name) \  { ompi_mpi_op_##name##_byte }  /* OMPI_OP_TYPE_BYTE */#define BYTE_NULL \  { NULL }  /* OMPI_OP_TYPE_BYTE *//** Fortran complex *****************************************************//** Fortran "2" types ***************************************************/#if OMPI_HAVE_FORTRAN_REAL#define TWOLOC_FORTRAN_2REAL(name) { ompi_mpi_op_##name##_2real }#else#define TWOLOC_FORTRAN_2REAL(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_DOUBLE_PRECISION#define TWOLOC_FORTRAN_2DOUBLE_PRECISION(name) { ompi_mpi_op_##name##_2double_precision }#else#define TWOLOC_FORTRAN_2DOUBLE_PRECISION(name) { NULL }#endif#if OMPI_HAVE_FORTRAN_INTEGER#define TWOLOC_FORTRAN_2INTEGER(name) { ompi_mpi_op_##name##_2integer }#else#define TWOLOC_FORTRAN_2INTEGER(name) { NULL }#endif/** All "2" types *******************************************************/#define TWOLOC(name) \  TWOLOC_FORTRAN_2REAL(name),                 /* OMPI_OP_TYPE_2REAL */ \  TWOLOC_FORTRAN_2DOUBLE_PRECISION(name),     /* OMPI_OP_TYPE_2DOUBLE_PRECISION */ \  TWOLOC_FORTRAN_2INTEGER(name),              /* OMPI_OP_TYPE_2INTEGER */ \  { ompi_mpi_op_##name##_float_int },         /* OMPI_OP_TYPE_FLOAT_INT */ \  { ompi_mpi_op_##name##_double_int },        /* OMPI_OP_TYPE_DOUBLE_INT */ \  { ompi_mpi_op_##name##_long_int },          /* OMPI_OP_TYPE_LONG_INT */ \  { ompi_mpi_op_##name##_2int },              /* OMPI_OP_TYPE_2INT */ \  { ompi_mpi_op_##name##_short_int },         /* OMPI_OP_TYPE_SHORT_INT */ \  { ompi_mpi_op_##name##_long_double_int }    /* OMPI_OP_TYPE_LONG_DOUBLE_INT */#define TWOLOC_NULL \  { NULL }, /* OMPI_OP_TYPE_2REAL */\  { NULL }, /* OMPI_OP_TYPE_2DOUBLE_PRECISION */ \  { NULL }, /* OMPI_OP_TYPE_2INTEGER */ \  { NULL }, /* OMPI_OP_TYPE_FLOAT_INT */ \  { NULL }, /* OMPI_OP_TYPE_DOUBLE_INT */ \  { NULL }, /* OMPI_OP_TYPE_LONG_INT */ \  { NULL }, /* OMPI_OP_TYPE_2INT */ \  { NULL }, /* OMPI_OP_TYPE_SHORT_INT */ \  { NULL }  /* OMPI_OP_TYPE_LONG_DOUBLE_INT *//* * MPI_OP_NULL * All types */#define FLAGS_NO_FLOAT \    (OMPI_OP_FLAGS_INTRINSIC | OMPI_OP_FLAGS_ASSOC | OMPI_OP_FLAGS_COMMUTE)#define FLAGS \    (OMPI_OP_FLAGS_INTRINSIC | OMPI_OP_FLAGS_ASSOC | \     OMPI_OP_FLAGS_FLOAT_ASSOC | OMPI_OP_FLAGS_COMMUTE)ompi_op_t ompi_mpi_op_null = {    { NULL, 0 },    "MPI_OP_NULL",    FLAGS,    { C_INTEGER_NULL,      FORTRAN_INTEGER_NULL,      FLOATING_POINT_NULL,      LOGICAL_NULL,      COMPLEX_NULL,      BYTE_NULL,      TWOLOC_NULL }};/* * MPI_OP_MAX * C integer, Fortran integer, Floating point */ompi_op_t ompi_mpi_op_max = {    { NULL, 0 },    "MPI_MAX",    FLAGS,    { C_INTEGER(max),      FORTRAN_INTEGER(max),      FLOATING_POINT(max),      LOGICAL_NULL,      COMPLEX_NULL,      BYTE_NULL,      TWOLOC_NULL }};/* * MPI_OP_MIN */ompi_op_t ompi_mpi_op_min = {    { NULL, 0 },    "MPI_MIN",    FLAGS,    { C_INTEGER(min),      FORTRAN_INTEGER(min),      FLOATING_POINT(min),      LOGICAL_NULL,      COMPLEX_NULL,      BYTE_NULL,      TWOLOC_NULL }};/* * MPI_OP_SUM */ompi_op_t ompi_mpi_op_sum = {    { NULL, 0 },    "MPI_SUM",    FLAGS_NO_FLOAT,    { C_INTEGER(sum),      FORTRAN_INTEGER(sum),      FLOATING_POINT(sum),      LOGICAL_NULL,      COMPLEX(sum),      BYTE_NULL,      TWOLOC_NULL }};/* * MPI_OP_PROD */ompi_op_t ompi_mpi_op_prod = {    { NULL, 0 },

⌨️ 快捷键说明

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