Changeset 2517 for XIOS3/trunk/src/manager/window_manager.hpp
- Timestamp:
- 06/12/23 11:52:10 (13 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS3/trunk/src/manager/window_manager.hpp
r2263 r2517 7 7 #include "buffer_out.hpp" 8 8 #include "message.hpp" 9 #include "window_base.hpp" 9 10 10 11 namespace xios … … 12 13 13 14 14 class CWindowManager 15 class CWindowManager : public CWindowBase 15 16 { 16 17 17 18 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 ;19 static const MPI_Aint OFFSET_LOCK=0 ; 20 static const int SIZE_LOCK=sizeof(int) ; 21 static const MPI_Aint OFFSET_BUFFER_SIZE=OFFSET_LOCK+SIZE_LOCK ; 22 static const int SIZE_BUFFER_SIZE=sizeof(size_t) ; 23 static const MPI_Aint OFFSET_BUFFER=OFFSET_BUFFER_SIZE+SIZE_BUFFER_SIZE ; 24 static const int WINDOWS_LOCKED=-1 ; 24 25 25 26 MPI_Win window_ ; … … 30 31 public : 31 32 32 CWindowManager(MPI_Comm winComm, size_t bufferSize) 33 { 34 const MPI_Aint windowSize=bufferSize+OFFSET_BUFFER ; 35 MPI_Win_allocate(windowSize, 1, MPI_INFO_NULL, winComm, &winBuffer_, &window_) ; 33 CWindowManager(MPI_Comm winComm, size_t bufferSize) : CWindowBase(winComm, bufferSize + OFFSET_BUFFER_SIZE) 34 { 36 35 int lock=0 ; 37 36 size_t size=0 ; 38 37 int commRank ; 39 38 MPI_Comm_rank(winComm, &commRank) ; 40 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, commRank, 0, window_) ;41 MPI_Put(&lock, SIZE_LOCK, MPI_CHAR, commRank, OFFSET_LOCK, SIZE_LOCK, MPI_CHAR, window_) ;42 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, commRank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;43 MPI_Win_unlock(commRank, window_) ;39 lockExclusive(commRank) ; 40 put(&lock, SIZE_LOCK, MPI_CHAR, commRank, OFFSET_LOCK, SIZE_LOCK, MPI_CHAR) ; 41 put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, commRank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR) ; 42 unlockExclusive(commRank) ; 44 43 MPI_Barrier(winComm) ; 45 44 } … … 63 62 int flag ; 64 63 MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, MPI_STATUS_IGNORE); 65 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 66 MPI_Compare_and_swap(&WINDOWS_LOCKED, &state, &lock, MPI_INT, rank, OFFSET_LOCK, window_) ; 67 MPI_Win_unlock(rank, window_) ; 64 compareAndSwap(&WINDOWS_LOCKED, &state, &lock, MPI_INT, rank, OFFSET_LOCK) ; 65 flush(rank) ; 68 66 lastTime=MPI_Wtime() ; 69 67 } while (lock!=state) ; … … 90 88 int flag ; 91 89 MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, MPI_STATUS_IGNORE); 92 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;93 MPI_Compare_and_swap(&WINDOWS_LOCKED, &state, &lock, MPI_INT, rank, OFFSET_LOCK, window_) ;94 MPI_Win_unlock(rank, window_) ;90 lockExclusive(rank) ; 91 compareAndSwap(&WINDOWS_LOCKED, &state, &lock, MPI_INT, rank, OFFSET_LOCK) ; 92 unlockExclusive(rank) ; 95 93 lastTime=MPI_Wtime() ; 96 94 } while (lock!=state) ; … … 99 97 void lockWindowExclusive(int rank) 100 98 { 101 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;99 lockExclusive(rank) ; 102 100 } 103 101 104 102 void lockWindowShared(int rank) 105 103 { 106 MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, window_) ; 107 } 108 104 lockShared(rank) ; 105 } 106 107 void unlockWindowExclusive(int rank) 108 { 109 unlockExclusive(rank) ; 110 } 111 112 void unlockWindowShared(int rank) 113 { 114 unlockShared(rank) ; 115 } 116 117 void lockWindow(int rank) 118 { 119 lockWindowExclusive(rank) ; 120 } 121 109 122 void unlockWindow(int rank) 110 123 { 111 MPI_Win_unlock(rank, window_) ;124 unlockWindowExclusive(rank) ; 112 125 } 113 126 114 127 void flushWindow(int rank) 115 128 { 116 MPI_Win_flush(rank, window_) ;129 flush(rank) ; 117 130 } 118 131 … … 120 133 { 121 134 int lock ; 122 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 123 MPI_Compare_and_swap(&state, &WINDOWS_LOCKED, &lock, MPI_INT, rank, OFFSET_LOCK, window_) ; 124 MPI_Win_unlock(rank, window_) ; 135 compareAndSwap(&state, &WINDOWS_LOCKED, &lock, MPI_INT, rank, OFFSET_LOCK) ; 136 flush(rank) ; 125 137 } 126 138 127 139 template< class T > 128 140 void updateToWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 141 { 142 updateToExclusiveWindow(rank, object, dumpOut) ; 143 } 144 145 template< class T > 146 void updateToExclusiveWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 147 { 148 lockExclusive(rank) ; 149 updateToLockedWindow(rank, object, dumpOut) ; 150 unlockExclusive(rank) ; 151 } 152 153 template< class T > 154 void updateTosharedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 155 { 156 lockShared(rank) ; 157 updateToLockedWindow(rank, object, dumpOut) ; 158 unlockShared(rank) ; 159 } 160 161 template< class T > 162 void updateToLockedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 129 163 { 130 164 CBufferOut buffer ; 131 165 (object->*dumpOut)(buffer) ; 132 166 size_t size=buffer.count() ; 133 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 134 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 135 MPI_Put(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 136 MPI_Win_unlock(rank, window_) ; 137 } 138 139 template< class T > 140 void updateToExclusiveWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 141 { 142 CBufferOut buffer ; 143 (object->*dumpOut)(buffer) ; 144 size_t size=buffer.count() ; 145 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 146 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 147 MPI_Put(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 148 MPI_Win_unlock(rank, window_) ; 149 } 150 151 template< class T > 152 void updateTosharedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 153 { 154 CBufferOut buffer ; 155 (object->*dumpOut)(buffer) ; 156 size_t size=buffer.count() ; 157 MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, window_) ; 158 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 159 MPI_Put(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 160 MPI_Win_unlock(rank, window_) ; 161 } 162 163 template< class T > 164 void updateToLockedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 165 { 166 CBufferOut buffer ; 167 (object->*dumpOut)(buffer) ; 168 size_t size=buffer.count() ; 169 // MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 170 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 171 MPI_Put(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 172 MPI_Win_flush(rank, window_) ; 173 // MPI_Win_unlock(rank, window_) ; 167 168 put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR) ; 169 put(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR) ; 170 flush(rank) ; 174 171 } 175 172 … … 177 174 void updateFromWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 178 175 { 179 size_t size ; 180 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 181 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 182 MPI_Win_flush(rank,window_) ; 176 updateFromExclusiveWindow(rank,object, dumpIn) ; 177 } 178 179 template< typename T > 180 void updateFromExclusiveWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 181 { 182 size_t size ; 183 lockExclusive(rank) ; 184 updateFromLockedWindow(rank,object, dumpIn) ; 185 unlockExclusive(rank) ; 186 } 187 188 template< typename T > 189 void updateFromSharedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 190 { 191 size_t size ; 192 lockShared(rank) ; 193 updateFromLockedWindow(rank,object, dumpIn) ; 194 unlockShared(rank) ; 195 } 196 197 template< typename T > 198 void updateFromLockedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 199 { 200 size_t size ; 201 202 get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR) ; 203 flush(rank) ; 183 204 CBufferIn buffer(size) ; 184 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 185 MPI_Win_unlock(rank, window_) ; 205 get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR) ; 206 flush(rank) ; 207 186 208 (object->*dumpIn)(buffer) ; 187 209 } 188 210 189 template< typename T >190 void updateFromExclusiveWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) )191 {192 size_t size ;193 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ;194 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;195 MPI_Win_flush(rank,window_) ;196 CBufferIn buffer(size) ;197 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ;198 MPI_Win_unlock(rank, window_) ;199 (object->*dumpIn)(buffer) ;200 }201 202 template< typename T >203 void updateFromSharedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) )204 {205 size_t size ;206 MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, window_) ;207 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;208 MPI_Win_flush(rank,window_) ;209 CBufferIn buffer(size) ;210 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ;211 MPI_Win_unlock(rank, window_) ;212 (object->*dumpIn)(buffer) ;213 }214 215 template< typename T >216 void updateFromLockedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) )217 {218 size_t size ;219 // MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, window_) ;220 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ;221 MPI_Win_flush(rank,window_) ;222 CBufferIn buffer(size) ;223 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ;224 // MPI_Win_unlock(rank, window_) ;225 MPI_Win_flush(rank, window_) ;226 (object->*dumpIn)(buffer) ;227 }228 211 229 212 … … 231 214 void pushToWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 232 215 { 233 size_t size ; 234 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 235 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 236 MPI_Win_flush(rank,window_) ; 216 pushToExclusiveWindow(rank, object, dumpOut) ; 217 } 218 219 template< class T > 220 void pushToExclusiveWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 221 { 222 lockExclusive(rank) ; 223 pushToLockedWindow(rank, object, dumpOut) ; 224 unlockExclusive(rank) ; 225 } 226 227 template< class T > 228 void pushToSharedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 229 { 230 lockShared(rank) ; 231 pushToLockedWindow(rank, object, dumpOut) ; 232 unlockShared(rank) ; 233 } 234 235 template< class T > 236 void pushToLockedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 237 { 238 size_t size ; 239 get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR) ; 240 flush(rank) ; 237 241 CBufferOut buffer ; 238 242 (object->*dumpOut)(buffer) ; 239 243 size_t bufferSize=buffer.count() ; 240 244 size_t newSize = size + bufferSize; 241 MPI_Put(&newSize, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 242 MPI_Put(buffer.start(), bufferSize, MPI_CHAR, rank, OFFSET_BUFFER+size, bufferSize, MPI_CHAR, window_) ; 243 MPI_Win_unlock(rank, window_) ; 244 } 245 246 template< class T > 247 void pushToExclusiveWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 248 { 249 size_t size ; 250 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 251 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 252 MPI_Win_flush(rank,window_) ; 253 CBufferOut buffer ; 254 (object->*dumpOut)(buffer) ; 255 size_t bufferSize=buffer.count() ; 256 size_t newSize = size + bufferSize; 257 MPI_Put(&newSize, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 258 MPI_Put(buffer.start(), bufferSize, MPI_CHAR, rank, OFFSET_BUFFER+size, bufferSize, MPI_CHAR, window_) ; 259 MPI_Win_unlock(rank, window_) ; 260 } 261 262 template< class T > 263 void pushToSharedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 264 { 265 size_t size ; 266 MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, window_) ; 267 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 268 MPI_Win_flush(rank,window_) ; 269 CBufferOut buffer ; 270 (object->*dumpOut)(buffer) ; 271 size_t bufferSize=buffer.count() ; 272 size_t newSize = size + bufferSize; 273 MPI_Put(&newSize, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 274 MPI_Put(buffer.start(), bufferSize, MPI_CHAR, rank, OFFSET_BUFFER+size, bufferSize, MPI_CHAR, window_) ; 275 MPI_Win_unlock(rank, window_) ; 276 } 277 278 template< class T > 279 void pushToLockedWindow(int rank, T* object, void (T::*dumpOut)(CBufferOut&) ) 280 { 281 size_t size ; 282 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 283 MPI_Win_flush(rank,window_) ; 284 CBufferOut buffer ; 285 (object->*dumpOut)(buffer) ; 286 size_t bufferSize=buffer.count() ; 287 size_t newSize = size + bufferSize; 288 MPI_Put(&newSize, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 289 MPI_Put(buffer.start(), bufferSize, MPI_CHAR, rank, OFFSET_BUFFER+size, bufferSize, MPI_CHAR, window_) ; 290 MPI_Win_flush(rank, window_) ; 291 } 245 put(&newSize, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR) ; 246 put(buffer.start(), bufferSize, MPI_CHAR, rank, OFFSET_BUFFER+size, bufferSize, MPI_CHAR) ; 247 flush(rank) ; 248 } 249 250 292 251 293 252 template< typename T > 294 253 void popFromWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 295 254 { 296 size_t size ; 297 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 298 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 299 MPI_Win_flush(rank,window_) ; 255 popFromExclusiveWindow(rank,object, dumpIn) ; 256 } 257 258 template< typename T > 259 void popFromExclusiveWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 260 { 261 lockExclusive(rank) ; 262 popFromLockedWindow(rank,object, dumpIn) ; 263 unlockExclusive(rank) ; 264 265 } 266 267 template< typename T > 268 void popFromSharedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 269 { 270 lockShared(rank) ; 271 popFromLockedWindow(rank,object, dumpIn) ; 272 unlockShared(rank) ; 273 } 274 275 template< typename T > 276 void popFromLockedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 277 { 278 size_t size ; 279 get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR) ; 280 flush(rank) ; 300 281 CBufferIn buffer(size) ; 301 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ;302 MPI_Win_flush(rank,window_) ;282 get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR) ; 283 flush(rank) ; 303 284 (object->*dumpIn)(buffer) ; 304 285 305 286 size=buffer.remain() ; 306 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 307 MPI_Put(buffer.ptr(),buffer.remain(), MPI_CHAR, rank, OFFSET_BUFFER, buffer.remain(), MPI_CHAR, window_) ; 308 MPI_Win_unlock(rank, window_) ; 309 310 } 311 312 template< typename T > 313 void popFromExclusiveWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 314 { 315 size_t size ; 316 MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, 0, window_) ; 317 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 318 MPI_Win_flush(rank,window_) ; 319 CBufferIn buffer(size) ; 320 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 321 MPI_Win_flush(rank,window_) ; 322 (object->*dumpIn)(buffer) ; 323 324 size=buffer.remain() ; 325 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 326 MPI_Put(buffer.ptr(),buffer.remain(), MPI_CHAR, rank, OFFSET_BUFFER, buffer.remain(), MPI_CHAR, window_) ; 327 MPI_Win_unlock(rank, window_) ; 328 329 } 330 331 template< typename T > 332 void popFromSharedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 333 { 334 size_t size ; 335 MPI_Win_lock(MPI_LOCK_SHARED, rank, 0, window_) ; 336 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 337 MPI_Win_flush(rank,window_) ; 338 CBufferIn buffer(size) ; 339 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 340 MPI_Win_flush(rank,window_) ; 341 (object->*dumpIn)(buffer) ; 342 343 size=buffer.remain() ; 344 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 345 MPI_Put(buffer.ptr(),buffer.remain(), MPI_CHAR, rank, OFFSET_BUFFER, buffer.remain(), MPI_CHAR, window_) ; 346 MPI_Win_unlock(rank, window_) ; 347 348 } 349 350 template< typename T > 351 void popFromLockedWindow(int rank, T* object, void (T::*dumpIn)(CBufferIn&) ) 352 { 353 size_t size ; 354 MPI_Get(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 355 MPI_Win_flush(rank,window_) ; 356 CBufferIn buffer(size) ; 357 MPI_Get(buffer.start(), size, MPI_CHAR, rank,OFFSET_BUFFER, size, MPI_CHAR, window_) ; 358 MPI_Win_flush(rank,window_) ; 359 (object->*dumpIn)(buffer) ; 360 361 size=buffer.remain() ; 362 MPI_Put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR, window_) ; 363 MPI_Put(buffer.ptr(),buffer.remain(), MPI_CHAR, rank, OFFSET_BUFFER, buffer.remain(), MPI_CHAR, window_) ; 364 MPI_Win_flush(rank, window_) ; 287 put(&size, SIZE_BUFFER_SIZE, MPI_CHAR, rank, OFFSET_BUFFER_SIZE, SIZE_BUFFER_SIZE, MPI_CHAR) ; 288 put(buffer.ptr(),buffer.remain(), MPI_CHAR, rank, OFFSET_BUFFER, buffer.remain(), MPI_CHAR) ; 289 flush(rank) ; 365 290 } 366 291 367 292 ~CWindowManager() 368 293 { 369 MPI_Win_free(&window_) ;370 294 } 371 295 } ;
Note: See TracChangeset
for help on using the changeset viewer.