source: XIOS/dev/dev_ym/XIOS_SERVICES/src/manager/window_manager.hpp @ 1764

Last change on this file since 1764 was 1764, checked in by ymipsl, 4 years ago

Some Update on XIOS services
Seems to work on Irène for :

  • first level of servers
  • fisrt + second level of servers
  • attached mode

YM

  • Property svn:executable set to *
File size: 4.6 KB
Line 
1#ifndef __WINDOW_MANAGER_HPP__
2#define __WINDOW_MANAGER_HPP__
3
4#include <map>
5#include "mpi.hpp"
6#include "buffer_in.hpp"
7#include "buffer_out.hpp"
8#include "message.hpp"
9
10namespace xios
11{
12
13
14  class CWindowManager
15  {
16
17    private :
18    const MPI_Aint OFFSET_LOCK=0 ;
19    const int SIZE_LOCK=sizeof(int) ;
20    const MPI_Aint OFFSET_BUFFER_SIZE=OFFSET_LOCK+SIZE_LOCK ;
21    const int SIZE_BUFFER_SIZE=sizeof(size_t) ;
22    const MPI_Aint OFFSET_BUFFER=OFFSET_BUFFER_SIZE+SIZE_BUFFER_SIZE ;
23    const int WINDOWS_LOCKED=-1 ;
24
25    MPI_Win window_ ;
26    void * winBuffer_ ;
27
28    public :
29
30    CWindowManager(MPI_Comm winComm, size_t bufferSize)
31    {
32      const MPI_Aint windowSize=bufferSize+OFFSET_BUFFER ;
33      MPI_Win_allocate(windowSize, 1, MPI_INFO_NULL, winComm, &winBuffer_, &window_) ;
34      int lock=0 ;
35      size_t size=0 ;
36      int commRank ;
37      MPI_Comm_rank(winComm, &commRank) ;
38      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, commRank, 0, window_) ;
39      MPI_Put(&lock, SIZE_LOCK, MPI_CHAR, commRank, OFFSET_LOCK, SIZE_LOCK, MPI_CHAR, window_) ;
40      MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, commRank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;
41      MPI_Win_unlock(commRank, window_) ;
42      MPI_Barrier(winComm) ;
43    }
44   
45    void lockWindow(int rank, int state )
46    {
47      int lock=state ;
48         
49      do 
50      {
51        MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;
52        MPI_Compare_and_swap(&WINDOWS_LOCKED, &state, &lock, MPI_INT, rank, OFFSET_LOCK, window_) ;
53        MPI_Win_unlock(rank, window_) ;
54      } while (lock!=state) ;
55
56     
57    }
58
59
60    void unlockWindow(int rank, int state )
61    {
62      int lock ;
63      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;
64      MPI_Compare_and_swap(&state, &WINDOWS_LOCKED, &lock, MPI_INT, rank, OFFSET_LOCK, window_) ;
65      MPI_Win_unlock(rank, window_) ;
66    }
67   
68    template< class T >
69    void updateToWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) )
70    {
71      CBufferOut buffer ;
72      (object->*dumpOut)(buffer) ;
73      size_t size=buffer.count() ;
74      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;
75      MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;
76      MPI_Put(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ;
77      MPI_Win_unlock(rank, window_) ;
78    }
79   
80    template< typename T >
81    void updateFromWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 
82    {
83      size_t size ;
84      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;
85      MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;
86      MPI_Win_flush(rank,window_) ;
87      CBufferIn buffer(size) ;
88      MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ;
89      MPI_Win_unlock(rank, window_) ;
90      (object->*dumpIn)(buffer) ;
91    }
92
93    template< class T >
94    void pushToWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) )
95    {
96      size_t size ;
97      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;
98      MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;
99      MPI_Win_flush(rank,window_) ;
100      CBufferOut buffer ;
101      (object->*dumpOut)(buffer) ;
102      size_t bufferSize=buffer.count() ;
103      size_t newSize = size + bufferSize;
104      MPI_Put(&newSize, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;
105      MPI_Put(buffer.start(), bufferSize, MPI_CHAR, rank, OFFSET_BUFFER+size, bufferSize, MPI_CHAR, window_) ;
106      MPI_Win_unlock(rank, window_) ;
107    }
108
109    template< typename T >
110    void popFromWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 
111    {
112      size_t size ;
113      MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;
114      MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;
115      MPI_Win_flush(rank,window_) ;
116      CBufferIn buffer(size) ;
117      MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ;
118      MPI_Win_flush(rank,window_) ;
119      (object->*dumpIn)(buffer) ;
120     
121      size=buffer.remain() ;
122      MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;
123      MPI_Put(buffer.ptr(),buffer.remain(), MPI_CHAR, rank, OFFSET_BUFFER, buffer.remain(), MPI_CHAR, window_) ;
124      MPI_Win_unlock(rank, window_) ;
125     
126    }
127
128    ~CWindowManager()
129    {
130      MPI_Win_free(&window_) ;
131    }
132  } ;
133}
134
135
136
137#endif
Note: See TracBrowser for help on using the repository browser.