X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/68ebc3a9ce7c3d2c49a438732b5b3b73e4f79973..b65f8c081fd0167701551de334cb84473eebcab9:/src/smpi/smpi_win.cpp diff --git a/src/smpi/smpi_win.cpp b/src/smpi/smpi_win.cpp index bd90414d69..fb16d16e03 100644 --- a/src/smpi/smpi_win.cpp +++ b/src/smpi/smpi_win.cpp @@ -523,6 +523,17 @@ int Win::lock(int lock_type, int rank, int assert){ return MPI_SUCCESS; } +int Win::lock_all(int assert){ + int i=0; + int retval = MPI_SUCCESS; + for (i=0; isize();i++){ + int ret = this->lock(MPI_LOCK_SHARED, i, assert); + if(ret != MPI_SUCCESS) + retval = ret; + } + return retval; +} + int Win::unlock(int rank){ if(opened_!=0) return MPI_ERR_WIN; @@ -541,6 +552,50 @@ int Win::unlock(int rank){ return MPI_SUCCESS; } +int Win::unlock_all(){ + int i=0; + int retval = MPI_SUCCESS; + for (i=0; isize();i++){ + int ret = this->unlock(i); + if(ret != MPI_SUCCESS) + retval = ret; + } + return retval; +} + +int Win::flush(int rank){ + MPI_Win target_win = connected_wins_[rank]; + int finished = finish_comms(rank); + XBT_DEBUG("Win_flush on local %d - Finished %d RMA calls", rank_, finished); + finished = target_win->finish_comms(rank_); + XBT_DEBUG("Win_flush on remote %d - Finished %d RMA calls", rank, finished); + return MPI_SUCCESS; +} + +int Win::flush_local(int rank){ + int finished = finish_comms(rank); + XBT_DEBUG("Win_flush_local for rank %d - Finished %d RMA calls", rank, finished); + return MPI_SUCCESS; +} + +int Win::flush_all(){ + int i=0; + int finished = 0; + finished = finish_comms(); + XBT_DEBUG("Win_flush_all on local - Finished %d RMA calls", finished); + for (i=0; isize();i++){ + finished = connected_wins_[i]->finish_comms(rank_); + XBT_DEBUG("Win_flush_all on %d - Finished %d RMA calls", i, finished); + } + return MPI_SUCCESS; +} + +int Win::flush_local_all(){ + int finished = finish_comms(); + XBT_DEBUG("Win_flush_local_all - Finished %d RMA calls", finished); + return MPI_SUCCESS; +} + Win* Win::f2c(int id){ return static_cast(F2C::f2c(id)); } @@ -560,6 +615,35 @@ int Win::finish_comms(){ return size; } +int Win::finish_comms(int rank){ + xbt_mutex_acquire(mut_); + //Finish own requests + std::vector *reqqs = requests_; + int size = static_cast(reqqs->size()); + if (size > 0) { + size = 0; + std::vector* myreqqs = new std::vector(); + std::vector::iterator iter = reqqs->begin(); + while (iter != reqqs->end()){ + if(((*iter)->src() == rank) || ((*iter)->dst() == rank)){ + myreqqs->push_back(*iter); + iter = reqqs->erase(iter); + size++; + } else { + ++iter; + } + } + if(size >0){ + MPI_Request* treqs = &(*myreqqs)[0]; + Request::waitall(size, treqs, MPI_STATUSES_IGNORE); + myreqqs->clear(); + delete myreqqs; + } + } + xbt_mutex_release(mut_); + return size; +} + } }