Changeset 492 for XIOS/trunk


Ignore:
Timestamp:
10/02/14 17:34:02 (10 years ago)
Author:
ymipsl
Message:

Add event scheduler functionnality in order to schedule events from different context, that cause Deadlock or crash when using collective MPI communication in netcdf/hdf5 library.

YM

Location:
XIOS/trunk/src
Files:
2 added
5 edited

Legend:

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

    r489 r492  
    1414#include "timer.hpp" 
    1515#include "cxios.hpp" 
     16#include "event_scheduler.hpp" 
     17#include "server.hpp" 
     18#include <boost/functional/hash.hpp> 
    1619 
    1720 
     
    3235    else  MPI_Comm_size(interComm,&commSize) ; 
    3336    currentTimeLine=0 ; 
     37    scheduled=false ; 
    3438    finished=false ; 
     39     
     40    boost::hash<string> hashString ; 
     41    hashId=hashString(context->getId()) ; 
     42 
    3543  } 
    3644  void CContextServer::setPendingEvent(void) 
     
    150158    { 
    151159      event=it->second ; 
     160       
    152161      if (event->isFull()) 
    153162      { 
     163        if (!scheduled && !CXios::isServer) 
     164        { 
     165          CServer::eventScheduler->registerEvent(currentTimeLine,hashId) ;   
     166          scheduled=true ; 
     167        } 
     168        else if (CXios::isServer || CServer::eventScheduler->queryEvent(currentTimeLine,hashId) )  
     169        { 
    154170         CTimer::get("Process events").resume() ; 
    155171         dispatchEvent(*event) ; 
     
    159175         events.erase(it) ; 
    160176         currentTimeLine++ ; 
    161        } 
    162      } 
    163    } 
     177         scheduled = false ; 
     178        } 
     179      } 
     180    } 
     181  } 
    164182 
    165183  CContextServer::~CContextServer() 
  • XIOS/trunk/src/context_server.hpp

    r382 r492  
    4141    bool finished ; 
    4242    bool pendingEvent ; 
     43    bool scheduled  ;    /*!< event of current timeline is alreading scheduled ? */ 
     44    size_t hashId ; 
    4345    ~CContextServer() ;     
    4446  } ; 
  • XIOS/trunk/src/server.cpp

    r491 r492  
    1212#include "tracer.hpp" 
    1313#include "timer.hpp" 
     14#include "event_scheduler.hpp" 
    1415 
    1516namespace xios 
     
    2324    bool CServer::finished=false ; 
    2425    bool CServer::is_MPI_Initialized ; 
     26    CEventScheduler* CServer::eventScheduler ; 
    2527 
    2628    void CServer::initialize(void) 
     
    8688           { 
    8789             clientLeader=it->second ; 
     90             int intraCommSize, intraCommRank ; 
     91             MPI_Comm_size(intraComm,&intraCommSize) ; 
     92             MPI_Comm_rank(intraComm,&intraCommRank) ; 
     93             cout<<"intercommCreate::server "<<rank<<" intraCommSize : "<<intraCommSize 
     94                 <<" intraCommRank :"<<intraCommRank<<"  clientLeader "<< clientLeader<<endl ; 
    8895 
    8996             MPI_Intercomm_create(intraComm,0,CXios::globalComm,clientLeader,0,&newComm) ; 
     
    122129          interComm.push_back(newComm) ; 
    123130        } 
    124         oasis_enddef() ; 
     131              oasis_enddef() ; 
    125132      } 
    126133 
     
    129136      if (rank==0) isRoot=true; 
    130137      else isRoot=false; 
    131 //      eventLoop() ; 
    132 //      finalize() ; 
     138       
     139      eventScheduler = new CEventScheduler(intraComm) ; 
    133140    } 
    134141 
     
    136143    { 
    137144      CTimer::get("XIOS").suspend() ; 
     145       
     146      delete eventScheduler ; 
     147       
    138148      if (!is_MPI_Initialized) 
    139149      { 
     
    166176         contextEventLoop() ; 
    167177         if (finished && contextList.empty()) stop=true ; 
     178         if (! CXios::isServer) eventScheduler->checkEvent() ; 
    168179       } 
    169180       CTimer::get("XIOS server").suspend() ; 
  • XIOS/trunk/src/server.hpp

    r490 r492  
    55#include "context.hpp" 
    66#include "mpi.hpp" 
     7#include "event_scheduler.hpp" 
    78 
    89namespace xios 
     
    2526       static MPI_Comm intraComm ; 
    2627       static list<MPI_Comm> interComm ; 
     28       static CEventScheduler* eventScheduler ; 
    2729 
    2830       struct contextMessage 
  • XIOS/trunk/src/xmlioserver_spl.hpp

    r490 r492  
    2020#include <map> 
    2121#include <deque> 
     22#include <queue> 
    2223#include <valarray> 
    2324// Flux. 
Note: See TracChangeset for help on using the changeset viewer.