[300] | 1 | #ifndef __BUFFER_CLIENT_HPP__ |
---|
| 2 | #define __BUFFER_CLIENT_HPP__ |
---|
| 3 | |
---|
[2246] | 4 | #include "buffer_cs_base.hpp" |
---|
[591] | 5 | #include "xios_spl.hpp" |
---|
[300] | 6 | #include "buffer_out.hpp" |
---|
[382] | 7 | #include "mpi.hpp" |
---|
[509] | 8 | #include "cxios.hpp" |
---|
[300] | 9 | |
---|
[335] | 10 | namespace xios |
---|
[300] | 11 | { |
---|
[2246] | 12 | class CClientBuffer : public CBufferClientServerBase |
---|
[300] | 13 | { |
---|
| 14 | public: |
---|
[732] | 15 | static size_t maxRequestSize; |
---|
[509] | 16 | |
---|
[2259] | 17 | CClientBuffer(MPI_Comm intercomm, int serverRank, StdSize bufferSize, StdSize estimatedMaxEventSize); |
---|
[732] | 18 | ~CClientBuffer(); |
---|
[1757] | 19 | // void createWindows(MPI_Comm oneSidedComm) ; |
---|
| 20 | void freeWindows(void) ; |
---|
| 21 | void lockBuffer(void) ; |
---|
| 22 | void unlockBuffer(void) ; |
---|
| 23 | |
---|
[1227] | 24 | bool isBufferFree(StdSize size); |
---|
[1757] | 25 | CBufferOut* getBuffer(size_t timeLine, StdSize size); |
---|
| 26 | bool checkBuffer(bool send=false); |
---|
[732] | 27 | bool hasPendingRequest(void); |
---|
[1227] | 28 | StdSize remain(void); |
---|
[1757] | 29 | MPI_Aint getWinAddress(int numWindows) ; |
---|
| 30 | void infoBuffer(void) ; |
---|
| 31 | bool isNotifiedFinalized(void) ; |
---|
[2130] | 32 | void setGrowableBuffer(double growFactor) { growFactor_=growFactor ; isGrowableBuffer_=true ;} |
---|
| 33 | void fixBufferSize(size_t bufferSize) { newBufferSize_=bufferSize ; isGrowableBuffer_=false ; resizingBufferStep_=1 ;} |
---|
| 34 | void fixBuffer(void) { isGrowableBuffer_=false ;} |
---|
[2259] | 35 | void attachWindows(vector<MPI_Win>& windows) ; |
---|
[732] | 36 | private: |
---|
[2130] | 37 | void resizeBuffer(size_t newSize) ; |
---|
| 38 | void resizeBufferNotify(void) ; |
---|
[2246] | 39 | bool isNotifiedChangeBufferSize(void) ; |
---|
[2130] | 40 | |
---|
| 41 | |
---|
[732] | 42 | char* buffer[2]; |
---|
[1757] | 43 | char* bufferHeader[2]; |
---|
| 44 | size_t* firstTimeLine[2] ; |
---|
| 45 | size_t* bufferCount[2] ; |
---|
| 46 | size_t* control[2] ; |
---|
[2246] | 47 | size_t* notify[2] ; |
---|
[1757] | 48 | bool winState[2] ; |
---|
[732] | 49 | int current; |
---|
[2130] | 50 | |
---|
| 51 | double growFactor_=1.2 ; |
---|
| 52 | bool isGrowableBuffer_=true ; |
---|
[1227] | 53 | |
---|
[2130] | 54 | int resizingBufferStep_ = 0 ; |
---|
| 55 | size_t newBufferSize_ ; |
---|
[1227] | 56 | StdSize count; |
---|
| 57 | StdSize maxEventSize; |
---|
[2130] | 58 | StdSize bufferSize; |
---|
[1227] | 59 | const StdSize estimatedMaxEventSize; |
---|
[2258] | 60 | bool isFinalized_=false ; |
---|
[1227] | 61 | |
---|
[917] | 62 | const int serverRank; |
---|
[1757] | 63 | const int clientRank_; |
---|
[732] | 64 | bool pending; |
---|
[509] | 65 | |
---|
[1639] | 66 | MPI_Request request; |
---|
[509] | 67 | |
---|
[732] | 68 | CBufferOut* retBuffer; |
---|
[1639] | 69 | const MPI_Comm interComm; |
---|
[1757] | 70 | std::vector<MPI_Win> windows_ ; |
---|
| 71 | bool hasWindows ; |
---|
[2246] | 72 | |
---|
[2260] | 73 | double latency_=0 ; |
---|
[2246] | 74 | double lastCheckedWithNothing_=0 ; |
---|
[2258] | 75 | double lastCheckedNotify_=0 ; |
---|
[732] | 76 | }; |
---|
[300] | 77 | } |
---|
| 78 | #endif |
---|