X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dbfe89d3374d21b871e1114e7650717fd6b826d4..df94ee218f091fdb8cf343cde0b6f9be2d46a739:/src/smpi/mpi/smpi_op.cpp diff --git a/src/smpi/mpi/smpi_op.cpp b/src/smpi/mpi/smpi_op.cpp index 14b42bcab6..20246473e0 100644 --- a/src/smpi/mpi/smpi_op.cpp +++ b/src/smpi/mpi/smpi_op.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2009-2023. 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. */ @@ -24,9 +24,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)"); ((b).value) *= ((a).value); \ ((b).index) *= ((a).index); \ } -#define LAND_OP(a, b) (b) = (a) && (b) -#define LOR_OP(a, b) (b) = (a) || (b) -#define LXOR_OP(a, b) (b) = bool(a) != bool(b) +#define LAND_OP(a, b) (b) = static_cast>((a) && (b)) +#define LOR_OP(a, b) (b) = static_cast>((a) || (b)) +#define LXOR_OP(a, b) (b) = static_cast>(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) @@ -45,8 +45,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)"); } \ } +#define APPLY_BEGIN_OP_LOOP() \ + MPI_Datatype datatype_base = *datatype; \ + while (datatype_base->duplicated_datatype() != MPI_DATATYPE_NULL) \ + datatype_base = datatype_base->duplicated_datatype(); + #define APPLY_OP_LOOP(dtype, type, op) \ - if (*datatype == (dtype)) { \ + if (datatype_base == (dtype)) { \ APPLY_FUNC(a, b, length, type, op) \ } else @@ -116,11 +121,12 @@ APPLY_OP_LOOP(MPI_COMPLEX32, double_double,op) #define APPLY_END_OP_LOOP(op) \ { \ - xbt_die("Failed to apply " _XBT_STRINGIFY(op) " to type %s", (*datatype)->name()); \ + xbt_die("Failed to apply " _XBT_STRINGIFY(op) " to type %s", (*datatype)->name().c_str()); \ } static void max_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(MAX_OP) APPLY_FLOAT_OP_LOOP(MAX_OP) APPLY_END_OP_LOOP(MAX_OP) @@ -128,6 +134,7 @@ static void max_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void min_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(MIN_OP) APPLY_FLOAT_OP_LOOP(MIN_OP) APPLY_END_OP_LOOP(MIN_OP) @@ -135,6 +142,7 @@ static void min_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void sum_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(SUM_OP) APPLY_FLOAT_OP_LOOP(SUM_OP) APPLY_COMPLEX_OP_LOOP(SUM_OP) @@ -144,6 +152,7 @@ static void sum_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void prod_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(PROD_OP) APPLY_FLOAT_OP_LOOP(PROD_OP) APPLY_COMPLEX_OP_LOOP(PROD_OP) @@ -153,6 +162,7 @@ static void prod_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void land_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(LAND_OP) APPLY_FLOAT_OP_LOOP(LAND_OP) APPLY_BOOL_OP_LOOP(LAND_OP) @@ -161,6 +171,7 @@ static void land_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void lor_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(LOR_OP) APPLY_FLOAT_OP_LOOP(LOR_OP) APPLY_BOOL_OP_LOOP(LOR_OP) @@ -169,6 +180,7 @@ static void lor_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void lxor_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(LXOR_OP) APPLY_FLOAT_OP_LOOP(LXOR_OP) APPLY_BOOL_OP_LOOP(LXOR_OP) @@ -177,6 +189,7 @@ static void lxor_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void band_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(BAND_OP) APPLY_BOOL_OP_LOOP(BAND_OP) APPLY_BYTE_OP_LOOP(BAND_OP) @@ -185,6 +198,7 @@ static void band_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void bor_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(BOR_OP) APPLY_BOOL_OP_LOOP(BOR_OP) APPLY_BYTE_OP_LOOP(BOR_OP) @@ -193,6 +207,7 @@ static void bor_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void bxor_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_BASIC_OP_LOOP(BXOR_OP) APPLY_BOOL_OP_LOOP(BXOR_OP) APPLY_BYTE_OP_LOOP(BXOR_OP) @@ -201,12 +216,14 @@ static void bxor_func(void *a, void *b, int *length, MPI_Datatype * datatype) static void minloc_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_PAIR_OP_LOOP(MINLOC_OP) APPLY_END_OP_LOOP(MINLOC_OP) } static void maxloc_func(void *a, void *b, int *length, MPI_Datatype * datatype) { + APPLY_BEGIN_OP_LOOP() APPLY_PAIR_OP_LOOP(MAXLOC_OP) APPLY_END_OP_LOOP(MAXLOC_OP) } @@ -221,13 +238,12 @@ static void no_func(void*, void*, int*, MPI_Datatype*) /* obviously a no-op */ } - -#define CREATE_MPI_OP(name, func, types) \ - SMPI_Op _XBT_CONCAT(smpi_MPI_, name)(&(func) /* func */, true, true, types); +#define CREATE_MPI_OP(name, func, types) \ + SMPI_Op _XBT_CONCAT(smpi_MPI_, name)(&(func), true, true, types, _XBT_STRINGIFY(MPI_##name)); #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_FP|DT_FLAG_BYTE|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) @@ -244,22 +260,18 @@ 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{ +namespace simgrid::smpi { void Op::apply(const void* invec, void* inoutvec, const int* len, MPI_Datatype datatype) const { - if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { - // we need to switch as the called function may silently touch global variables - XBT_DEBUG("Applying operation, switch to the right data frame "); - smpi_switch_data_segment(simgrid::s4u::Actor::self()); - } + // we need to switch as the called function may silently touch global variables + smpi_switch_data_segment(simgrid::s4u::Actor::self()); if (not smpi_process()->replaying() && *len > 0) { + XBT_DEBUG("Applying operation of length %d from %p and from/to %p", *len, invec, inoutvec); if (not is_fortran_op_) this->func_(const_cast(invec), inoutvec, const_cast(len), &datatype); else{ - XBT_DEBUG("Applying operation of length %d from %p and from/to %p", *len, invec, inoutvec); int tmp = datatype->c2f(); /* Unfortunately, the C and Fortran version of the MPI standard do not agree on the type here, thus the reinterpret_cast. */ @@ -280,11 +292,10 @@ void Op::unref(MPI_Op* op){ if((*op)!=MPI_OP_NULL){ (*op)->refcount_--; if ((*op)->refcount_ == 0 && not (*op)->is_predefined_){ - F2C::free_f((*op)->c2f()); + F2C::free_f((*op)->f2c_id()); delete(*op); } } } -} -} +} // namespace simgrid::smpi