}
explicit Group(const Group* origin);
- void set_mapping(s4u::Actor* actor, int rank);
+ void set_mapping(aid_t pid, int rank);
int rank(aid_t pid) const;
aid_t actor_pid(int rank) const;
s4u::Actor* actor(int rank) const;
auto* group = new Group(1);
comm_self_ = new Comm(group, nullptr);
comm_self_->set_name("MPI_COMM_SELF");
- group->set_mapping(actor_, 0);
+ group->set_mapping(actor_->get_pid(), 0);
}
return comm_self_;
}
void smpi_deployment_register_process(const std::string& instance_id, int rank, simgrid::s4u::Actor* actor)
{
const Instance& instance = smpi_instances.at(instance_id);
- instance.comm_world_->group()->set_mapping(actor, rank);
+ instance.comm_world_->group()->set_mapping(actor->get_pid(), rank);
}
void smpi_deployment_unregister_process(const std::string& instance_id)
group_root = group_out; /* Save root's group */
}
for (unsigned j = 0; j < rankmap.size(); j++) {
- s4u::Actor* actor = group->actor(rankmap[j].second);
+ aid_t actor = group->actor_pid(rankmap[j].second);
group_out->set_mapping(actor, j);
}
std::vector<MPI_Request> requests(rankmap.size());
int intra_comm_size = 0;
int min_index = INT_MAX; // the minimum index will be the leader
sg_host_self()->get_impl()->foreach_actor([this, &intra_comm_size, &min_index](auto& actor) {
- int index = actor.get_pid();
- if (this->group()->rank(actor.get_ciface()) != MPI_UNDEFINED) { // Is this process in the current group?
+ if (this->group()->rank(actor.get_pid()) != MPI_UNDEFINED) { // Is this process in the current group?
intra_comm_size++;
+ int index = actor.get_pid();
if (index < min_index)
min_index = index;
}
auto* group_intra = new Group(intra_comm_size);
int i = 0;
sg_host_self()->get_impl()->foreach_actor([this, group_intra, &i](auto& actor) {
- if (this->group()->rank(actor.get_ciface()) != MPI_UNDEFINED) {
- group_intra->set_mapping(actor.get_ciface(), i);
+ if (this->group()->rank(actor.get_pid()) != MPI_UNDEFINED) {
+ group_intra->set_mapping(actor.get_pid(), i);
i++;
}
});
if(MPI_COMM_WORLD!=MPI_COMM_UNINITIALIZED && this!=MPI_COMM_WORLD){
//create leader_communicator
for (i=0; i< leader_group_size;i++)
- leaders_group->set_mapping(s4u::Actor::by_pid(leader_list[i]).get(), i);
+ leaders_group->set_mapping(leader_list[i], i);
leader_comm = new Comm(leaders_group, nullptr, true);
this->set_leaders_comm(leader_comm);
this->set_intra_comm(comm_intra);
// create intracommunicator
}else{
for (i=0; i< leader_group_size;i++)
- leaders_group->set_mapping(s4u::Actor::by_pid(leader_list[i]).get(), i);
+ leaders_group->set_mapping(leader_list[i], i);
if(this->get_leaders_comm()==MPI_COMM_NULL){
leader_comm = new Comm(leaders_group, nullptr, true);
}
}
-void Group::set_mapping(s4u::Actor* actor, int rank)
+void Group::set_mapping(aid_t pid, int rank)
{
if (0 <= rank && rank < size()) {
- aid_t pid = actor->get_pid();
if (static_cast<size_t>(pid) >= pid_to_rank_map_.size())
pid_to_rank_map_.resize(pid + 1, MPI_UNDEFINED);
rank_to_pid_map_[rank] = pid;
pid_to_rank_map_[pid] = rank;
+ s4u::Actor* actor = s4u::Actor::by_pid(pid).get();
rank_to_actor_map_[rank] = actor;
actor_to_rank_map_.insert({actor, rank});
}
result = MPI_UNEQUAL;
} else {
for (int i = 0; i < size(); i++) {
- int rank = group2->rank(actor(i));
+ int rank = group2->rank(actor_pid(i));
if (rank == MPI_UNDEFINED) {
result = MPI_UNEQUAL;
break;
*newgroup = new Group(n);
for (int i = 0; i < n; i++) {
- s4u::Actor* actor = this->actor(ranks[i]);
+ aid_t actor = this->actor_pid(ranks[i]);
(*newgroup)->set_mapping(actor, i);
}
(*newgroup)->add_f();
{
std::vector<int> ranks2;
for (int i = 0; i < group2->size(); i++) {
- s4u::Actor* actor = group2->actor(i);
+ aid_t actor = group2->actor_pid(i);
if (rank(actor) == MPI_UNDEFINED)
ranks2.push_back(i);
}
*newgroup = new Group(newsize);
int i;
for (i = 0; i < size(); i++) {
- s4u::Actor* actor1 = actor(i);
+ aid_t actor1 = actor_pid(i);
(*newgroup)->set_mapping(actor1, i);
}
for (int j : ranks2) {
- s4u::Actor* actor2 = group2->actor(j);
+ aid_t actor2 = group2->actor_pid(j);
(*newgroup)->set_mapping(actor2, i);
i++;
}
{
std::vector<int> ranks2;
for (int i = 0; i < group2->size(); i++) {
- s4u::Actor* actor = group2->actor(i);
+ aid_t actor = group2->actor_pid(i);
if (rank(actor) != MPI_UNDEFINED)
ranks2.push_back(i);
}
{
std::vector<int> ranks;
for (int i = 0; i < size(); i++) {
- s4u::Actor* actor = this->actor(i);
+ aid_t actor = this->actor_pid(i);
if (group2->rank(actor) == MPI_UNDEFINED)
ranks.push_back(i);
}
const Group* oldGroup = comm_old->group();
auto* newGroup = new Group(newSize);
for (int i = 0 ; i < newSize ; i++) {
- newGroup->set_mapping(oldGroup->actor(i), i);
+ newGroup->set_mapping(oldGroup->actor_pid(i), i);
}
*comm_cart = new Comm(newGroup, std::shared_ptr<Topo>(this));
}