refcount_ = 1;
else
refcount_ = 0;
- nbc_requests_=nullptr;
- nbc_requests_size_=0;
init_buffer(count);
this->add_f();
}
int flag = 1;
int ret = 0;
if(test == 0)
- ret = waitall((*request)->nbc_requests_size_, (*request)->nbc_requests_, MPI_STATUSES_IGNORE);
+ ret = waitall((*request)->nbc_requests_.size(), &(*request)->nbc_requests_[0], MPI_STATUSES_IGNORE);
else{
- ret = testall((*request)->nbc_requests_size_, (*request)->nbc_requests_, &flag, MPI_STATUSES_IGNORE);
+ ret = testall((*request)->nbc_requests_.size(), &(*request)->nbc_requests_[0], &flag, MPI_STATUSES_IGNORE);
}
if(ret!=MPI_SUCCESS)
xbt_die("Failure when waiting on non blocking collective sub-requests");
if(flag == 1){
- XBT_DEBUG("Finishing non blocking collective request with %d sub-requests", (*request)->nbc_requests_size_);
- for (int i = 0; i < (*request)->nbc_requests_size_; i++) {
- if((*request)->buf_!=nullptr && (*request)->nbc_requests_[i]!=MPI_REQUEST_NULL){//reduce case
- void * buf=(*request)->nbc_requests_[i]->buf_;
+ XBT_DEBUG("Finishing non blocking collective request with %zu sub-requests", (*request)->nbc_requests_.size());
+ for(auto& req: (*request)->nbc_requests_){
+ if((*request)->buf_!=nullptr && req!=MPI_REQUEST_NULL){//reduce case
+ void * buf=req->buf_;
if((*request)->old_type_->flags() & DT_FLAG_DERIVED)
- buf=(*request)->nbc_requests_[i]->old_buf_;
- if((*request)->nbc_requests_[i]->flags_ & MPI_REQ_RECV ){
+ buf=req->old_buf_;
+ if(req->flags_ & MPI_REQ_RECV ){
if((*request)->op_!=MPI_OP_NULL){
int count=(*request)->size_/ (*request)->old_type_->size();
(*request)->op_->apply(buf, (*request)->buf_, &count, (*request)->old_type_);
smpi_free_tmp_buffer(static_cast<unsigned char*>(buf));
}
}
- if((*request)->nbc_requests_[i]!=MPI_REQUEST_NULL)
- Request::unref(&((*request)->nbc_requests_[i]));
+ if(req!=MPI_REQUEST_NULL)
+ Request::unref(&req);
}
- delete[] (*request)->nbc_requests_;
- (*request)->nbc_requests_size_=0;
+ (*request)->nbc_requests_.clear();
}
return flag;
}
return MPI_SUCCESS;
}
-void Request::set_nbc_requests(MPI_Request* reqs, int size){
- nbc_requests_size_ = size;
- if (size > 0) {
+void Request::start_nbc_requests(std::vector<MPI_Request> reqs){
+ if (reqs.size() > 0) {
nbc_requests_ = reqs;
- } else {
- delete[] reqs;
- nbc_requests_ = nullptr;
+ Request::startall(reqs.size(), &reqs[0]);
}
}
-int Request::get_nbc_requests_size() const
-{
- return nbc_requests_size_;
-}
-
-MPI_Request* Request::get_nbc_requests() const
+std::vector<MPI_Request> Request::get_nbc_requests() const
{
return nbc_requests_;
}