-/* Copyright (c) 2010-2015. The SimGrid Team.
+/* Copyright (c) 2010-2017. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_comm, smpi, "Logging specific to SMPI (comm)");
- Comm mpi_MPI_COMM_UNINITIALIZED;
+ simgrid::smpi::Comm mpi_MPI_COMM_UNINITIALIZED;
MPI_Comm MPI_COMM_UNINITIALIZED=&mpi_MPI_COMM_UNINITIALIZED;
/* Support for cartesian topology was added, but there are 2 other types of topology, graph et dist graph. In order to
void Comm::destroy(Comm* comm)
{
if (comm == MPI_COMM_UNINITIALIZED){
- Comm::destroy(smpi_process_comm_world());
+ Comm::destroy(smpi_process()->comm_world());
return;
}
delete comm->topo_; // there's no use count on topos
int Comm::dup(MPI_Comm* newcomm){
if(smpi_privatize_global_variables){ //we need to switch as the called function may silently touch global variables
- smpi_switch_data_segment(smpi_process_index());
+ smpi_switch_data_segment(smpi_process()->index());
}
MPI_Group cp = new Group(this->group());
(*newcomm) = new Comm(cp, this->topo());
int ret = MPI_SUCCESS;
- if(!attributes_.empty()){
+ if(!attributes()->empty()){
int flag;
void* value_out;
- for(auto it = attributes_.begin(); it != attributes_.end(); it++){
- smpi_key_elem elem = keyvals_.at((*it).first);
+ for(auto it : *attributes()){
+ smpi_key_elem elem = keyvals_.at(it.first);
if (elem != nullptr && elem->copy_fn.comm_copy_fn != MPI_NULL_COPY_FN) {
- ret = elem->copy_fn.comm_copy_fn(this, (*it).first, nullptr, (*it).second, &value_out, &flag);
+ ret = elem->copy_fn.comm_copy_fn(this, it.first, nullptr, it.second, &value_out, &flag);
if (ret != MPI_SUCCESS) {
Comm::destroy(*newcomm);
*newcomm = MPI_COMM_NULL;
}
if (flag){
elem->refcount++;
- (*newcomm)->attributes_.insert({(*it).first, value_out});
+ (*newcomm)->attributes()->insert({it.first, value_out});
}
}
}
MPI_Group Comm::group()
{
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->group();
+ return smpi_process()->comm_world()->group();
return group_;
}
int Comm::size()
{
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->size();
+ return smpi_process()->comm_world()->size();
return group_->size();
}
int Comm::rank()
{
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->rank();
- return group_->rank(smpi_process_index());
+ return smpi_process()->comm_world()->rank();
+ return group_->rank(smpi_process()->index());
}
void Comm::get_name (char* name, int* len)
{
if (this == MPI_COMM_UNINITIALIZED){
- smpi_process_comm_world()->get_name(name, len);
+ smpi_process()->comm_world()->get_name(name, len);
return;
}
if(this == MPI_COMM_WORLD) {
void Comm::set_leaders_comm(MPI_Comm leaders){
if (this == MPI_COMM_UNINITIALIZED){
- smpi_process_comm_world()->set_leaders_comm(leaders);
+ smpi_process()->comm_world()->set_leaders_comm(leaders);
return;
}
leaders_comm_=leaders;
int* Comm::get_non_uniform_map(){
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->get_non_uniform_map();
+ return smpi_process()->comm_world()->get_non_uniform_map();
return non_uniform_map_;
}
int* Comm::get_leaders_map(){
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->get_leaders_map();
+ return smpi_process()->comm_world()->get_leaders_map();
return leaders_map_;
}
MPI_Comm Comm::get_leaders_comm(){
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->get_leaders_comm();
+ return smpi_process()->comm_world()->get_leaders_comm();
return leaders_comm_;
}
MPI_Comm Comm::get_intra_comm(){
if (this == MPI_COMM_UNINITIALIZED || this==MPI_COMM_WORLD)
- return smpi_process_get_comm_intra();
+ return smpi_process()->comm_intra();
else return intra_comm_;
}
int Comm::is_uniform(){
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->is_uniform();
+ return smpi_process()->comm_world()->is_uniform();
return is_uniform_;
}
int Comm::is_blocked(){
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->is_blocked();
+ return smpi_process()->comm_world()->is_blocked();
return is_blocked_;
}
MPI_Comm Comm::split(int color, int key)
{
if (this == MPI_COMM_UNINITIALIZED)
- return smpi_process_comm_world()->split(color, key);
+ return smpi_process()->comm_world()->split(color, key);
int system_tag = 123;
int* recvbuf;
reqs++;
}
}
- if(i != 0) {
- if(group_out != MPI_COMM_WORLD->group() && group_out != MPI_GROUP_EMPTY)
- Group::unref(group_out);
- }
+ if(i != 0 && group_out != MPI_COMM_WORLD->group() && group_out != MPI_GROUP_EMPTY)
+ Group::unref(group_out);
+
Request::waitall(reqs, requests, MPI_STATUS_IGNORE);
xbt_free(requests);
}
void Comm::ref(){
if (this == MPI_COMM_UNINITIALIZED){
- smpi_process_comm_world()->ref();
+ smpi_process()->comm_world()->ref();
return;
}
group_->ref();
void Comm::unref(Comm* comm){
if (comm == MPI_COMM_UNINITIALIZED){
- Comm::unref(smpi_process_comm_world());
+ Comm::unref(smpi_process()->comm_world());
return;
}
comm->refcount_--;
int leader = -1;
if (this == MPI_COMM_UNINITIALIZED)
- smpi_process_comm_world()->init_smp();
+ smpi_process()->comm_world()->init_smp();
int comm_size = this->size();
// If we are in replay - perform an ugly hack
// tell SimGrid we are not in replay for a while, because we need the buffers to be copied for the following calls
bool replaying = false; //cache data to set it back again after
- if(smpi_process_get_replaying()){
+ if(smpi_process()->replaying()){
replaying=true;
- smpi_process_set_replaying(false);
+ smpi_process()->set_replaying(false);
}
if(smpi_privatize_global_variables){ //we need to switch as the called function may silently touch global variables
- smpi_switch_data_segment(smpi_process_index());
+ smpi_switch_data_segment(smpi_process()->index());
}
//identify neighbours in comm
//get the indexes of all processes sharing the same simix host
Coll_allgather_mpich::allgather(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
if(smpi_privatize_global_variables){ //we need to switch as the called function may silently touch global variables
- smpi_switch_data_segment(smpi_process_index());
+ smpi_switch_data_segment(smpi_process()->index());
}
if(leaders_map_==nullptr){
leader_comm=this->get_leaders_comm();
Group::unref(leaders_group);
}
- smpi_process_set_comm_intra(comm_intra);
+ smpi_process()->set_comm_intra(comm_intra);
}
int is_uniform = 1;
Coll_bcast_mpich::bcast(&(is_uniform_),1, MPI_INT, 0, comm_intra );
if(smpi_privatize_global_variables){ //we need to switch as the called function may silently touch global variables
- smpi_switch_data_segment(smpi_process_index());
+ smpi_switch_data_segment(smpi_process()->index());
}
// Are the ranks blocked ? = allocated contiguously on the SMP nodes
int is_blocked=1;
xbt_free(leader_list);
if(replaying)
- smpi_process_set_replaying(true);
+ smpi_process()->set_replaying(true);
}
MPI_Comm Comm::f2c(int id) {
return MPI_COMM_SELF;
} else if(id==0){
return MPI_COMM_WORLD;
- } else if(F2C::f2c_lookup_ != nullptr && id >= 0) {
+ } else if(F2C::f2c_lookup() != nullptr && id >= 0) {
char key[KEY_SIZE];
- MPI_Comm tmp = static_cast<MPI_Comm>(xbt_dict_get_or_null(F2C::f2c_lookup_,get_key_id(key, id)));
+ MPI_Comm tmp = static_cast<MPI_Comm>(xbt_dict_get_or_null(F2C::f2c_lookup(),get_key_id(key, id)));
return tmp != nullptr ? tmp : MPI_COMM_NULL ;
} else {
return MPI_COMM_NULL;
void Comm::free_f(int id) {
char key[KEY_SIZE];
- xbt_dict_remove(F2C::f2c_lookup_, id==0? get_key(key, id) : get_key_id(key, id));
+ xbt_dict_remove(F2C::f2c_lookup(), id==0? get_key(key, id) : get_key_id(key, id));
}
int Comm::add_f() {
- if(F2C::f2c_lookup_==nullptr){
- F2C::f2c_lookup_=xbt_dict_new_homogeneous(nullptr);
+ if(F2C::f2c_lookup()==nullptr){
+ F2C::set_f2c_lookup(xbt_dict_new_homogeneous(nullptr));
}
char key[KEY_SIZE];
- xbt_dict_set(F2C::f2c_lookup_, this==MPI_COMM_WORLD? get_key(key, F2C::f2c_id_) : get_key_id(key,F2C::f2c_id_), this, nullptr);
- F2C::f2c_id_++;
- return F2C::f2c_id_-1;
+ xbt_dict_set(F2C::f2c_lookup(), this==MPI_COMM_WORLD? get_key(key, F2C::f2c_id()) : get_key_id(key,F2C::f2c_id()), this, nullptr);
+ f2c_id_increment();
+ return F2C::f2c_id()-1;
+}
+
+
+void Comm::add_rma_win(MPI_Win win){
+ rma_wins_.push_back(win);
+}
+
+void Comm::remove_rma_win(MPI_Win win){
+ rma_wins_.remove(win);
+}
+
+void Comm::finish_rma_calls(){
+ for(auto it : rma_wins_){
+ if(it->rank()==this->rank()){//is it ours (for MPI_COMM_WORLD)?
+ int finished = it->finish_comms();
+ XBT_DEBUG("Barrier for rank %d - Finished %d RMA calls",this->rank(), finished);
+ }
+ }
}