X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/09a679c1f6bbe99bfd05becefc1d2e2fc008a302..edcc47d7373e2f1bc9ae14bf0dcceb38af59ba2b:/src/smpi/include/smpi_group.hpp diff --git a/src/smpi/include/smpi_group.hpp b/src/smpi/include/smpi_group.hpp index ca6ad345d8..e033edc007 100644 --- a/src/smpi/include/smpi_group.hpp +++ b/src/smpi/include/smpi_group.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010, 2013-2017. The SimGrid Team. +/* Copyright (c) 2010-2019. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -9,43 +9,44 @@ #include "smpi_f2c.hpp" #include +#include +#include namespace simgrid{ namespace smpi{ class Group : public F2C{ - private: - int size_; - /* This is actually a map from int to int. We could use - * std::map here, but looking up a value there costs O(log(n)). - * For a vector, this costs O(1). We hence go with the vector. - */ - std::vector rank_to_index_map_; - std::unordered_map index_to_rank_map_; - int refcount_; - public: - explicit Group(); - explicit Group(int size); - explicit Group(Group* origin); - ~Group(); - - void set_mapping(int index, int rank); - int index(int rank); - int rank(int index); - void ref(); - static void unref(MPI_Group group); - int size(); - int compare(MPI_Group group2); - int incl(int n, int* ranks, MPI_Group* newgroup); - int excl(int n, int *ranks, MPI_Group * newgroup); - int group_union(MPI_Group group2, MPI_Group* newgroup); - int intersection(MPI_Group group2, MPI_Group* newgroup); - int difference(MPI_Group group2, MPI_Group* newgroup); - int range_incl(int n, int ranges[][3], MPI_Group * newgroup); - int range_excl(int n, int ranges[][3], MPI_Group * newgroup); - - static Group* f2c(int id); - + int size_ = 0; + /* This is actually a map from int to int. We could use std::map here, but looking up a value there costs O(log(n)). + * For a vector, this costs O(1). We hence go with the vector. + */ + std::vector rank_to_actor_map_; + std::map actor_to_rank_map_; + std::vector index_to_rank_map_; + + int refcount_ = 1; /* refcount_: start > 0 so that this group never gets freed */ +public: + Group() = default; + explicit Group(int size) : size_(size), rank_to_actor_map_(size, nullptr), index_to_rank_map_(size, MPI_UNDEFINED) {} + explicit Group(Group* origin); + + void set_mapping(s4u::ActorPtr actor, int rank); + int rank(int index); + s4u::ActorPtr actor(int rank); + int rank(const s4u::ActorPtr process); + void ref(); + static void unref(MPI_Group group); + int size() { return size_; } + int compare(MPI_Group group2); + int incl(int n, const int* ranks, MPI_Group* newgroup); + int excl(int n, const int* ranks, MPI_Group* newgroup); + int group_union(MPI_Group group2, MPI_Group* newgroup); + int intersection(MPI_Group group2, MPI_Group* newgroup); + int difference(MPI_Group group2, MPI_Group* newgroup); + int range_incl(int n, int ranges[][3], MPI_Group* newgroup); + int range_excl(int n, int ranges[][3], MPI_Group* newgroup); + + static Group* f2c(int id); }; } }