diff --git a/src/parser/OTF2Parser/ParserDefinitionOTF2.cpp b/src/parser/OTF2Parser/ParserDefinitionOTF2.cpp index c21f1caca074a08a9c8a9e3c92e59d1eb8422bf1..cf7dbb522939f4e1cf95d3e291728407067a6ad2 100644 --- a/src/parser/OTF2Parser/ParserDefinitionOTF2.cpp +++ b/src/parser/OTF2Parser/ParserDefinitionOTF2.cpp @@ -84,6 +84,9 @@ map<uint32_t, OTF2_Function > ParserDefinitionOTF2::_functions; map<uint32_t, const char * > ParserDefinitionOTF2::_strings; +map<OTF2_GroupRef, OTF2_Group*> ParserDefinitionOTF2::_groups; +map<OTF2_CommRef, OTF2_Comm*> ParserDefinitionOTF2::_comms; + vector<Color *> ParserDefinitionOTF2::_default_colors; uint64_t ParserDefinitionOTF2::_ticks_per_second = 1; @@ -127,6 +130,12 @@ ParserDefinitionOTF2::~ParserDefinitionOTF2() { ParserDefinitionOTF2::_location_group.end()); ParserDefinitionOTF2::_system_tree_node.erase(ParserDefinitionOTF2::_system_tree_node.begin(), ParserDefinitionOTF2::_system_tree_node.end()); + ParserDefinitionOTF2::_functions.erase(ParserDefinitionOTF2::_functions.begin(), + ParserDefinitionOTF2::_functions.end()); + ParserDefinitionOTF2::_groups.erase(ParserDefinitionOTF2::_groups.begin(), + ParserDefinitionOTF2::_groups.end()); + ParserDefinitionOTF2::_comms.erase(ParserDefinitionOTF2::_comms.begin(), + ParserDefinitionOTF2::_comms.end()); } void ParserDefinitionOTF2::set_handlers(Trace *t) { @@ -139,6 +148,7 @@ void ParserDefinitionOTF2::set_handlers(Trace *t) { OTF2_GlobalDefReaderCallbacks_SetRegionCallback ( _global_def_callbacks, &handler_DefState ); // SetGroupCallback to get containerType, stateType... ? OTF2_GlobalDefReaderCallbacks_SetGroupCallback ( _global_def_callbacks, &handler_DefGroup ); + OTF2_GlobalDefReaderCallbacks_SetCommCallback ( _global_def_callbacks, &handler_DefComm ); OTF2_GlobalDefReaderCallbacks_SetMetricMemberCallback (_global_def_callbacks, &handler_DefMetricMember ); OTF2_GlobalDefReaderCallbacks_SetMetricClassCallback (_global_def_callbacks, &handler_DefMetricClass ); @@ -293,35 +303,67 @@ OTF2_CallbackCode ParserDefinitionOTF2::handler_DefGroup(void * /*userD OTF2_GroupRef group_id, OTF2_StringRef name_id, OTF2_GroupType type, - OTF2_Paradigm /*paradigm*/, - OTF2_GroupFlag /*flags*/, - uint32_t /*numberOfMembers*/, - const uint64_t */*members*/) { - switch(type) { - case OTF2_GROUP_TYPE_UNKNOWN: - break; - case OTF2_GROUP_TYPE_LOCATIONS: - cout << "New location group: group_id " << group_id << ", name_id" << name_id << endl; - break; - case OTF2_GROUP_TYPE_REGIONS: - cout << "New region group: group_id " << group_id << ", name_id" << name_id << endl; - break; - case OTF2_GROUP_TYPE_METRIC: - cout << "New metric group: group_id " << group_id << ", name_id" << name_id << endl; - break; - case OTF2_GROUP_TYPE_COMM_LOCATIONS: - cout << "New comm location group: group_id " << group_id << ", name_id" << name_id << endl; - break; - case OTF2_GROUP_TYPE_COMM_GROUP: - cout << "New comm group: group_id " << group_id << ", name_id" << name_id << endl; - break; - case OTF2_GROUP_TYPE_COMM_SELF: - cout << "New comm self: group_id " << group_id << ", name_id" << name_id << endl; - break; - default : - cout << "type " << type << " not yet handled" << endl; - } - cout<<"\tNot yet implemented\n"; + OTF2_Paradigm paradigm, + OTF2_GroupFlag flags, + uint32_t numberOfMembers, + const uint64_t *members) { + if(type == OTF2_GROUP_TYPE_COMM_LOCATIONS) { + struct OTF2_Group *g = new struct OTF2_Group(); + g->_id = group_id; + g->_name = name_id; + g->_type = type; + g->_paradigm = paradigm; + g->_flags = flags; + g->_members.resize(numberOfMembers); + g->_membersSize = numberOfMembers; + for(uint32_t i=0; i<numberOfMembers; i++) { + g->_members[i] = members[i]; + } + ParserDefinitionOTF2::_groups[group_id] = g; + } else { + switch(type) { + case OTF2_GROUP_TYPE_UNKNOWN: + break; + case OTF2_GROUP_TYPE_LOCATIONS: + cout << "New location group: group_id " << group_id << ", name_id" << name_id << endl; + break; + case OTF2_GROUP_TYPE_REGIONS: + cout << "New region group: group_id " << group_id << ", name_id" << name_id << endl; + break; + case OTF2_GROUP_TYPE_METRIC: + cout << "New metric group: group_id " << group_id << ", name_id" << name_id << endl; + break; + case OTF2_GROUP_TYPE_COMM_LOCATIONS: + cout << "New comm location group: group_id " << group_id << ", name_id" << name_id << endl; + break; + case OTF2_GROUP_TYPE_COMM_GROUP: + cout << "New comm group: group_id " << group_id << ", name_id" << name_id << endl; + break; + case OTF2_GROUP_TYPE_COMM_SELF: + cout << "New comm self: group_id " << group_id << ", name_id" << name_id << endl; + break; + default : + cout << "type " << type << " not yet handled" << endl; + } + cout<<"\tNot yet implemented\n"; + } + return OTF2_CALLBACK_SUCCESS; +} + + +OTF2_CallbackCode ParserDefinitionOTF2::handler_DefComm(void * /*userData*/, + OTF2_CommRef self, + OTF2_StringRef name, + OTF2_GroupRef group, + OTF2_CommRef parent) +{ + // defines an MPI communicator + struct OTF2_Comm* c = new struct OTF2_Comm(); + c->_id = self; + c->_name = name; + c->_group = group; + c->_parent = parent; + ParserDefinitionOTF2::_comms[self] = c; return OTF2_CALLBACK_SUCCESS; } @@ -419,6 +461,28 @@ OTF2_Location* ParserDefinitionOTF2::get_location_by_id(const OTF2_LocationRef i return ParserDefinitionOTF2::_location[id]; } +OTF2_Location* ParserDefinitionOTF2::get_location_in_communicator(const OTF2_CommRef comm, + uint32_t rank) { + struct OTF2_Comm * c= _comms[comm]; + if(!c) { + cerr<<"Error: cannot find communicator "<<comm<<endl; + abort(); + } + + struct OTF2_Group *g= _groups[c->_group]; + if(!g) { + cerr<<"Error: cannot find rank "<<rank<<" in communicator "<<comm<<endl; + abort(); + } + + if(rank > g->_members.size()) { + cerr<<"Error: searching for rank "<<rank<<" in communicator "<<comm<<", but comm_size="<<g->_members.size()<<", memberSize="<<g->_membersSize<<endl; + *(int*)0=0; + abort(); + } + return get_location_by_id(g->_members[rank]); +} + OTF2_Function ParserDefinitionOTF2::get_function_by_id(const uint32_t id) { return ParserDefinitionOTF2::_functions[id]; } diff --git a/src/parser/OTF2Parser/ParserDefinitionOTF2.hpp b/src/parser/OTF2Parser/ParserDefinitionOTF2.hpp index b0de4edf1b908ba7a4179c1f82bdcdcd2d7e2faa..7452d046442c5cb03b68a8b73cb03cced85ee143 100644 --- a/src/parser/OTF2Parser/ParserDefinitionOTF2.hpp +++ b/src/parser/OTF2Parser/ParserDefinitionOTF2.hpp @@ -165,6 +165,23 @@ struct OTF2_MetricClass { OTF2_RecorderKind _recorderKind; }; +struct OTF2_Group { + OTF2_GroupRef _id; + OTF2_StringRef _name; + OTF2_GroupType _type; + OTF2_Paradigm _paradigm; + OTF2_GroupFlag _flags; + std::vector<uint64_t> _members; + size_t _membersSize; +}; + +struct OTF2_Comm { + OTF2_CommRef _id; + OTF2_StringRef _name; + OTF2_GroupRef _group; + OTF2_CommRef _parent; +}; + /*! * * \class ParserDefinitionOTF2 @@ -194,6 +211,9 @@ private: static std::map<uint32_t, OTF2_Function > _functions; static std::map<uint32_t, const char *> _strings; + static std::map<OTF2_GroupRef, OTF2_Group*> _groups; + static std::map<OTF2_CommRef, OTF2_Comm*> _comms; + static uint64_t _ticks_per_second; static double _first_timestamp; @@ -238,6 +258,12 @@ private: uint32_t numberOfMembers, const uint64_t *members); + static OTF2_CallbackCode handler_DefComm(void * userData, + OTF2_CommRef self, + OTF2_StringRef name, + OTF2_GroupRef group, + OTF2_CommRef parent); + static OTF2_CallbackCode handler_DefMetricMember( void* userData, OTF2_MetricMemberRef self, @@ -362,6 +388,13 @@ public: */ static OTF2_Location *get_location_by_id(const OTF2_LocationRef id); + /*! + * \fn get_location_by_communicator(const OTF2_CommRef comm, uint32_t rank) + * \brief Search for the location that corresponds to an MPI rank in an MPI communicator + * \param id the id we want the corresponding location + * \return The location associated to rank + */ + static OTF2_Location *get_location_in_communicator(const OTF2_CommRef comm, uint32_t rank); /*! * \fn get_function_by_id(const uint32_t id) @@ -371,6 +404,22 @@ public: */ static OTF2_Function get_function_by_id(const uint32_t id); + /*! + * \fn get_group_by_id(const OTF2_GroupRef id) + * \brief Accessor for the function map + * \param id the id we want the corresponding group + * \return The OTF2_Group associated to id + */ + static OTF2_Group* get_group_by_id(OTF2_GroupRef id); + + /*! + * \fn get_comm_by_id(const OTF2_CommRef id) + * \brief Accessor for the function map + * \param id the id we want the corresponding comm + * \return The OTF2_Comm associated to id + */ + static OTF2_Comm* get_comm_by_id(OTF2_CommRef id); + /*! * \fn get_ticks_per_second() * \brief Accessor for the tick_per_second (equivalent to a time unit) diff --git a/src/parser/OTF2Parser/ParserEventOTF2.cpp b/src/parser/OTF2Parser/ParserEventOTF2.cpp index 23753c6ec3dcec9ce6deea3fdf9d37c51210968f..51db6634ec7e9a46909579820d657aa6ba182683 100644 --- a/src/parser/OTF2Parser/ParserEventOTF2.cpp +++ b/src/parser/OTF2Parser/ParserEventOTF2.cpp @@ -314,7 +314,7 @@ OTF2_CallbackCode ParserEventOTF2::callback_MpiSend(OTF2_LocationRef sender, Date d = ParserDefinitionOTF2::get_timestamp(time); OTF2_Location *temp_sender = ParserDefinitionOTF2::get_location_by_id(sender); - OTF2_Location *temp_receiver = ParserDefinitionOTF2::get_location_by_id(receiver); + OTF2_Location *temp_receiver = ParserDefinitionOTF2::get_location_in_communicator(communicator, receiver); // The sender process may have no ancestor, so let's say that his ancestor is himself OTF2_Location *temp_ancestor = temp_sender; @@ -432,7 +432,7 @@ OTF2_CallbackCode ParserEventOTF2::callback_MpiRecv(OTF2_LocationRef receiver, Trace *t = (Trace *)userData; Date d = ParserDefinitionOTF2::get_timestamp(time); - OTF2_Location *temp_sender = ParserDefinitionOTF2::get_location_by_id(sender); + OTF2_Location *temp_sender = ParserDefinitionOTF2::get_location_in_communicator(communicator, sender); OTF2_Location *temp_receiver = ParserDefinitionOTF2::get_location_by_id(receiver); // The sender process may have no ancestor, so let's say that his ancestor is himself OTF2_Location *temp_ancestor = temp_sender;