X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7cd237f9659b2df47fca65a4340ca7b5407f46a0..fb34ba00a93c76c71f171be1fdfdecc078c1c929:/src/smpi/include/smpi_datatype.hpp diff --git a/src/smpi/include/smpi_datatype.hpp b/src/smpi/include/smpi_datatype.hpp index b55f3aa473..3874680a06 100644 --- a/src/smpi/include/smpi_datatype.hpp +++ b/src/smpi/include/smpi_datatype.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019. 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. */ @@ -9,6 +9,7 @@ #include "smpi_f2c.hpp" #include "smpi_keyvals.hpp" #include +#include constexpr unsigned DT_FLAG_DESTROYED = 0x0001; /**< user destroyed but some other layers still have a reference */ constexpr unsigned DT_FLAG_COMMITED = 0x0002; /**< ready to be used for a send/recv operation */ @@ -20,7 +21,7 @@ constexpr unsigned DT_FLAG_PREDEFINED = 0x0040; /**< cannot be removed: initial constexpr unsigned DT_FLAG_NO_GAPS = 0x0080; /**< no gaps around the datatype */ constexpr unsigned DT_FLAG_DATA = 0x0100; /**< data or control structure */ constexpr unsigned DT_FLAG_ONE_SIDED = 0x0200; /**< datatype can be used for one sided operations */ -constexpr unsigned DT_FLAG_UNAVAILABLE = 0x0400; /**< datatypes unavailable on the build (OS or compiler dependant) */ +constexpr unsigned DT_FLAG_UNAVAILABLE = 0x0400; /**< datatypes unavailable on the build (OS or compiler dependent) */ constexpr unsigned DT_FLAG_DERIVED = 0x0800; /**< is the datatype derived ? */ /* * We should make the difference here between the predefined contiguous and non contiguous @@ -29,7 +30,7 @@ constexpr unsigned DT_FLAG_DERIVED = 0x0800; /**< is the datatype derived ? constexpr unsigned DT_FLAG_BASIC = (DT_FLAG_PREDEFINED | DT_FLAG_CONTIGUOUS | DT_FLAG_NO_GAPS | DT_FLAG_DATA | DT_FLAG_COMMITED); -extern const MPI_Datatype MPI_PTR; +extern MPI_Datatype MPI_PTR; //The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC. struct float_int { @@ -75,9 +76,20 @@ struct integer128_t { namespace simgrid{ namespace smpi{ +class Datatype_contents { + public: + int combiner_; + std::vector integers_; + std::vector addresses_; + std::vector datatypes_; + Datatype_contents(int combiner, + int number_of_integers, const int* integers, + int number_of_addresses, const MPI_Aint* addresses, + int number_of_datatypes, const MPI_Datatype* datatypes); +}; class Datatype : public F2C, public Keyval{ - char* name_ = nullptr; + std::string name_ = ""; /* The id here is the (unique) datatype id used for this datastructure. * It's default value is set to -1 since some code expects this return value * when no other id has been assigned @@ -88,42 +100,50 @@ class Datatype : public F2C, public Keyval{ MPI_Aint ub_; int flags_; int refcount_ = 1; + std::unique_ptr contents_ = nullptr; + +protected: + template void set_contents(Args&&... args) + { + contents_ = std::make_unique(std::forward(args)...); + } public: static std::unordered_map keyvals_; static int keyval_id_; - Datatype(int id, int size, MPI_Aint lb, MPI_Aint ub, int flags); - Datatype(char* name, int id, int size, MPI_Aint lb, MPI_Aint ub, int flags); + Datatype(int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags); + Datatype(const char* name, int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags); Datatype(int size, MPI_Aint lb, MPI_Aint ub, int flags); - Datatype(char* name, int size, MPI_Aint lb, MPI_Aint ub, int flags); Datatype(Datatype* datatype, int* ret); Datatype(const Datatype&) = delete; Datatype& operator=(const Datatype&) = delete; - virtual ~Datatype(); + ~Datatype() override; - char* name() { return name_; } - size_t size() { return size_; } - MPI_Aint lb() { return lb_; } - MPI_Aint ub() { return ub_; } - int flags() { return flags_; } - int refcount() { return refcount_; } + const char* name() const { return name_.c_str(); } + size_t size() const { return size_; } + MPI_Aint lb() const { return lb_; } + MPI_Aint ub() const { return ub_; } + int flags() const { return flags_; } + int refcount() const { return refcount_; } void ref(); static void unref(MPI_Datatype datatype); void commit(); - bool is_valid(); - bool is_basic(); + int copy_attrs(Datatype* datatype); + bool is_valid() const; + bool is_basic() const; static const char* encode(const Datatype* dt) { return dt->id.c_str(); } static MPI_Datatype decode(const std::string& datatype_id); - bool is_replayable(); + bool is_replayable() const; void addflag(int flag); - int extent(MPI_Aint* lb, MPI_Aint* extent); - MPI_Aint get_extent() { return ub_ - lb_; }; - void get_name(char* name, int* length); + int extent(MPI_Aint* lb, MPI_Aint* extent) const; + MPI_Aint get_extent() const { return ub_ - lb_; }; + void get_name(char* name, int* length) const; void set_name(const char* name); static int copy(const void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype); + virtual int clone(MPI_Datatype* type); virtual void serialize(const void* noncontiguous, void* contiguous, int count); virtual void unserialize(const void* contiguous, void* noncontiguous, int count, MPI_Op op); static int keyval_create(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, @@ -131,7 +151,9 @@ public: static int keyval_free(int* keyval); int pack(const void* inbuf, int incount, void* outbuf, int outcount, int* position, const Comm* comm); int unpack(const void* inbuf, int insize, int* position, void* outbuf, int outcount, const Comm* comm); - + int 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; + int get_envelope(int* num_integers, int* num_addresses, int* num_datatypes, int* combiner) const; static int create_contiguous(int count, MPI_Datatype old_type, MPI_Aint lb, MPI_Datatype* new_type); static int create_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* new_type); static int create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type);