Changeset 2130 for XIOS/dev/dev_ym/XIOS_COUPLING/src/buffer_client.cpp
- Timestamp:
- 04/20/21 09:49:47 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/src/buffer_client.cpp
r1757 r2130 7 7 #include "mpi.hpp" 8 8 #include "tracer.hpp" 9 #include "timeline_events.hpp" 9 10 10 11 namespace xios … … 200 201 201 202 lockBuffer(); 203 count=*bufferCount[current] ; 204 205 if (resizingBufferStep_ > 0 ) return false ; 206 202 207 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 } 205 215 206 216 if (size > maxEventSize) … … 214 224 if (size > maxRequestSize) maxRequestSize = size; 215 225 } 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 ; 219 237 } 220 238 … … 276 294 if (!pending) 277 295 { 278 if (!send) return false ; 296 if (!send && resizingBufferStep_==0 ) return false ; 297 279 298 if (count > 0) 280 299 { … … 284 303 { 285 304 MPI_Issend(buffer[current], count, MPI_CHAR, serverRank, 20, interComm, &request); 305 if (resizingBufferStep_==3) resizingBufferStep_=0 ; 286 306 pending = true; 287 307 // *control[current]=0 ; … … 295 315 count = 0; 296 316 } 297 else unlockBuffer() ; 317 else 318 { 319 unlockBuffer() ; 320 } 298 321 } 322 else 323 { 324 if (resizingBufferStep_==2) resizeBuffer(newBufferSize_) ; 325 if (resizingBufferStep_==1) resizeBufferNotify() ; 326 } 299 327 } 300 328 301 329 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() ; 302 405 } 303 406
Note: See TracChangeset
for help on using the changeset viewer.