Ignore:
Timestamp:
04/20/21 09:49:47 (3 years ago)
Author:
ymipsl
Message:

New management of client-server buffers.

  • buffers can grow automatically in intialization phase
  • buffers is evaluated after the close context definition phase and fixed at optimal value.

YM

File:
1 edited

Legend:

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

    r1757 r2130  
    77#include "mpi.hpp" 
    88#include "tracer.hpp" 
     9#include "timeline_events.hpp" 
    910 
    1011namespace xios 
     
    200201   
    201202    lockBuffer(); 
     203    count=*bufferCount[current] ; 
     204     
     205    if (resizingBufferStep_ > 0 ) return false ; 
     206 
    202207    if (size > bufferSize) 
    203       ERROR("bool CClientBuffer::isBufferFree(StdSize size)", 
    204             << "The requested size (" << size << " bytes) is too big to fit the buffer (" << bufferSize << " bytes), please increase the client buffer size." << endl); 
     208    { 
     209      // ERROR("bool CClientBuffer::isBufferFree(StdSize size)", 
     210      //      << "The requested size (" << size << " bytes) is too big to fit the buffer (" << bufferSize << " bytes), please increase the client buffer size." << endl); 
     211      resizingBufferStep_=1 ; 
     212      newBufferSize_=size ; 
     213      return false ; 
     214    } 
    205215 
    206216    if (size > maxEventSize) 
     
    214224      if (size > maxRequestSize) maxRequestSize = size; 
    215225    } 
    216  
    217       count=*bufferCount[current] ; 
    218       return (size <= remain()); 
     226     
     227    if (size > remain()) 
     228    { 
     229      if (isGrowableBuffer_) 
     230      { 
     231        resizingBufferStep_ = 1 ; 
     232        newBufferSize_ = (count+size)*growFactor_ ; 
     233      }   
     234      return false ; 
     235    } 
     236    else return true ; 
    219237  } 
    220238 
     
    276294    if (!pending) 
    277295    { 
    278       if (!send) return false ; 
     296      if (!send && resizingBufferStep_==0 ) return false ; 
     297 
    279298      if (count > 0) 
    280299      { 
     
    284303        { 
    285304          MPI_Issend(buffer[current], count, MPI_CHAR, serverRank, 20, interComm, &request); 
     305          if (resizingBufferStep_==3) resizingBufferStep_=0 ; 
    286306          pending = true; 
    287307//          *control[current]=0 ; 
     
    295315          count = 0; 
    296316        } 
    297         else unlockBuffer() ; 
     317        else  
     318        { 
     319          unlockBuffer() ; 
     320        } 
    298321      } 
     322      else 
     323      { 
     324        if (resizingBufferStep_==2) resizeBuffer(newBufferSize_) ; 
     325        if (resizingBufferStep_==1) resizeBufferNotify() ; 
     326      } 
    299327    } 
    300328 
    301329    return pending; 
     330  } 
     331 
     332  void CClientBuffer::resizeBufferNotify(void) 
     333  { 
     334    // notify server of changing buffers size 
     335    lockBuffer() ; 
     336    int size=sizeof(int)+sizeof(size_t) ; 
     337    CBufferOut* bufOut = this->getBuffer(timelineEventNotifyChangeBufferSize, size); 
     338    bufOut->put(size); 
     339    bufOut->put(timelineEventNotifyChangeBufferSize); 
     340    resizingBufferStep_ = 2 ; 
     341    unlockBuffer() ; 
     342  } 
     343 
     344  void CClientBuffer::resizeBuffer(size_t newSize) 
     345  { 
     346    if (hasWindows) 
     347    {  
     348      MPI_Win_detach(windows_[0], bufferHeader[0]) ; 
     349      MPI_Win_detach(windows_[1], bufferHeader[1]) ; 
     350    } 
     351    MPI_Free_mem(bufferHeader[0]) ; 
     352    MPI_Free_mem(bufferHeader[1]) ; 
     353 
     354    bufferSize=newSize ; 
     355    MPI_Alloc_mem(bufferSize+headerSize, MPI_INFO_NULL, &bufferHeader[0]) ; 
     356    MPI_Alloc_mem(bufferSize+headerSize, MPI_INFO_NULL, &bufferHeader[1]) ; 
     357    buffer[0] = bufferHeader[0]+headerSize ; 
     358    buffer[1] = bufferHeader[1]+headerSize ; 
     359    firstTimeLine[0]=(size_t*)bufferHeader[0] ; 
     360    firstTimeLine[1]=(size_t*)bufferHeader[1] ; 
     361    bufferCount[0]=(size_t*)bufferHeader[0] +1 ; 
     362    bufferCount[1]=(size_t*)bufferHeader[1] +1 ; 
     363    control[0]=(size_t*)bufferHeader[0] +2 ; 
     364    control[1]=(size_t*)bufferHeader[1] +2 ; 
     365    finalize[0]=(size_t*)bufferHeader[0] +3 ; 
     366    finalize[1]=(size_t*)bufferHeader[1] +3 ; 
     367 
     368    *firstTimeLine[0]=0 ; 
     369    *firstTimeLine[1]=0 ; 
     370    *bufferCount[0]=0 ; 
     371    *bufferCount[1]=0 ; 
     372    *control[0]=0 ; 
     373    *control[1]=0 ; 
     374    *finalize[0]=0 ; 
     375    *finalize[1]=0 ; 
     376    winState[0]=false ; 
     377    winState[1]=false ; 
     378    current=0 ; 
     379     
     380    if (hasWindows) 
     381    {   
     382     
     383      MPI_Win_attach(windows_[0], bufferHeader[0], bufferSize+headerSize) ; 
     384      MPI_Win_attach(windows_[1], bufferHeader[1], bufferSize+headerSize) ; 
     385           
     386      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, clientRank_, 0, windows_[0]) ; 
     387      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, clientRank_, 0, windows_[1]) ; 
     388 
     389      MPI_Win_unlock(clientRank_, windows_[1]) ; 
     390      MPI_Win_unlock(clientRank_, windows_[0]) ; 
     391    }  
     392 
     393    lockBuffer() ; 
     394  
     395    int size=sizeof(int)+2*sizeof(size_t)+2*sizeof(MPI_AINT) ; 
     396    CBufferOut* bufOut = this->getBuffer(timelineEventChangeBufferSize, size); 
     397    bufOut->put(size); 
     398    bufOut->put(timelineEventChangeBufferSize); 
     399    bufOut->put(newBufferSize_); 
     400    bufOut->put(this->getWinAddress(0)); 
     401    bufOut->put(this->getWinAddress(1)); 
     402 
     403    resizingBufferStep_=3; 
     404    unlockBuffer() ; 
    302405  } 
    303406 
Note: See TracChangeset for help on using the changeset viewer.