}
for(j = 0; j < count; j++) {
//increment refcounter in order to avoid freeing the group too quick before copy
- smpi_group_use(group_out);
index = smpi_group_index(group, rankmap[2 * j]);
smpi_group_set_mapping(group_out, index, j);
}
}
xbt_free(recvbuf);
group_out = group_root; /* exit with root's group */
- if(group_out)smpi_group_unuse(group_out);
} else {
if(color != MPI_UNDEFINED) {
smpi_mpi_recv(&group_out, 1, MPI_PTR, 0, system_tag, comm, MPI_STATUS_IGNORE);
if(group_out){
group_out=smpi_group_copy(group_out);
- smpi_group_unuse(group_out);
}
} /* otherwise, exit with group_out == NULL */
}
int i;
smpi_bench_destroy();
- smpi_group_destroy(smpi_comm_group(MPI_COMM_WORLD));
+ smpi_group_unuse(smpi_comm_group(MPI_COMM_WORLD));
smpi_comm_destroy(MPI_COMM_WORLD);
MPI_COMM_WORLD = MPI_COMM_NULL;
for (i = 0; i < count; i++) {
- smpi_group_destroy(smpi_comm_group(process_data[i]->comm_self));
+ smpi_group_unuse(smpi_comm_group(process_data[i]->comm_self));
smpi_comm_destroy(process_data[i]->comm_self);
xbt_os_timer_free(process_data[i]->timer);
simcall_rdv_destroy(process_data[i]->mailbox);
{
MPI_Group group;
int i, count;
-
- count = smpi_process_count();
- group = xbt_new(s_smpi_mpi_group_t, 1);
- group->size = origin->size;
- group->rank_to_index_map = xbt_new(int, group->size);
- group->index_to_rank_map = xbt_new(int, count);
- group->refcount = 1;
- for (i = 0; i < group->size; i++) {
- group->rank_to_index_map[i] = origin->rank_to_index_map[i];
- }
- for (i = 0; i < count; i++) {
- group->index_to_rank_map[i] = origin->index_to_rank_map[i];
- }
+ if(origin!= smpi_comm_group(MPI_COMM_WORLD)
+ && origin != MPI_GROUP_NULL
+ && origin != smpi_comm_group(MPI_COMM_SELF)
+ && origin != MPI_GROUP_EMPTY)
+ {
+ count = smpi_process_count();
+ group = xbt_new(s_smpi_mpi_group_t, 1);
+ group->size = origin->size;
+ group->rank_to_index_map = xbt_new(int, group->size);
+ group->index_to_rank_map = xbt_new(int, count);
+ group->refcount = 1;
+ for (i = 0; i < group->size; i++) {
+ group->rank_to_index_map[i] = origin->rank_to_index_map[i];
+ }
+ for (i = 0; i < count; i++) {
+ group->index_to_rank_map[i] = origin->index_to_rank_map[i];
+ }
+ }
return group;
}
void smpi_group_destroy(MPI_Group group)
{
XBT_VERB("trying to free group %p, refcount = %d", group, group->refcount);
+ if(group!= smpi_comm_group(MPI_COMM_WORLD)
+ && group != MPI_GROUP_NULL
+ && group != smpi_comm_group(MPI_COMM_SELF)
+ && group != MPI_GROUP_EMPTY)
smpi_group_unuse(group);
}
{
if (rank < group->size && index < smpi_process_count()) {
group->rank_to_index_map[rank] = index;
- group->index_to_rank_map[index] = rank;
+ if(index!=MPI_UNDEFINED)group->index_to_rank_map[index] = rank;
}
}
int smpi_group_unuse(MPI_Group group)
{
- if (group->refcount-- <= 0) {
+ group->refcount--;
+ if (group->refcount <= 0) {
XBT_VERB("freeing group %p", group);
xbt_free(group->rank_to_index_map);
xbt_free(group->index_to_rank_map);
xbt_free(group);
+ return 0;
}
return group->refcount;
+
}
int smpi_group_size(MPI_Group group)
if (group == NULL) {
retval = MPI_ERR_ARG;
} else {
- if(*group!= smpi_comm_group(MPI_COMM_WORLD))// do not free the group of the comm_world
smpi_group_destroy(*group);
*group = MPI_GROUP_NULL;
retval = MPI_SUCCESS;
smpi_group_set_mapping(*newgroup, proc2, i);
}
}
- smpi_group_use(*newgroup);
retval = MPI_SUCCESS;
}
smpi_bench_begin();
}
}
}
- smpi_group_use(*newgroup);
retval = MPI_SUCCESS;
}
smpi_bench_begin();
}
}
}
- smpi_group_use(*newgroup);
retval = MPI_SUCCESS;
}
smpi_bench_begin();
*newgroup = MPI_GROUP_EMPTY;
} else if (n == smpi_group_size(group)) {
*newgroup = group;
+ if(group!= smpi_comm_group(MPI_COMM_WORLD)
+ && group != MPI_GROUP_NULL
+ && group != smpi_comm_group(MPI_COMM_SELF)
+ && group != MPI_GROUP_EMPTY)
+ smpi_group_use(group);
} else {
*newgroup = smpi_group_new(n);
for (i = 0; i < n; i++) {
smpi_group_set_mapping(*newgroup, index, i);
}
}
- smpi_group_use(*newgroup);
retval = MPI_SUCCESS;
}
smpi_bench_begin();
} else {
if (n == 0) {
*newgroup = group;
+ if(group!= smpi_comm_group(MPI_COMM_WORLD)
+ && group != MPI_GROUP_NULL
+ && group != smpi_comm_group(MPI_COMM_SELF)
+ && group != MPI_GROUP_EMPTY)
+ smpi_group_use(group);
} else if (n == smpi_group_size(group)) {
*newgroup = MPI_GROUP_EMPTY;
} else {
xbt_free(to_exclude);
}
- smpi_group_use(*newgroup);
retval = MPI_SUCCESS;
}
smpi_bench_begin();
}
}
}
- smpi_group_use(*newgroup);
retval = MPI_SUCCESS;
}
smpi_bench_begin();
} else {
if (n == 0) {
*newgroup = group;
+ if(group!= smpi_comm_group(MPI_COMM_WORLD)
+ && group != MPI_GROUP_NULL
+ && group != smpi_comm_group(MPI_COMM_SELF)
+ && group != MPI_GROUP_EMPTY)
+ smpi_group_use(group);
} else {
size = smpi_group_size(group);
for (i = 0; i < n; i++) {
}
}
}
- smpi_group_use(*newgroup);
retval = MPI_SUCCESS;
}
retval = MPI_ERR_ARG;
} else {
*group = smpi_comm_group(comm);
+ if(*group!= smpi_comm_group(MPI_COMM_WORLD)
+ && *group != MPI_GROUP_NULL
+ && *group != smpi_comm_group(MPI_COMM_SELF)
+ && *group != MPI_GROUP_EMPTY)
+ smpi_group_use(*group);
retval = MPI_SUCCESS;
}
smpi_bench_begin();