source: XIOS3/trunk/src/mpi_tools.cpp @ 2580

Last change on this file since 2580 was 2580, checked in by ymipsl, 9 months ago

Tracking unfree MPI windows and communicators.

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 2.3 KB
Line 
1#include "mpi.hpp"
2#include "backtrace.hpp"
3#include "exception.hpp"
4#include "log.hpp"
5#include <string>
6#include <sstream>
7
8namespace xios 
9{
10  std::map<MPI_Comm,string> CCommTrack::commTrack_ ;
11  void CCommTrack::registerComm(const MPI_Comm& comm)
12  {
13    if (comm!=MPI_COMM_NULL)
14    {
15      auto it = commTrack_.find(comm) ;
16      if (it == commTrack_.end())  commTrack_[comm] = MemTrack::backTrace(3);
17      else ERROR("CCommtrack::registerComm", << "Communicator already allocated : " << endl<<it->second)
18    }
19  }
20
21  void CCommTrack::releaseComm(const MPI_Comm& comm)
22  {
23    auto it = commTrack_.find(comm) ;
24    if (it == commTrack_.end())  info(100)<<"WARNING : CCommtrack::releaseComm => Communicator not allocated !" << endl ;
25    else commTrack_.erase(it) ;
26  }
27
28  void CCommTrack::dumpComm(void)
29  {
30    ostringstream ostr ;
31    ostr<<" LIST of UNFREED MPI COMMUNICATORS"<<endl ;
32    for(auto& it : commTrack_ )
33    {
34      ostr<<"---------------------------"<<endl ;
35      ostr<<" -- unfreed communicator --"<<endl ;
36      ostr<<" --       backtrace      --"<<endl ;
37      ostr<<it.second<<endl ;
38    }
39    info(100)<<ostr.str() ;
40  }
41
42  int MPI_Bcast_string(std::string& str, int root, MPI_Comm comm) 
43  {
44    int commRank ;
45    int ret ;
46    MPI_Comm_rank(comm,&commRank) ;
47    int strSize ;
48    if (commRank==root) strSize=str.size() ;
49    MPI_Bcast(&strSize,1,MPI_INT,root,comm) ;
50 
51    if (commRank==root) ret=MPI_Bcast((char*)str.data(), strSize, MPI_CHAR, root, comm) ;
52    else
53    {
54      char* tmp=new char[strSize] ;
55      ret=MPI_Bcast(tmp, strSize, MPI_CHAR, root, comm) ;
56      str=std::string(tmp,strSize) ;
57      delete [] tmp ;
58    }
59    return ret ;
60  }
61
62  template<>
63  MPI_Datatype MPI_GetType<bool>(void) { return MPI_CXX_BOOL ;}
64
65  template<>
66  MPI_Datatype MPI_GetType<char>(void) { return MPI_CHAR ;}
67
68  template<>
69  MPI_Datatype MPI_GetType<short int>(void) { return MPI_SHORT ;}
70
71  template<>
72  MPI_Datatype MPI_GetType<int>(void) { return MPI_INT ;}
73
74  template<>
75  MPI_Datatype MPI_GetType<size_t>(void) { return MPI_SIZE_T ;}
76
77  template<>
78  MPI_Datatype MPI_GetType<float>(void) { return MPI_FLOAT ;}
79
80  template<>
81  MPI_Datatype MPI_GetType<double>(void) { return MPI_DOUBLE ;}
82
83  template<>
84  MPI_Datatype MPI_GetType<long double>(void) { return MPI_LONG_DOUBLE ;}
85
86}
Note: See TracBrowser for help on using the repository browser.