X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f3b7e5f4b4d7c87ee3e8827313ec966ea8fc8387..ea02d47c2ee462e84798356e4dda87b1467e22b8:/src/smpi/mpi/smpi_op.cpp diff --git a/src/smpi/mpi/smpi_op.cpp b/src/smpi/mpi/smpi_op.cpp index a94b2ff732..9b2bf1b562 100644 --- a/src/smpi/mpi/smpi_op.cpp +++ b/src/smpi/mpi/smpi_op.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2009-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -26,7 +26,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)"); } #define LAND_OP(a, b) (b) = (a) && (b) #define LOR_OP(a, b) (b) = (a) || (b) -#define LXOR_OP(a, b) (b) = (not(a) && (b)) || ((a) && not(b)) +#define LXOR_OP(a, b) (b) = bool(a) != bool(b) #define BAND_OP(a, b) (b) &= (a) #define BOR_OP(a, b) (b) |= (a) #define BXOR_OP(a, b) (b) ^= (a) @@ -63,7 +63,6 @@ APPLY_OP_LOOP(MPI_UNSIGNED, unsigned int,op)\ APPLY_OP_LOOP(MPI_UNSIGNED_LONG, unsigned long,op)\ APPLY_OP_LOOP(MPI_UNSIGNED_LONG_LONG, unsigned long long,op)\ APPLY_OP_LOOP(MPI_WCHAR, wchar_t,op)\ -APPLY_OP_LOOP(MPI_BYTE, int8_t,op)\ APPLY_OP_LOOP(MPI_INT8_T, int8_t,op)\ APPLY_OP_LOOP(MPI_INT16_T, int16_t,op)\ APPLY_OP_LOOP(MPI_INT32_T, int32_t,op)\ @@ -84,6 +83,9 @@ APPLY_OP_LOOP(MPI_COUNT, long long,op) #define APPLY_BOOL_OP_LOOP(op)\ APPLY_OP_LOOP(MPI_C_BOOL, bool,op) +#define APPLY_BYTE_OP_LOOP(op)\ +APPLY_OP_LOOP(MPI_BYTE, int8_t,op) + #define APPLY_FLOAT_OP_LOOP(op)\ APPLY_OP_LOOP(MPI_FLOAT, float,op)\ APPLY_OP_LOOP(MPI_DOUBLE, double,op)\ @@ -177,6 +179,7 @@ static void band_func(void *a, void *b, int *length, MPI_Datatype * datatype) { APPLY_BASIC_OP_LOOP(BAND_OP) APPLY_BOOL_OP_LOOP(BAND_OP) + APPLY_BYTE_OP_LOOP(BAND_OP) APPLY_END_OP_LOOP(BAND_OP) } @@ -184,6 +187,7 @@ static void bor_func(void *a, void *b, int *length, MPI_Datatype * datatype) { APPLY_BASIC_OP_LOOP(BOR_OP) APPLY_BOOL_OP_LOOP(BOR_OP) + APPLY_BYTE_OP_LOOP(BOR_OP) APPLY_END_OP_LOOP(BOR_OP) } @@ -191,6 +195,7 @@ static void bxor_func(void *a, void *b, int *length, MPI_Datatype * datatype) { APPLY_BASIC_OP_LOOP(BXOR_OP) APPLY_BOOL_OP_LOOP(BXOR_OP) + APPLY_BYTE_OP_LOOP(BXOR_OP) APPLY_END_OP_LOOP(BXOR_OP) } @@ -216,24 +221,28 @@ static void no_func(void*, void*, int*, MPI_Datatype*) /* obviously a no-op */ } -#define CREATE_MPI_OP(name, func) \ - static SMPI_Op _XBT_CONCAT(mpi_, name)(&(func) /* func */, true, true); \ - MPI_Op name = &_XBT_CONCAT(mpi_, name); - -CREATE_MPI_OP(MPI_MAX, max_func) -CREATE_MPI_OP(MPI_MIN, min_func) -CREATE_MPI_OP(MPI_SUM, sum_func) -CREATE_MPI_OP(MPI_PROD, prod_func) -CREATE_MPI_OP(MPI_LAND, land_func) -CREATE_MPI_OP(MPI_LOR, lor_func) -CREATE_MPI_OP(MPI_LXOR, lxor_func) -CREATE_MPI_OP(MPI_BAND, band_func) -CREATE_MPI_OP(MPI_BOR, bor_func) -CREATE_MPI_OP(MPI_BXOR, bxor_func) -CREATE_MPI_OP(MPI_MAXLOC, maxloc_func) -CREATE_MPI_OP(MPI_MINLOC, minloc_func) -CREATE_MPI_OP(MPI_REPLACE, replace_func) -CREATE_MPI_OP(MPI_NO_OP, no_func) + +#define CREATE_MPI_OP(name, func, types) \ + SMPI_Op _XBT_CONCAT(smpi_MPI_, name)(&(func) /* func */, true, true, types); + +#define MAX_TYPES DT_FLAG_C_INTEGER|DT_FLAG_F_INTEGER|DT_FLAG_FP|DT_FLAG_MULTILANG +#define LAND_TYPES DT_FLAG_C_INTEGER|DT_FLAG_FP|DT_FLAG_LOGICAL|DT_FLAG_MULTILANG +#define BAND_TYPES DT_FLAG_C_INTEGER|DT_FLAG_F_INTEGER|DT_FLAG_BYTE|DT_FLAG_MULTILANG + +CREATE_MPI_OP(MAX, max_func, MAX_TYPES) +CREATE_MPI_OP(MIN, min_func, MAX_TYPES) +CREATE_MPI_OP(SUM, sum_func, MAX_TYPES|DT_FLAG_COMPLEX) +CREATE_MPI_OP(PROD, prod_func, MAX_TYPES|DT_FLAG_COMPLEX) +CREATE_MPI_OP(LAND, land_func, LAND_TYPES) +CREATE_MPI_OP(LOR, lor_func, LAND_TYPES) +CREATE_MPI_OP(LXOR, lxor_func, LAND_TYPES) +CREATE_MPI_OP(BAND, band_func, BAND_TYPES) +CREATE_MPI_OP(BOR, bor_func, BAND_TYPES) +CREATE_MPI_OP(BXOR, bxor_func, BAND_TYPES) +CREATE_MPI_OP(MAXLOC, maxloc_func, DT_FLAG_REDUCTION) +CREATE_MPI_OP(MINLOC, minloc_func, DT_FLAG_REDUCTION) +CREATE_MPI_OP(REPLACE, replace_func, 0) +CREATE_MPI_OP(NO_OP, no_func, 0) namespace simgrid{ namespace smpi{ @@ -270,8 +279,10 @@ void Op::ref(){ void Op::unref(MPI_Op* op){ if((*op)!=MPI_OP_NULL){ (*op)->refcount_--; - if ((*op)->refcount_ == 0 && not (*op)->predefined_) + if ((*op)->refcount_ == 0 && not (*op)->is_predefined_){ + F2C::free_f((*op)->f2c_id()); delete(*op); + } } }