X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/98bbaf42bf16cc40faee7ddca28c0369144f3d95..57970de8f4fd548711e2cea76502ba692595fa4a:/src/smpi/smpi_comm.hpp diff --git a/src/smpi/smpi_comm.hpp b/src/smpi/smpi_comm.hpp index 42444058e5..992c9229e0 100644 --- a/src/smpi/smpi_comm.hpp +++ b/src/smpi/smpi_comm.hpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2010-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. 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. */ @@ -7,32 +6,37 @@ #ifndef SMPI_COMM_HPP_INCLUDED #define SMPI_COMM_HPP_INCLUDED -#include "private.h" +#include +#include "src/smpi/smpi_keyvals.hpp" +#include "src/smpi/smpi_group.hpp" +#include "src/smpi/smpi_topo.hpp" namespace simgrid{ namespace smpi{ -class Comm { +class Comm : public F2C, public Keyval{ private: - MPI_Group m_group; - MPIR_Topo_type m_topoType; - MPI_Topology m_topo; // to be replaced by an union - int m_refcount; - MPI_Comm m_leaders_comm;//inter-node communicator - MPI_Comm m_intra_comm;//intra-node communicator . For MPI_COMM_WORLD this can't be used, as var is global. + MPI_Group group_; + MPIR_Topo_type topoType_; + MPI_Topology topo_; // to be replaced by an union + int refcount_; + MPI_Comm leaders_comm_;//inter-node communicator + MPI_Comm intra_comm_;//intra-node communicator . For MPI_COMM_WORLD this can't be used, as var is global. //use an intracomm stored in the process data instead - int* m_leaders_map; //who is the leader of each process - int m_is_uniform; - int* m_non_uniform_map; //set if smp nodes have a different number of processes allocated - int m_is_blocked;// are ranks allocated on the same smp node contiguous ? - xbt_dict_t m_attributes; + int* leaders_map_; //who is the leader of each process + int is_uniform_; + int* non_uniform_map_; //set if smp nodes have a different number of processes allocated + int is_blocked_;// are ranks allocated on the same smp node contiguous ? + + std::list rma_wins_; // attached windows for synchronization. public: - Comm(); - Comm(MPI_Group group, MPI_Topology topo); + static std::unordered_map keyvals_; + static int keyval_id_; - void destroy(); + Comm() = default; + Comm(MPI_Group group, MPI_Topology topo); int dup(MPI_Comm* newcomm); MPI_Group group(); MPI_Topology topo(); @@ -48,14 +52,23 @@ class Comm { int is_uniform(); int is_blocked(); MPI_Comm split(int color, int key); - void use(); - void cleanup_attributes(); void cleanup_smp(); - void unuse(); + void ref(); + static void unref(MPI_Comm comm); + static void destroy(MPI_Comm comm); void init_smp(); - int attr_delete(int keyval); - int attr_get(int keyval, void* attr_value, int* flag); - int attr_put(int keyval, void* attr_value); + + int add_f(); + static void free_f(int id); + static Comm* f2c(int); + + static int keyval_create(MPI_Comm_copy_attr_function* copy_fn, MPI_Comm_delete_attr_function* delete_fn, int* keyval, void* extra_state); + static int keyval_free(int* keyval); + static void keyval_cleanup(); + + void add_rma_win(MPI_Win win); + void remove_rma_win(MPI_Win win); + void finish_rma_calls(); };