X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/96cedde3cdbc0b8ffc3f096a1b65d021b0226f99..fbcf6ab31cae1988be858f9f894dafe529c575d7:/src/smpi/mpi/smpi_op.cpp diff --git a/src/smpi/mpi/smpi_op.cpp b/src/smpi/mpi/smpi_op.cpp index 9c02566039..228c3b93ce 100644 --- a/src/smpi/mpi/smpi_op.cpp +++ b/src/smpi/mpi/smpi_op.cpp @@ -66,7 +66,9 @@ APPLY_OP_LOOP(MPI_OFFSET, MPI_Offset,op)\ APPLY_OP_LOOP(MPI_INTEGER1, int,op)\ APPLY_OP_LOOP(MPI_INTEGER2, int16_t,op)\ APPLY_OP_LOOP(MPI_INTEGER4, int32_t,op)\ -APPLY_OP_LOOP(MPI_INTEGER8, int64_t,op) +APPLY_OP_LOOP(MPI_INTEGER8, int64_t,op)\ +APPLY_OP_LOOP(MPI_COUNT, long long,op) + #define APPLY_BOOL_OP_LOOP(op)\ APPLY_OP_LOOP(MPI_C_BOOL, bool,op) @@ -190,13 +192,13 @@ static void replace_func(void *a, void *b, int *length, MPI_Datatype * datatype) memcpy(b, a, *length * (*datatype)->size()); } -static void no_func(void *a, void *b, int *length, MPI_Datatype * datatype) +static void no_func(void*, void*, int*, MPI_Datatype*) { /* obviously a no-op */ } #define CREATE_MPI_OP(name, func) \ - static SMPI_Op mpi_##name (&(func) /* func */, true ); \ + static SMPI_Op mpi_##name (&(func) /* func */, true, true ); \ MPI_Op name = &mpi_##name; CREATE_MPI_OP(MPI_MAX, max_func); @@ -217,28 +219,7 @@ CREATE_MPI_OP(MPI_NO_OP, no_func); namespace simgrid{ namespace smpi{ -Op::Op(MPI_User_function * function, bool commutative) : func_(function), is_commutative_(commutative) -{ - is_fortran_op_ = false; -} - -bool Op::is_commutative() -{ - return is_commutative_; -} - -bool Op::is_fortran_op() -{ - return is_fortran_op_; -} - -void Op::set_fortran_op() -{ - //tell that we were created from fortran, so we need to translate the type to fortran when called - is_fortran_op_ = true; -} - -void Op::apply(void *invec, void *inoutvec, int *len, MPI_Datatype datatype) +void Op::apply(const void* invec, void* inoutvec, const int* len, MPI_Datatype datatype) { if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables @@ -248,13 +229,13 @@ void Op::apply(void *invec, void *inoutvec, int *len, MPI_Datatype datatype) if (not smpi_process()->replaying() && *len > 0) { if (not is_fortran_op_) - this->func_(invec, inoutvec, len, &datatype); + 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. */ - this->func_(invec, inoutvec, len, reinterpret_cast(&tmp) ); + this->func_(const_cast(invec), inoutvec, const_cast(len), reinterpret_cast(&tmp)); } } } @@ -263,5 +244,17 @@ Op* Op::f2c(int id){ return static_cast(F2C::f2c(id)); } +void Op::ref(){ + refcount_++; +} + +void Op::unref(MPI_Op* op){ + if((*op)!=MPI_OP_NULL){ + (*op)->refcount_--; + if((*op)->refcount_==0 && (*op)->predefined_==false) + delete(*op); + } +} + } }