X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/29a3b2869c0075fc75e8ccc66fc1d9c4c8bf6a85..2a7d4780fb29f8e689819f284389fbc7f9ce8543:/src/smpi/mpi/smpi_datatype.cpp diff --git a/src/smpi/mpi/smpi_datatype.cpp b/src/smpi/mpi/smpi_datatype.cpp index c9b75ab4ac..b8c9812647 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-2018. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2009-2019. 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. */ @@ -8,6 +8,7 @@ #include "simgrid/modelchecker.h" #include "smpi_datatype_derived.hpp" #include "smpi_op.hpp" +#include "src/instr/instr_private.hpp" #include "src/smpi/include/smpi_actor.hpp" #include @@ -122,7 +123,7 @@ Datatype::Datatype(char* name, int ident, int size, MPI_Aint lb, MPI_Aint ub, in #endif } -Datatype::Datatype(Datatype *datatype, int* ret) : name_(nullptr), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_), refcount_(1) +Datatype::Datatype(Datatype *datatype, int* ret) : name_(nullptr), size_(datatype->size_), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_), refcount_(1) { flags_ &= ~DT_FLAG_PREDEFINED; *ret = MPI_SUCCESS; @@ -176,7 +177,6 @@ Datatype::~Datatype(){ xbt_free(name_); } - void Datatype::ref(){ refcount_++; @@ -215,61 +215,28 @@ bool Datatype::is_basic() return (flags_ & DT_FLAG_BASIC); } -const char* Datatype::encode(MPI_Datatype dt) +bool Datatype::is_replayable() { - return dt->id.c_str(); + return (simgrid::instr::trace_format == simgrid::instr::TraceFormat::Ti) && + ((this == MPI_BYTE) || (this == MPI_DOUBLE) || (this == MPI_INT) || (this == MPI_CHAR) || + (this == MPI_SHORT) || (this == MPI_LONG) || (this == MPI_FLOAT)); } -MPI_Datatype Datatype::decode(std::string datatype_id) +MPI_Datatype Datatype::decode(const std::string& datatype_id) { return id2type_lookup.find(datatype_id)->second; } -bool Datatype::is_replayable() -{ - return ((this==MPI_BYTE)||(this==MPI_DOUBLE)||(this==MPI_INT)|| - (this==MPI_CHAR)||(this==MPI_SHORT)||(this==MPI_LONG)||(this==MPI_FLOAT)); -} - -size_t Datatype::size(){ - return size_; -} - -int Datatype::flags(){ - return flags_; -} - -int Datatype::refcount(){ - return refcount_; -} - void Datatype::addflag(int flag){ flags_ &= flag; } -MPI_Aint Datatype::lb(){ - return lb_; -} - -MPI_Aint Datatype::ub(){ - return ub_; -} - -char* Datatype::name(){ - return name_; -} - - int Datatype::extent(MPI_Aint * lb, MPI_Aint * extent){ *lb = lb_; *extent = ub_ - lb_; return MPI_SUCCESS; } -MPI_Aint Datatype::get_extent(){ - return ub_ - lb_; -} - void Datatype::get_name(char* name, int* length){ *length = strlen(name_); strncpy(name, name_, *length+1); @@ -283,7 +250,7 @@ void Datatype::set_name(char* name){ int Datatype::pack(void* inbuf, int incount, void* outbuf, int outcount, int* position,MPI_Comm comm){ if (outcount - *position < incount*static_cast(size_)) - return MPI_ERR_BUFFER; + return MPI_ERR_OTHER; Datatype::copy(inbuf, incount, this, static_cast(outbuf) + *position, outcount, MPI_CHAR); *position += incount * size_; return MPI_SUCCESS; @@ -291,13 +258,12 @@ int Datatype::pack(void* inbuf, int incount, void* outbuf, int outcount, int* po int Datatype::unpack(void* inbuf, int insize, int* position, void* outbuf, int outcount,MPI_Comm comm){ if (outcount*static_cast(size_)> insize) - return MPI_ERR_BUFFER; + return MPI_ERR_OTHER; Datatype::copy(static_cast(inbuf) + *position, insize, MPI_CHAR, outbuf, outcount, this); *position += outcount * size_; return MPI_SUCCESS; } - int Datatype::copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype){ @@ -334,11 +300,11 @@ int Datatype::copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, } //Default serialization method : memcpy. -void Datatype::serialize( void* noncontiguous_buf, void *contiguous_buf, int count){ +void Datatype::serialize(void* noncontiguous_buf, void* contiguous_buf, int count) +{ char* contiguous_buf_char = static_cast(contiguous_buf); char* noncontiguous_buf_char = static_cast(noncontiguous_buf)+lb_; memcpy(contiguous_buf_char, noncontiguous_buf_char, count*size_); - } void Datatype::unserialize( void* contiguous_buf, void *noncontiguous_buf, int count, MPI_Op op){