Ignore:
Timestamp:
08/29/23 17:24:04 (10 months ago)
Author:
ymipsl
Message:

Major update :

  • New method to lock and unlock one-sided windows (window_dynamic) to avoid network overhead
  • Introducing multithreading on server sided to manage more efficiently dead-lock occuring (similar to co-routine which will be available and implemented in futur c++ standard), based on c++ threads
  • Suprression of old "attached mode" which is replaced by online writer and reder filters

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/trunk/src/manager/token_manager.hpp

    r2498 r2547  
    2626          memset( winBufferRetrieved_, 0, windowSize ); 
    2727        } 
     28        MPI_Win_lock_all(0, winCurrentToken_) ; 
     29        MPI_Win_lock_all(0, winRetrievedToken_) ; 
    2830      } 
    29  
     31       
     32      ~CTokenManager() 
     33      { 
     34        MPI_Win_unlock_all(winCurrentToken_) ; 
     35        MPI_Win_unlock_all(winRetrievedToken_) ; 
     36        MPI_Win_free(&winCurrentToken_) ; 
     37        MPI_Win_free(&winRetrievedToken_) ; 
     38      } 
     39       
    3040      size_t getToken(void) 
    3141      { 
    3242        size_t inc=1 ; 
    3343        size_t token ; 
    34         MPI_Win_lock(MPI_LOCK_EXCLUSIVE, leader_, 0, winCurrentToken_) ; 
    3544        MPI_Fetch_and_op(&inc, &token, MPI_SIZE_T, leader_, 0, MPI_SUM, winCurrentToken_) ; 
    36         MPI_Win_unlock(leader_, winCurrentToken_) ; 
     45        MPI_Win_flush(leader_, winCurrentToken_); 
    3746        return token ; 
    3847      } 
    3948 
    40       bool lockToken(size_t token) 
     49      bool checkToken(size_t token) 
    4150      { 
    4251        size_t tokenRead ; 
    43         MPI_Win_lock(MPI_LOCK_SHARED, leader_, 0, winRetrievedToken_) ; 
    44         MPI_Get(&tokenRead, 1, MPI_SIZE_T, leader_, 0, 1, MPI_SIZE_T, winRetrievedToken_ ) ; 
    45         MPI_Win_unlock(leader_, winRetrievedToken_) ; 
    46         if (token==tokenRead) return true ; 
    47         else return false ; 
     52        size_t inc=0 ; 
     53        MPI_Fetch_and_op(&inc, &tokenRead, MPI_SIZE_T, leader_, 0, MPI_NO_OP, winRetrievedToken_) ; 
     54        MPI_Win_flush(leader_, winRetrievedToken_); 
     55        return tokenRead==token ; 
    4856      } 
    49  
    50       void unlockToken(size_t token) 
     57       
     58      void updateToken(size_t token) 
     59      { 
     60        size_t inc=1 ; 
     61        size_t tokenRead ; 
     62        MPI_Fetch_and_op(&inc, &tokenRead, MPI_SIZE_T, leader_, 0, MPI_SUM, winRetrievedToken_) ; 
     63        MPI_Win_flush(leader_, winRetrievedToken_); 
     64        if (token!=tokenRead)  ERROR("void CTokenManager::unlockToken(size_t token)",<<"Cannot release token="<<token<< 
     65                                     " that is not corresponding to the locked token="<<tokenRead) ;      
     66      } 
     67/*      void unlockToken(size_t token) 
    5168      { 
    5269        size_t inc=1 ; 
     
    5976                                     " that is not corresponding to the locked token="<<tokenRead) ;      
    6077      } 
    61  
     78*/ 
    6279    private: 
    6380 
Note: See TracChangeset for help on using the changeset viewer.