intra_node_root, shmem_comm);
}
} else {
+ smpi_free_tmp_buffer((void *) ((char *) tmp_buf + true_lb));
tmp_buf = in_buf;
}
smpi_mpi_send(tmp_buf, count, datatype, root,
COLL_TAG_REDUCE+1, comm);
}
-
if ((local_rank != 0) && (root == my_rank)) {
smpi_mpi_recv(recvbuf, count, datatype,
leader_of_root,
COLL_TAG_REDUCE+1, comm,
MPI_STATUS_IGNORE);
}
+ smpi_free_tmp_buffer((void *) ((char *) tmp_buf + true_lb));
+
+ if (leader_comm_rank == leader_root) {
+ if (my_rank != root || (my_rank == root && tmp_buf == recvbuf)) {
+ smpi_free_tmp_buffer(in_buf);
+ }
+ }
}
+
+
fn_exit:
return mpi_errno;
}
int recv_idx, last_idx = 0, newdst;
int dst, send_cnt, recv_cnt, newroot, newdst_tree_root;
int newroot_tree_root, new_count;
- int tag = COLL_TAG_REDUCE;
+ int tag = COLL_TAG_REDUCE,temporary_buffer=0;
void *send_ptr, *recv_ptr, *tmp_buf;
cnts = NULL;
/* If I'm not the root, then my recvbuf may not be valid, therefore
I have to allocate a temporary one */
if (rank != root && !recvbuf) {
+ temporary_buffer=1;
recvbuf = (void *)smpi_get_tmp_recvbuffer(count * extent);
}
/* find nearest power-of-two less than or equal to comm_size */
}
if (tmp_buf)
smpi_free_tmp_buffer(tmp_buf);
+ if(temporary_buffer==1) smpi_free_tmp_buffer(recvbuf);
if (cnts)
free(cnts);
if (disps)
XBT_PRIVATE int smpi_comm_dup(MPI_Comm comm, MPI_Comm* newcomm);
XBT_PRIVATE void smpi_comm_use(MPI_Comm comm);
XBT_PRIVATE void smpi_comm_unuse(MPI_Comm comm);
+XBT_PRIVATE void smpi_comm_cleanup_attributes(MPI_Comm comm);
+XBT_PRIVATE void smpi_comm_cleanup_smp(MPI_Comm comm);
XBT_PRIVATE void smpi_comm_set_leaders_comm(MPI_Comm comm, MPI_Comm leaders);
XBT_PRIVATE void smpi_comm_set_intra_comm(MPI_Comm comm, MPI_Comm leaders);
XBT_PRIVATE int* smpi_comm_get_non_uniform_map(MPI_Comm comm);
comm->refcount++;
}
-void smpi_comm_unuse(MPI_Comm comm){
- if (comm == MPI_COMM_UNINITIALIZED)
- comm = smpi_process_comm_world();
- comm->refcount--;
- smpi_group_unuse(comm->group);
- if(comm->refcount==0){
+void smpi_comm_cleanup_attributes(MPI_Comm comm){
+ if(comm->attributes !=NULL){
+ xbt_dict_cursor_t cursor = NULL;
+ int* key;
+ void * value;
+ int flag;
+ xbt_dict_foreach(comm->attributes, cursor, key, value){
+ smpi_comm_key_elem elem =
+ static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null(smpi_comm_keyvals, (const char*)key));
+ if(elem && elem->delete_fn)
+ elem->delete_fn(comm, *key, value, &flag);
+ }
+ }
+}
+
+void smpi_comm_cleanup_smp(MPI_Comm comm){
if(comm->intra_comm != MPI_COMM_NULL)
smpi_comm_unuse(comm->intra_comm);
if(comm->leaders_comm != MPI_COMM_NULL)
xbt_free(comm->non_uniform_map);
if(comm->leaders_map !=NULL)
xbt_free(comm->leaders_map);
- if(comm->attributes !=NULL){
- xbt_dict_cursor_t cursor = NULL;
- int* key;
- void * value;
- int flag;
- xbt_dict_foreach(comm->attributes, cursor, key, value){
- smpi_comm_key_elem elem =
- static_cast<smpi_comm_key_elem>(xbt_dict_get_or_null(smpi_comm_keyvals, (const char*)key));
- if(elem && elem->delete_fn)
- elem->delete_fn(comm, *key, value, &flag);
- }
- }
+}
+
+void smpi_comm_unuse(MPI_Comm comm){
+ if (comm == MPI_COMM_UNINITIALIZED)
+ comm = smpi_process_comm_world();
+ comm->refcount--;
+ smpi_group_unuse(comm->group);
+
+ if(comm->refcount==0){
+ smpi_comm_cleanup_smp(comm);
+ smpi_comm_cleanup_attributes(comm);
xbt_free(comm);
}
}
for (i=0; i< leader_group_size;i++)
smpi_group_set_mapping(leaders_group, leader_list[i], i);
- leader_comm = smpi_comm_new(leaders_group, NULL);
- if(smpi_comm_get_leaders_comm(comm)==MPI_COMM_NULL)
+ if(smpi_comm_get_leaders_comm(comm)==MPI_COMM_NULL){
+ leader_comm = smpi_comm_new(leaders_group, NULL);
smpi_comm_set_leaders_comm(comm, leader_comm);
+ }else{
+ leader_comm=smpi_comm_get_leaders_comm(comm);
+ smpi_group_unuse(leaders_group);
+ }
smpi_process_set_comm_intra(comm_intra);
}