1
1
openmpi/oshmem/op/op.h
Sergey Oblomov eb0abfcf92 SHMEM/ATOMIC: refactoring of module API
- removed atomic-basic-specific operand from module API
- added own calls for add and swap operations
- minor optimization for UCX atomics

Signed-off-by: Sergey Oblomov <sergeyo@mellanox.com>
2018-07-04 14:40:14 +03:00

235 строки
9.0 KiB
C

/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef OSHMEM_OP_H
#define OSHMEM_OP_H
#include "oshmem_config.h"
#include "oshmem/types.h"
#include "oshmem/constants.h"
#include "oshmem/mca/scoll/scoll.h"
#include "opal/class/opal_list.h"
#include "opal/dss/dss_types.h"
#include "orte/types.h"
BEGIN_C_DECLS
/* ******************************************************************** */
/**
* Corresponding to the types that we can reduce over.
*/
enum {
OSHMEM_OP_TYPE_SHORT, /** C integer: short */
OSHMEM_OP_TYPE_INT, /** C integer: int */
OSHMEM_OP_TYPE_LONG, /** C integer: long */
OSHMEM_OP_TYPE_LLONG, /** C integer: long long */
OSHMEM_OP_TYPE_INT16_T, /** C integer: int16_t */
OSHMEM_OP_TYPE_INT32_T, /** C integer: int32_t */
OSHMEM_OP_TYPE_INT64_T, /** C integer: int64_t */
OSHMEM_OP_TYPE_FLOAT, /** Floating point: float */
OSHMEM_OP_TYPE_DOUBLE, /** Floating point: double */
OSHMEM_OP_TYPE_LDOUBLE, /** Floating point: long double */
OSHMEM_OP_TYPE_FCOMPLEX, /** Complex: float */
OSHMEM_OP_TYPE_DCOMPLEX, /** Complex: double */
OSHMEM_OP_TYPE_FINT2, /** Fortran integer: int2 */
OSHMEM_OP_TYPE_FINT4, /** Fortran integer: int4 */
OSHMEM_OP_TYPE_FINT8, /** Fortran integer: int8 */
OSHMEM_OP_TYPE_FREAL4, /** Fortran integer: real4 */
OSHMEM_OP_TYPE_FREAL8, /** Fortran integer: real8 */
OSHMEM_OP_TYPE_FREAL16, /** Fortran integer: real16 */
/** Maximum type */
OSHMEM_OP_TYPE_NUMBER
};
/**
* Supported reduce operations.
*/
enum {
OSHMEM_OP_AND, /** AND */
OSHMEM_OP_OR, /** OR */
OSHMEM_OP_XOR, /** XOR */
OSHMEM_OP_MAX, /** MAX */
OSHMEM_OP_MIN, /** MIN */
OSHMEM_OP_SUM, /** SUM */
OSHMEM_OP_PROD, /** PROD */
/** Maximum operation */
OSHMEM_OP_NUMBER
};
typedef void (oshmem_op_c_handler_fn_t)(void *, void *, int);
/**
* Back-end type of OSHMEM reduction operations
*/
struct oshmem_op_t {
opal_object_t base;
int id; /**< index in global array */
int op; /**< operation type */
int dt; /**< datatype */
size_t dt_size; /**< datatype size */
union {
/** C handler function pointer */
oshmem_op_c_handler_fn_t *c_fn;
} o_func;
};
typedef struct oshmem_op_t oshmem_op_t;
OSHMEM_DECLSPEC OBJ_CLASS_DECLARATION(oshmem_op_t);
/* Bitwise AND */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_short;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_fint2;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_fint4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_fint8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int64;
/* Bitwise OR */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_short;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_fint2;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_fint4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_fint8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int64;
/* Bitwise XOR */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_short;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_fint2;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_fint4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_fint8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int64;
/* MAX */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_short;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_float;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_double;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_longdouble;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_fint2;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_fint4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_fint8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_freal4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_freal8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_freal16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int64;
/* MIN */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_short;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_float;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_double;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_longdouble;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_fint2;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_fint4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_fint8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_freal4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_freal8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_freal16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int64;
/* SUM */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_short;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_float;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_double;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_longdouble;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_complexf;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_complexd;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_fint2;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_fint4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_fint8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_freal4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_freal8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_freal16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int64;
/* PROD */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_short;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_float;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_double;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_longdouble;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_complexf;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_complexd;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_fint2;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_fint4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_fint8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_freal4;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_freal8;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_freal16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int16;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int64;
/* SWAP */
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_int;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_long;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_longlong;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_int32;
OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_int64;
/**
* Initialize the op interface.
*
* @returns OSHMEM_SUCCESS Upon success
* @returns OSHMEM_ERROR Otherwise
*
* Invoked from oshmem_shmem_init(); sets up the op interface, creates
* the predefined operations.
*/
int oshmem_op_init(void);
/**
* Finalize the op interface.
*
* @returns OSHMEM_SUCCESS Always
*
* Invokes from oshmem_shmem_finalize(); tears down the op interface.
*/
int oshmem_op_finalize(void);
END_C_DECLS
#endif /* OSHMEM_OP_H */