📄 op.c
字号:
/* * 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 + -