Ignore:
Timestamp:
11/17/21 16:56:04 (3 years ago)
Author:
ymipsl
Message:

Improvment of one-sided protocol.
Windows are now created in the flight for each client-server connection.
YM

File:
1 edited

Legend:

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

    r2258 r2259  
    5050      computeLeader(clientRank, clientSize, serverSize, ranksServerLeader, ranksServerNotLeader); 
    5151 
    52       if (flag) MPI_Intercomm_merge(interComm_,false, &interCommMerged) ; 
    53        
    54       if (!isAttachedModeEnabled()) 
    55       {   
    56  
    57         CTimer::get("create Windows").resume() ; 
    58  
    59         // We create dummy pair of intercommunicator between clients and server 
    60         // Why ? Just because on openMPI, it reduce the creation time of windows otherwhise which increase quadratically 
    61         // We don't know the reason 
    62         double time ; 
    63         MPI_Comm commSelf ; 
    64         MPI_Comm_split(intraComm_,clientRank,clientRank, &commSelf) ; 
    65         MPI_Comm interComm ; 
    66         winComm_.resize(serverSize) ; 
    67         windows_.resize(serverSize) ; 
    68         for(int rank=0; rank<serverSize; rank++)  
    69         { 
    70           time=MPI_Wtime() ; 
    71           MPI_Intercomm_create(commSelf, 0, interCommMerged, clientSize+rank, 0, &interComm) ; 
    72           MPI_Intercomm_merge(interComm, false, &winComm_[rank]) ; 
    73           windows_[rank].resize(2) ; 
    74           MPI_Win_create_dynamic(MPI_INFO_NULL, winComm_[rank], &windows_[rank][0]); 
    75           MPI_Win_create_dynamic(MPI_INFO_NULL, winComm_[rank], &windows_[rank][1]);   
    76           time=MPI_Wtime()-time ; 
    77           info(100)<< "MPI_Win_create_dynamic : client to server rank "<<rank<<" => "<<time/1e-6<<" us"<<endl ; 
    78         } 
    79         MPI_Comm_free(&commSelf) ; 
    80         CTimer::get("create Windows").resume() ; 
    81      } 
     52      if (flag) MPI_Intercomm_merge(interComm_,false, &interCommMerged_) ; 
     53       
     54      MPI_Comm_split(intraComm_,clientRank,clientRank, &commSelf_) ; // for windows 
    8255 
    8356      auto time=chrono::system_clock::now().time_since_epoch().count() ; 
     
    338311      } 
    339312       
    340       vector<MPI_Win> Wins(2,MPI_WIN_NULL) ; 
    341       if (!isAttachedModeEnabled()) Wins=windows_[rank] ; 
    342    
    343       CClientBuffer* buffer = buffers[rank] = new CClientBuffer(interComm, Wins, clientRank, rank, mapBufferSize_[rank], maxEventSizes[rank]); 
     313      CClientBuffer* buffer = buffers[rank] = new CClientBuffer(interComm, rank, mapBufferSize_[rank], maxEventSizes[rank]); 
    344314      if (isGrowableBuffer_) buffer->setGrowableBuffer(1.2) ; 
    345315      else buffer->fixBuffer() ; 
     
    354324      bufOut->put(sendBuff, 4);  
    355325      buffer->checkBuffer(true); 
    356  
     326       
     327       // create windows dynamically for one-sided 
     328      if (!isAttachedModeEnabled()) 
     329      {  
     330        CTimer::get("create Windows").resume() ; 
     331        MPI_Comm interComm ; 
     332        MPI_Intercomm_create(commSelf_, 0, interCommMerged_, clientSize+rank, 0, &interComm) ; 
     333        MPI_Intercomm_merge(interComm, false, &winComm_[rank]) ; 
     334        MPI_Comm_free(&interComm) ; 
     335        windows_[rank].resize(2) ; 
     336        MPI_Win_create_dynamic(MPI_INFO_NULL, winComm_[rank], &windows_[rank][0]); 
     337        MPI_Win_create_dynamic(MPI_INFO_NULL, winComm_[rank], &windows_[rank][1]);    
     338        CTimer::get("create Windows").suspend() ; 
     339      } 
     340      else 
     341      { 
     342        winComm_[rank] = MPI_COMM_NULL ; 
     343        windows_[rank].resize(2) ; 
     344        windows_[rank][0] = MPI_WIN_NULL ; 
     345        windows_[rank][1] = MPI_WIN_NULL ; 
     346      } 
     347      buffer->attachWindows(windows_[rank]) ; 
    357348   } 
    358349 
     
    384375      if (!isAttachedModeEnabled()) 
    385376      {   
    386         for(int rank=0; rank<serverSize; rank++) 
    387         { 
     377        for(auto& it : winComm_) 
     378        { 
     379          int rank = it.first ; 
    388380          MPI_Win_free(&windows_[rank][0]); 
    389381          MPI_Win_free(&windows_[rank][1]); 
Note: See TracChangeset for help on using the changeset viewer.