Changeset 2230 for XIOS


Ignore:
Timestamp:
09/14/21 15:17:59 (3 years ago)
Author:
ymipsl
Message:

Fix some Dead-lock issue...
YM

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/src
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.cpp

    r2223 r2230  
    5656  //  { 
    5757      //if (!isAttachedModeEnabled()) eventScheduler_=CXios::getPoolRessource()->getService(contextInfo.serviceId,contextInfo.partitionId)->getEventScheduler() ; 
    58       eventScheduler_=CXios::getPoolRessource()->getService(contextInfo.serviceId,contextInfo.partitionId)->getEventScheduler() ; 
    59  
     58    eventScheduler_=CXios::getPoolRessource()->getService(contextInfo.serviceId,contextInfo.partitionId)->getEventScheduler() ; 
     59    MPI_Comm_dup(intraComm, &processEventBarrier_) ; 
    6060  //  } 
    6161 
     
    9292        } 
    9393        else MPI_Comm_split(interCommMerged, interCommMergedRank, rank, &winComm); 
    94         MPI_Comm_free(&winComm) ; 
     94//       ym : Warning : intelMPI doesn't support that communicator of windows be deallocated before the windows deallocation, crash at MPI_Win_lock 
     95//            Bug or not ?           
     96        // MPI_Comm_free(&winComm) ; 
    9597      } 
    9698    } 
     
    346348        else if (isAttachedModeEnabled() || eventScheduler_->queryEvent(currentTimeLine,hashId) ) 
    347349        { 
    348           MPI_Request req ; 
    349           MPI_Status status ; 
    350  
    351           MPI_Ibarrier(intraComm,&req) ; 
    352           int flag=false ; 
    353           do   
     350 
     351          if (!eventScheduled_)  
    354352          { 
    355             eventScheduler_->checkEvent()  ; 
    356             MPI_Test(&req,&flag,&status) ; 
    357           } while (!flag) ; 
    358  
     353            MPI_Ibarrier(processEventBarrier_,&processEventRequest_) ; 
     354            eventScheduled_=true ; 
     355            return ; 
     356          } 
     357          else  
     358          { 
     359            MPI_Status status ; 
     360            int flag ; 
     361            MPI_Test(&processEventRequest_, &flag, &status) ; 
     362            if (!flag) return ; 
     363            eventScheduled_=false ; 
     364          } 
     365 
     366          if (!isAttachedModeEnabled()) eventScheduler_->popEvent() ; 
    359367          //MPI_Barrier(intraComm) ; 
    360368         // When using attached mode, synchronise the processes to avoid that differents event be scheduled by differents processes 
     
    469477    } 
    470478  } 
     479 
     480  bool CContextServer::isCollectiveEvent(CEventServer& event) 
     481  { 
     482    if (event.classId==CField::GetType()) return CField::isCollectiveEvent(event); 
     483    else return true ; 
     484  } 
    471485} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.hpp

    r2130 r2230  
    2626    bool hasFinished(void); 
    2727    void dispatchEvent(CEventServer& event) ; 
     28    bool isCollectiveEvent(CEventServer& event) ; 
    2829    void setPendingEvent(void) ; 
    2930    bool hasPendingEvent(void) ; 
     
    6768 
    6869    private: 
     70 
    6971      std::map<int, StdSize> mapBufferSize_; 
    7072      vector<MPI_Win> windows ; //! one sided mpi windows to expose client buffers to servers ; No memory will be attached on server side. 
     
    7375      CContextClient* associatedClient_ ; 
    7476      size_t remoteHashId_; //!< the hash is of the calling context client 
     77       
     78      MPI_Comm processEventBarrier_ ; 
     79      bool eventScheduled_=false; 
     80      MPI_Request processEventRequest_ ; 
    7581  } ; 
    7682 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.cpp

    r2022 r2230  
    9898    if (! eventStack.empty() && eventStack.front().first==timeLine && eventStack.front().second==contextHashId) 
    9999    { 
    100       eventStack.pop() ; 
     100      //eventStack.pop() ; 
    101101      return true ; 
    102102    } 
    103103    else return false ;  
    104104  }  
    105    
     105  
    106106  void CEventScheduler::checkEvent(void) 
    107107  { 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/event_scheduler.hpp

    r1639 r2230  
    5252        */     
    5353       bool queryEvent(const size_t timeLine, const size_t contextHashId) ; 
     54       void popEvent() { eventStack.pop() ; } 
    5455 
    5556 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/server_context.cpp

    r2220 r2230  
    216216      if (eventScheduler->queryEvent(currentTimeLine,hashId)) 
    217217      { 
     218        eventScheduler->popEvent() ; 
    218219        if (notifyInType_==NOTIFY_CREATE_INTERCOMM) createIntercomm() ; 
    219220        hasNotification_=false ; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/manager/services.cpp

    r2220 r2230  
    181181      if (eventScheduler_->queryEvent(currentTimeLine,hashId)) 
    182182      { 
     183        eventScheduler_->popEvent() ; 
    183184        if (notifyInType_==NOTIFY_CREATE_CONTEXT) createContext() ; 
    184185        hasNotification_=false ; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp

    r2209 r2230  
    612612    {  
    613613      finished=eventLoop(enableEventsProcessing) ; 
    614       if (serviceType_==CServicesManager::CLIENT) out = eventScheduler_->queryEvent(timeLine,hashId_) ; 
     614      if (serviceType_==CServicesManager::CLIENT)  
     615      {   
     616        out = eventScheduler_->queryEvent(timeLine,hashId_) ; 
     617        if (out) eventScheduler_->popEvent() ; 
     618      } 
     619 
    615620      else out=true ; 
    616621    }  while(!out) ; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp

    r2206 r2230  
    135135  } 
    136136  CATCH 
    137  
     137   
     138  bool CField::isCollectiveEvent(CEventServer& event) 
     139  TRY 
     140  { 
     141    switch(event.type) 
     142    { 
     143      case EVENT_ID_UPDATE_DATA : 
     144        recvUpdateData(event); 
     145        return true; 
     146        break; 
     147 
     148      case EVENT_ID_READ_DATA : 
     149        recvReadDataRequest(event); 
     150        return true; 
     151        break; 
     152 
     153      case EVENT_ID_READ_DATA_READY : 
     154        recvReadDataReady(event); 
     155        return false; 
     156        break; 
     157 
     158      case EVENT_ID_ADD_VARIABLE : 
     159        recvAddVariable(event); 
     160        return false; 
     161        break; 
     162 
     163      case EVENT_ID_ADD_VARIABLE_GROUP : 
     164        recvAddVariableGroup(event); 
     165        return false; 
     166        break; 
     167      
     168      case EVENT_ID_GRID_COMPLETED : 
     169        recvGridCompleted(event); 
     170        return true; 
     171        break; 
     172      default : 
     173        ERROR("bool CField::dispatchEvent(CEventServer& event)", << "Unknown Event"); 
     174        return false; 
     175    } 
     176  } 
     177  CATCH 
    138178 
    139179  void CField::recvUpdateData(CEventServer& event) 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp

    r2206 r2230  
    179179        template <int N> void setData(const CArray<double, N>& _data); 
    180180        static bool dispatchEvent(CEventServer& event); 
     181        static bool isCollectiveEvent(CEventServer& event); 
    181182        void sendAllAttributesToServer(CContextClient* client) ;  
    182183         
Note: See TracChangeset for help on using the changeset viewer.