namespace simgrid{
namespace smpi{
+std::unordered_map<int, smpi_key_elem> Win::keyvals_;
+int Win::keyval_id_=0;
Win::Win(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm): base_(base), size_(size), disp_unit_(disp_unit), assert_(0), info_(info), comm_(comm){
int comm_size = comm->size();
int rank = comm->rank();
XBT_DEBUG("Creating window");
if(info!=MPI_INFO_NULL)
- info->refcount++;
+ info->ref();
name_ = nullptr;
opened_ = 0;
group_ = MPI_GROUP_NULL;
if(rank==0){
bar_ = MSG_barrier_init(comm_size);
}
- mpi_coll_allgather_fun(&(connected_wins_[rank]), sizeof(MPI_Win), MPI_BYTE, connected_wins_, sizeof(MPI_Win),
+ Colls::allgather(&(connected_wins_[rank]), sizeof(MPI_Win), MPI_BYTE, connected_wins_, sizeof(MPI_Win),
MPI_BYTE, comm);
- mpi_coll_bcast_fun(&(bar_), sizeof(msg_bar_t), MPI_BYTE, 0, comm);
+ Colls::bcast(&(bar_), sizeof(msg_bar_t), MPI_BYTE, 0, comm);
- mpi_coll_barrier_fun(comm);
+ Colls::barrier(comm);
}
Win::~Win(){
MPI_Info_free(&info_);
}
- mpi_coll_barrier_fun(comm_);
+ Colls::barrier(comm_);
int rank=comm_->rank();
if(rank == 0)
MSG_barrier_destroy(bar_);
xbt_mutex_destroy(mut_);
+
+ cleanup_attr<Win>();
}
void Win::get_name(char* name, int* length){
}
}
+MPI_Aint Win::size(){
+ return size_;
+}
+
+void* Win::base(){
+ return base_;
+}
+
+int Win::disp_unit(){
+ return disp_unit_;
+}
+
+
void Win::set_name(char* name){
name_ = xbt_strdup(name);
}
//get receiver pointer
MPI_Win recv_win = connected_wins_[target_rank];
+ if(target_count*target_datatype->get_extent()>recv_win->size_)
+ return MPI_ERR_ARG;
+
void* recv_addr = static_cast<void*> ( static_cast<char*>(recv_win->base_) + target_disp * recv_win->disp_unit_);
XBT_DEBUG("Entering MPI_Put to %d", target_rank);
requests_->push_back(sreq);
xbt_mutex_release(mut_);
}else{
- smpi_datatype_copy(origin_addr, origin_count, origin_datatype, recv_addr, target_count, target_datatype);
+ Datatype::copy(origin_addr, origin_count, origin_datatype, recv_addr, target_count, target_datatype);
}
return MPI_SUCCESS;
//get sender pointer
MPI_Win send_win = connected_wins_[target_rank];
+ if(target_count*target_datatype->get_extent()>send_win->size_)
+ return MPI_ERR_ARG;
+
void* send_addr = static_cast<void*>(static_cast<char*>(send_win->base_) + target_disp * send_win->disp_unit_);
XBT_DEBUG("Entering MPI_Get from %d", target_rank);
requests_->push_back(rreq);
xbt_mutex_release(mut_);
}else{
- smpi_datatype_copy(send_addr, target_count, target_datatype, origin_addr, origin_count, origin_datatype);
+ Datatype::copy(send_addr, target_count, target_datatype, origin_addr, origin_count, origin_datatype);
}
return MPI_SUCCESS;
//get receiver pointer
MPI_Win recv_win = connected_wins_[target_rank];
+ if(target_count*target_datatype->get_extent()>recv_win->size_)
+ return MPI_ERR_ARG;
+
void* recv_addr = static_cast<void*>(static_cast<char*>(recv_win->base_) + target_disp * recv_win->disp_unit_);
XBT_DEBUG("Entering MPI_Accumulate to %d", target_rank);
//As the tag will be used for ordering of the operations, add count to it
Request::startall(size, reqs);
Request::waitall(size, reqs, MPI_STATUSES_IGNORE);
for(i=0;i<size;i++){
- Request::unuse(&reqs[i]);
+ Request::unref(&reqs[i]);
}
xbt_free(reqs);
opened_++; //we're open for business !
group_=group;
- group->use();
+ group->ref();
return MPI_SUCCESS;
}
Request::startall(size, reqs);
Request::waitall(size, reqs, MPI_STATUSES_IGNORE);
for(i=0;i<size;i++){
- Request::unuse(&reqs[i]);
+ Request::unref(&reqs[i]);
}
xbt_free(reqs);
opened_++; //we're open for business !
group_=group;
- group->use();
+ group->ref();
return MPI_SUCCESS;
}
Request::waitall(size, reqs, MPI_STATUSES_IGNORE);
for(i=0;i<size;i++){
- Request::unuse(&reqs[i]);
+ Request::unref(&reqs[i]);
}
xbt_free(reqs);
}
xbt_mutex_release(mut_);
- group_->unuse();
+ Group::unref(group_);
opened_--; //we're closed for business !
return MPI_SUCCESS;
}
Request::startall(size, reqs);
Request::waitall(size, reqs, MPI_STATUSES_IGNORE);
for(i=0;i<size;i++){
- Request::unuse(&reqs[i]);
+ Request::unref(&reqs[i]);
}
xbt_free(reqs);
xbt_mutex_acquire(mut_);
}
xbt_mutex_release(mut_);
- group_->unuse();
+ Group::unref(group_);
opened_--; //we're opened for business !
return MPI_SUCCESS;
}
+Win* Win::f2c(int id){
+ return static_cast<Win*>(F2C::f2c(id));
+}
+
}
}