X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7cd237f9659b2df47fca65a4340ca7b5407f46a0..b9625f82f86db0674e911887addce45dca31b57f:/src/smpi/mpi/smpi_datatype.cpp diff --git a/src/smpi/mpi/smpi_datatype.cpp b/src/smpi/mpi/smpi_datatype.cpp index c086161cb6..c28c526b3f 100644 --- a/src/smpi/mpi/smpi_datatype.cpp +++ b/src/smpi/mpi/smpi_datatype.cpp @@ -1,5 +1,5 @@ /* smpi_datatype.cpp -- MPI primitives to handle datatypes */ -/* Copyright (c) 2009-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2009-2020. 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. */ @@ -11,6 +11,8 @@ #include "src/instr/instr_private.hpp" #include "src/smpi/include/smpi_actor.hpp" +#include +#include #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (datatype)"); @@ -130,8 +132,30 @@ Datatype::Datatype(char* name, int ident, int size, MPI_Aint lb, MPI_Aint ub, in Datatype::Datatype(Datatype* datatype, int* ret) : size_(datatype->size_), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_) { + *ret = this->copy_attrs(datatype); +} + +Datatype::~Datatype() +{ + xbt_assert(refcount_ >= 0); + + if(flags_ & DT_FLAG_PREDEFINED) + return; + + //if still used, mark for deletion + if(refcount_!=0){ + flags_ |=DT_FLAG_DESTROYED; + return; + } + + cleanup_attr(); + delete contents_; + xbt_free(name_); +} + +int Datatype::copy_attrs(Datatype* datatype){ flags_ &= ~DT_FLAG_PREDEFINED; - *ret = MPI_SUCCESS; + int ret = MPI_SUCCESS; if (not datatype->attributes()->empty()) { int flag=0; @@ -141,13 +165,13 @@ Datatype::Datatype(Datatype* datatype, int* ret) if (elem != nullptr){ if( elem->copy_fn.type_copy_fn != MPI_NULL_COPY_FN && elem->copy_fn.type_copy_fn != MPI_TYPE_DUP_FN) - *ret = elem->copy_fn.type_copy_fn(datatype, it.first, elem->extra_state, it.second, &value_out, &flag); + ret = elem->copy_fn.type_copy_fn(datatype, it.first, elem->extra_state, it.second, &value_out, &flag); else if ( elem->copy_fn.type_copy_fn_fort != MPI_NULL_COPY_FN && (*(int*)*elem->copy_fn.type_copy_fn_fort) != 1){ value_out=(int*)xbt_malloc(sizeof(int)); - elem->copy_fn.type_copy_fn_fort(datatype, it.first, elem->extra_state, it.second, value_out, &flag,ret); + elem->copy_fn.type_copy_fn_fort(datatype, it.first, elem->extra_state, it.second, value_out, &flag, &ret); } - if (*ret != MPI_SUCCESS) { + if (ret != MPI_SUCCESS) { break; } if(elem->copy_fn.type_copy_fn == MPI_TYPE_DUP_FN || @@ -161,24 +185,14 @@ Datatype::Datatype(Datatype* datatype, int* ret) } } } + contents_ = new Datatype_contents(MPI_COMBINER_DUP, 0, nullptr, 0, nullptr, 1, &datatype); + return ret; } -Datatype::~Datatype() -{ - xbt_assert(refcount_ >= 0); - - if(flags_ & DT_FLAG_PREDEFINED) - return; - - //if still used, mark for deletion - if(refcount_!=0){ - flags_ |=DT_FLAG_DESTROYED; - return; - } - - cleanup_attr(); - - xbt_free(name_); +int Datatype::clone(MPI_Datatype* type){ + int ret; + *type = new Datatype(this, &ret); + return ret; } void Datatype::ref() @@ -210,16 +224,17 @@ void Datatype::commit() flags_ |= DT_FLAG_COMMITED; } -bool Datatype::is_valid(){ +bool Datatype::is_valid() const +{ return (flags_ & DT_FLAG_COMMITED); } -bool Datatype::is_basic() +bool Datatype::is_basic() const { return (flags_ & DT_FLAG_BASIC); } -bool Datatype::is_replayable() +bool Datatype::is_replayable() const { return (simgrid::instr::trace_format == simgrid::instr::TraceFormat::Ti) && ((this == MPI_BYTE) || (this == MPI_DOUBLE) || (this == MPI_INT) || (this == MPI_CHAR) || @@ -235,13 +250,15 @@ void Datatype::addflag(int flag){ flags_ &= flag; } -int Datatype::extent(MPI_Aint * lb, MPI_Aint * extent){ +int Datatype::extent(MPI_Aint* lb, MPI_Aint* extent) const +{ *lb = lb_; *extent = ub_ - lb_; return MPI_SUCCESS; } -void Datatype::get_name(char* name, int* length){ +void Datatype::get_name(char* name, int* length) const +{ if(name_!=nullptr){ *length = strlen(name_); strncpy(name, name_, *length+1); @@ -274,6 +291,40 @@ int Datatype::unpack(const void* inbuf, int insize, int* position, void* outbuf, return MPI_SUCCESS; } +int Datatype::get_contents(int max_integers, int max_addresses, int max_datatypes, int* array_of_integers, + MPI_Aint* array_of_addresses, MPI_Datatype* array_of_datatypes) const +{ + if(contents_==nullptr) + return MPI_ERR_ARG; + if (static_cast(max_integers) < contents_->integers_.size()) + return MPI_ERR_COUNT; + std::copy(begin(contents_->integers_), end(contents_->integers_), array_of_integers); + if (static_cast(max_addresses) < contents_->addresses_.size()) + return MPI_ERR_COUNT; + std::copy(begin(contents_->addresses_), end(contents_->addresses_), array_of_addresses); + if (static_cast(max_datatypes) < contents_->datatypes_.size()) + return MPI_ERR_COUNT; + std::copy(begin(contents_->datatypes_), end(contents_->datatypes_), array_of_datatypes); + std::for_each(begin(contents_->datatypes_), end(contents_->datatypes_), std::mem_fn(&Datatype::ref)); + return MPI_SUCCESS; +} + +int Datatype::get_envelope(int* num_integers, int* num_addresses, int* num_datatypes, int* combiner) const +{ + if(contents_==nullptr){ + *num_integers = 0; + *num_addresses = 0; + *num_datatypes = 0; + *combiner = MPI_COMBINER_NAMED; + }else{ + *num_integers = contents_->integers_.size(); + *num_addresses = contents_->addresses_.size(); + *num_datatypes = contents_->datatypes_.size(); + *combiner = contents_->combiner_; + } + return MPI_SUCCESS; +} + int Datatype::copy(const void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype) { @@ -371,6 +422,8 @@ int Datatype::create_vector(int count, int block_length, int stride, MPI_Datatyp /* in this situation the data are contiguous thus it's not required to serialize and unserialize it*/ *new_type = new Datatype(count * block_length * old_type->size(), 0, ((count -1) * stride + block_length)* old_type->size(), DT_FLAG_CONTIGUOUS); + int ints[3] = {count, block_length, stride}; + (*new_type)->contents_ = new Datatype_contents(MPI_COMBINER_VECTOR, 3, ints, 0, nullptr, 1, &old_type); retval=MPI_SUCCESS; } return retval; @@ -395,6 +448,8 @@ int Datatype::create_hvector(int count, int block_length, MPI_Aint stride, MPI_D }else{ /* in this situation the data are contiguous thus it's not required to serialize and unserialize it*/ *new_type = new Datatype(count * block_length * old_type->size(), 0, count * block_length * old_type->size(), DT_FLAG_CONTIGUOUS); + int ints[2] = {count, block_length}; + (*new_type)->contents_ = new Datatype_contents(MPI_COMBINER_HVECTOR, 2, ints, 1, &stride, 1, &old_type); retval=MPI_SUCCESS; } return retval;