Changeset 655


Ignore:
Timestamp:
07/24/15 16:40:07 (9 years ago)
Author:
rlacroix
Message:

Properly release all MPI resources.

Location:
XIOS/trunk/src
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/client.cpp

    r597 r655  
    1717    MPI_Comm CClient::intraComm ; 
    1818    MPI_Comm CClient::interComm ; 
     19    std::list<MPI_Comm> CClient::contextInterComms; 
    1920    int CClient::serverLeader ; 
    2021    bool CClient::is_MPI_Initialized ; 
     
    128129        { 
    129130          if (!is_MPI_Initialized) oasis_init(codeId) ; 
    130           oasis_get_localcomm(intraComm) ; 
    131         } 
    132         else MPI_Comm_dup(localComm,&intraComm) ; 
     131          oasis_get_localcomm(localComm) ; 
     132        } 
     133        MPI_Comm_dup(localComm,&intraComm) ; 
     134 
    133135        CTimer::get("XIOS").resume() ; 
    134136        CTimer::get("XIOS init").resume() ; 
     
    191193 
    192194        context->initClient(contextComm,contextInterComm) ; 
     195 
     196        contextInterComms.push_back(contextInterComm); 
     197        MPI_Comm_free(&inter); 
    193198      } 
    194199      else 
     
    206211        // Finally, we should return current context to context client 
    207212        CContext::setCurrent(id); 
    208 //        context->initServer(contextComm,contextInterComm) ; 
     213 
     214        contextInterComms.push_back(contextInterComm); 
    209215      } 
    210216    } 
     
    223229      } 
    224230 
    225      CTimer::get("XIOS finalize").suspend() ; 
    226      CTimer::get("XIOS").suspend() ; 
     231      for (std::list<MPI_Comm>::iterator it = contextInterComms.begin(); it != contextInterComms.end(); it++) 
     232        MPI_Comm_free(&(*it)); 
     233      MPI_Comm_free(&interComm); 
     234      MPI_Comm_free(&intraComm); 
     235 
     236      CTimer::get("XIOS finalize").suspend() ; 
     237      CTimer::get("XIOS").suspend() ; 
    227238 
    228239      if (!is_MPI_Initialized) 
  • XIOS/trunk/src/client.hpp

    r591 r655  
    1616        static MPI_Comm intraComm; 
    1717        static MPI_Comm interComm; 
     18        static std::list<MPI_Comm> contextInterComms; 
    1819        static int serverLeader; 
    1920        static bool is_MPI_Initialized ; 
  • XIOS/trunk/src/node/context.cpp

    r645 r655  
    248248     { 
    249249       MPI_Comm_dup(intraComm, &intraCommServer); 
     250       comms.push_back(intraCommServer); 
    250251       MPI_Comm_dup(interComm, &interCommServer); 
     252       comms.push_back(interCommServer); 
    251253     } 
    252254     server = new CContextServer(this,intraCommServer,interCommServer); 
     
    303305     { 
    304306       MPI_Comm_dup(intraComm, &intraCommClient); 
     307       comms.push_back(intraCommClient); 
    305308       MPI_Comm_dup(interComm, &interCommClient); 
     309       comms.push_back(interCommClient); 
    306310     } 
    307311     client = new CContextClient(this,intraCommClient,interCommClient, cxtClient); 
     
    338342          closeAllFile(); 
    339343        } 
     344 
     345        for (std::list<MPI_Comm>::iterator it = comms.begin(); it != comms.end(); ++it) 
     346          MPI_Comm_free(&(*it)); 
     347        comms.clear(); 
    340348      } 
    341349   } 
  • XIOS/trunk/src/node/context.hpp

    r645 r655  
    219219         StdString idServer_; 
    220220         CGarbageCollector garbageCollector; 
    221  
     221         std::list<MPI_Comm> comms; //!< Communicators allocated internally 
    222222 
    223223      public: // Some function maybe removed in the near future 
  • XIOS/trunk/src/server.cpp

    r597 r655  
    1818    MPI_Comm CServer::intraComm ; 
    1919    list<MPI_Comm> CServer::interComm ; 
     20    std::list<MPI_Comm> CServer::contextInterComms; 
    2021    bool CServer::isRoot ; 
    2122    int CServer::rank = INVALID_RANK; 
     
    110111 
    111112        CTimer::get("XIOS").resume() ; 
    112         oasis_get_localcomm(intraComm) ; 
     113        MPI_Comm localComm; 
     114        oasis_get_localcomm(localComm); 
     115        MPI_Comm_dup(localComm, &intraComm); 
     116 
    113117        MPI_Comm_rank(intraComm,&rank) ; 
    114118        MPI_Comm_size(intraComm,&size) ; 
     
    144148    { 
    145149      CTimer::get("XIOS").suspend() ; 
    146        
     150 
    147151      delete eventScheduler ; 
    148        
     152 
     153      for (std::list<MPI_Comm>::iterator it = contextInterComms.begin(); it != contextInterComms.end(); it++) 
     154        MPI_Comm_free(&(*it)); 
     155      for (std::list<MPI_Comm>::iterator it = interComm.begin(); it != interComm.end(); it++) 
     156        MPI_Comm_free(&(*it)); 
     157      MPI_Comm_free(&intraComm); 
     158 
    149159      if (!is_MPI_Initialized) 
    150160      { 
     
    198208              MPI_Recv(&msg,1,MPI_INT,0,0,*it,&status) ; 
    199209              info(20)<<" CServer : Receive client finalize"<<endl ; 
     210              MPI_Comm_free(&(*it)); 
    200211              interComm.erase(it) ; 
    201212              break ; 
     
    361372 
    362373 
    363      void CServer::registerContext(void* buff,int count, int leaderRank) 
    364      { 
    365  
     374     void CServer::registerContext(void* buff, int count, int leaderRank) 
     375     { 
    366376       string contextId; 
    367        CBufferIn buffer(buff,count) ; 
    368  
    369        buffer>>contextId ; 
    370        MPI_Comm contextIntercomm ; 
    371        MPI_Intercomm_create(intraComm,0,CXios::globalComm,leaderRank,10+leaderRank,&contextIntercomm) ; 
    372  
    373        info(20)<<"CServer : Register new Context : "<<contextId<<endl  ; 
    374        MPI_Comm inter ; 
    375        MPI_Intercomm_merge(contextIntercomm,1,&inter) ; 
    376        MPI_Barrier(inter) ; 
     377       CBufferIn buffer(buff, count); 
     378       buffer >> contextId; 
     379 
     380       info(20)<<"CServer : Register new Context : "<<contextId<<endl; 
     381 
    377382       if (contextList.find(contextId)!=contextList.end()) 
    378383        ERROR("void CServer::registerContext(void* buff,int count, int leaderRank)", 
    379               <<"Context has already been registred") ; 
    380  
    381       CContext* context=CContext::create(contextId) ; 
    382       contextList[contextId]=context ; 
    383       context->initServer(intraComm,contextIntercomm) ; 
    384  
     384              << "Context has already been registred"); 
     385 
     386       MPI_Comm contextIntercomm; 
     387       MPI_Intercomm_create(intraComm,0,CXios::globalComm,leaderRank,10+leaderRank,&contextIntercomm); 
     388 
     389       MPI_Comm inter; 
     390       MPI_Intercomm_merge(contextIntercomm,1,&inter); 
     391       MPI_Barrier(inter); 
     392 
     393       CContext* context=CContext::create(contextId); 
     394       contextList[contextId]=context; 
     395       context->initServer(intraComm,contextIntercomm); 
     396 
     397       contextInterComms.push_back(contextIntercomm); 
     398       MPI_Comm_free(&inter); 
    385399     } 
    386400 
  • XIOS/trunk/src/server.hpp

    r591 r655  
    2525        static MPI_Comm intraComm; 
    2626        static list<MPI_Comm> interComm; 
     27        static std::list<MPI_Comm> contextInterComms; 
    2728        static CEventScheduler* eventScheduler; 
    2829 
  • XIOS/trunk/src/test/test_client.f90

    r654 r655  
    133133  DEALLOCATE(lon, lat, field_A, lonvalue) 
    134134 
     135  CALL MPI_COMM_FREE(comm, ierr) 
     136 
    135137  CALL xios_finalize() 
    136138 
  • XIOS/trunk/src/test/test_complete.f90

    r654 r655  
    264264!!! Fin de XIOS 
    265265 
     266    CALL MPI_COMM_FREE(comm, ierr) 
     267 
    266268    CALL xios_finalize() 
    267269 
  • XIOS/trunk/src/test/test_cs.f90

    r654 r655  
    145145    DEALLOCATE(mask) 
    146146 
     147    CALL MPI_COMM_FREE(comm, ierr) 
     148 
    147149    CALL xios_finalize() 
    148150 
  • XIOS/trunk/src/test/test_new_features.f90

    r654 r655  
    178178  DEALLOCATE(mask) 
    179179 
     180  CALL MPI_COMM_FREE(comm, ierr) 
     181 
    180182  CALL xios_finalize() 
    181183 
  • XIOS/trunk/src/test/test_unstruct_complete.f90

    r654 r655  
    238238  DEALLOCATE(data_i_index) 
    239239 
    240     CALL xios_finalize() 
     240  CALL MPI_COMM_FREE(comm, ierr) 
     241 
     242  CALL xios_finalize() 
    241243 
    242244  END PROGRAM test_unstruct_complete 
  • XIOS/trunk/src/test/test_xios_interface.f90

    r654 r655  
    345345!!! Fin de XIOS 
    346346 
     347    CALL MPI_COMM_FREE(comm, ierr) 
     348 
    347349    CALL xios_finalize() 
    348350 
Note: See TracChangeset for help on using the changeset viewer.