diff --git a/ompi/mca/bcol/base/bcol_base_frame.c b/ompi/mca/bcol/base/bcol_base_frame.c index c09a96c5ab..c140923ff9 100644 --- a/ompi/mca/bcol/base/bcol_base_frame.c +++ b/ompi/mca/bcol/base/bcol_base_frame.c @@ -3,8 +3,10 @@ * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * Copyright (c) 2013 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2013 Los Alamos National Security, LLC. All rights + * Copyright (c) 2013-2014 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -336,10 +338,22 @@ int mca_bcol_base_bcol_fns_table_init(struct mca_bcol_base_module_t *bcol_module return OMPI_SUCCESS; } +static void mca_bcol_base_coll_fn_desc_constructor(mca_bcol_base_coll_fn_desc_t *fn) +{ + fn->comm_attr = NULL; + fn->inv_attr = NULL; +} + +static void mca_bcol_base_coll_fn_desc_destructor(mca_bcol_base_coll_fn_desc_t *fn) +{ + free(fn->comm_attr); + free(fn->inv_attr); +} + OBJ_CLASS_INSTANCE(mca_bcol_base_coll_fn_desc_t, opal_list_item_t, - NULL, - NULL); + mca_bcol_base_coll_fn_desc_constructor, + mca_bcol_base_coll_fn_desc_destructor); static void lmngr_block_constructor(mca_bcol_base_lmngr_block_t *item) { diff --git a/ompi/mca/bcol/basesmuma/bcol_basesmuma.h b/ompi/mca/bcol/basesmuma/bcol_basesmuma.h index 511378a828..695c0c7d9b 100644 --- a/ompi/mca/bcol/basesmuma/bcol_basesmuma.h +++ b/ompi/mca/bcol/basesmuma/bcol_basesmuma.h @@ -5,6 +5,8 @@ * Copyright (c) 2013-2014 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2014 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -1175,6 +1177,12 @@ int bcol_basesmuma_bank_init_opti(struct mca_bcol_base_memory_block_desc_t *payl mca_bcol_base_module_t *bcol_module, void *reg_data); +/* cleanup nb_coll_buff_desc */ +void cleanup_nb_coll_buff_desc(mca_bcol_basesmuma_nb_coll_buff_desc_t **desc, + uint32_t num_banks, + uint32_t num_buffers_per_bank); + + /* used for shared memory offset exchange */ int base_bcol_basesmuma_exchange_offsets( mca_bcol_basesmuma_module_t *sm_bcol_module, diff --git a/ompi/mca/bcol/basesmuma/bcol_basesmuma_buf_mgmt.c b/ompi/mca/bcol/basesmuma/bcol_basesmuma_buf_mgmt.c index 1ee4092830..424311357c 100644 --- a/ompi/mca/bcol/basesmuma/bcol_basesmuma_buf_mgmt.c +++ b/ompi/mca/bcol/basesmuma/bcol_basesmuma_buf_mgmt.c @@ -5,6 +5,8 @@ * Copyright (c) 2013-2014 Los Alamos National Security, LLC. * All rights reserved. * Copyright (c) 2014 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -210,6 +212,27 @@ static int init_nb_coll_buff_desc(mca_bcol_basesmuma_nb_coll_buff_desc_t **desc, } +/* + * Free buffers for storing non-blocking collective descriptions. + * + */ +void cleanup_nb_coll_buff_desc(mca_bcol_basesmuma_nb_coll_buff_desc_t **desc, + uint32_t num_banks, + uint32_t num_buffers_per_bank) +{ + uint32_t ci; + if (NULL != *desc) { + for (ci=0; cisuper.list_n_connected = NULL; } + cleanup_nb_coll_buff_desc(&sm_module->ml_mem.nb_coll_desc, + sm_module->ml_mem.num_banks, + sm_module->ml_mem.num_buffers_per_bank); + + for (i = 0; i < BCOL_NUM_OF_FUNCTIONS; i++){ + /* gvm FIX: Go through the list and destroy each item */ + /* Destroy the function table object for each bcol type list */ + OPAL_LIST_DESTRUCT((&sm_module->super.bcol_fns_table[i])); + } + + if (NULL != sm_module->payload_backing_files_info) { + free(sm_module->payload_backing_files_info); + sm_module->payload_backing_files_info = NULL; + } + + if (NULL != sm_module->ctl_backing_files_info) { + free(sm_module->ctl_backing_files_info); + sm_module->ctl_backing_files_info = NULL; + } + + if (NULL != sm_module->ml_mem.bank_release_counter) { + free(sm_module->ml_mem.bank_release_counter); + sm_module->ml_mem.bank_release_counter = NULL; + } + + if (NULL != sm_module->colls_with_user_data.data_buffs) { + free((void *)sm_module->colls_with_user_data.data_buffs); + sm_module->colls_with_user_data.data_buffs = NULL; + } + /* free the k-nomial allgather tree here */ - - + netpatterns_cleanup_recursive_knomial_allgather_tree_node(&sm_module->knomial_allgather_tree); + netpatterns_cleanup_recursive_doubling_tree_node(&sm_module->recursive_doubling_tree); + netpatterns_cleanup_recursive_knomial_tree_node(&sm_module->knomial_exchange_tree); /* done */ } diff --git a/ompi/mca/bcol/basesmuma/bcol_basesmuma_setup.c b/ompi/mca/bcol/basesmuma/bcol_basesmuma_setup.c index aa06ec2c74..3ed14a0682 100644 --- a/ompi/mca/bcol/basesmuma/bcol_basesmuma_setup.c +++ b/ompi/mca/bcol/basesmuma/bcol_basesmuma_setup.c @@ -5,6 +5,8 @@ * Copyright (c) 2013-2014 Los Alamos National Security, LLC. * All rights reserved. * Copyright (c) 2014 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -554,6 +556,15 @@ int base_bcol_basesmuma_setup_library_buffers( goto exit_ERROR; } + /* FIXME base_bcol_basesmuma_setup_ctl_struct will allocate + * sm_bcol_module->shared_memory_scratch_space which was previously + * allocated by the previous call to base_bcol_basesmuma_setup_ctl_struct + * so let's free it in order to avoid a memory leak */ + if (sm_bcol_module->shared_memory_scratch_space) { + free(sm_bcol_module->shared_memory_scratch_space); + sm_bcol_module->shared_memory_scratch_space = NULL; + } + ret=base_bcol_basesmuma_setup_ctl_struct( sm_bcol_module, cs, &(sm_bcol_module->colls_with_user_data)); if( OMPI_SUCCESS != ret ) { diff --git a/ompi/mca/bcol/basesmuma/bcol_basesmuma_smcm.c b/ompi/mca/bcol/basesmuma/bcol_basesmuma_smcm.c index 060bdb754e..df215114f7 100644 --- a/ompi/mca/bcol/basesmuma/bcol_basesmuma_smcm.c +++ b/ompi/mca/bcol/basesmuma/bcol_basesmuma_smcm.c @@ -6,6 +6,8 @@ * Copyright (c) 2012-2014 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2014 Intel, Inc. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -185,6 +187,11 @@ int bcol_basesmuma_smcm_allgather_connection( return OMPI_ERR_OUT_OF_RESOURCE; } + /* FIXME *back_files might have been already allocated + * so free it in order to avoid a memory leak */ + if (NULL != *back_files) { + free (*back_files); + } *back_files = backing_files; my_id = ompi_proc_local(); diff --git a/ompi/mca/bcol/ptpcoll/bcol_ptpcoll_module.c b/ompi/mca/bcol/ptpcoll/bcol_ptpcoll_module.c index 378f4fa838..8975fceed6 100644 --- a/ompi/mca/bcol/ptpcoll/bcol_ptpcoll_module.c +++ b/ompi/mca/bcol/ptpcoll/bcol_ptpcoll_module.c @@ -4,6 +4,8 @@ * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * Copyright (c) 2012-2014 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -147,11 +149,37 @@ mca_bcol_ptpcoll_module_destruct(mca_bcol_ptpcoll_module_t *ptpcoll_module) OBJ_DESTRUCT(&ptpcoll_module->collreqs_free); - if( NULL != ptpcoll_module->super.list_n_connected ){ + if (NULL != ptpcoll_module->super.list_n_connected) { free(ptpcoll_module->super.list_n_connected); ptpcoll_module->super.list_n_connected = NULL; } + for (i = 0; i < BCOL_NUM_OF_FUNCTIONS; i++){ + OPAL_LIST_DESTRUCT((&ptpcoll_module->super.bcol_fns_table[i])); + } + + + if (NULL != ptpcoll_module->kn_proxy_extra_index) { + free(ptpcoll_module->kn_proxy_extra_index); + ptpcoll_module->kn_proxy_extra_index = NULL; + } + + if (NULL != ptpcoll_module->alltoall_iovec) { + free(ptpcoll_module->alltoall_iovec); + ptpcoll_module->alltoall_iovec = NULL; + } + + if (NULL != ptpcoll_module->narray_knomial_proxy_extra_index) { + free(ptpcoll_module->narray_knomial_proxy_extra_index); + ptpcoll_module->narray_knomial_proxy_extra_index = NULL; + } + if (NULL != ptpcoll_module->narray_knomial_node) { + free(ptpcoll_module->narray_knomial_node); + ptpcoll_module->narray_knomial_node = NULL; + } + + netpatterns_cleanup_recursive_knomial_allgather_tree_node(&ptpcoll_module->knomial_allgather_tree); + netpatterns_cleanup_recursive_knomial_tree_node(&ptpcoll_module->knomial_exchange_tree); } diff --git a/ompi/mca/coll/ml/coll_ml.h b/ompi/mca/coll/ml/coll_ml.h index de05bddb3f..acbcfd9cfa 100644 --- a/ompi/mca/coll/ml/coll_ml.h +++ b/ompi/mca/coll/ml/coll_ml.h @@ -4,6 +4,8 @@ * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * Copyright (c) 2013 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -262,6 +264,7 @@ int ml_coll_hier_barrier_setup(struct mca_coll_ml_module_t *ml_module); /* allreduce */ int ml_coll_hier_allreduce_setup(struct mca_coll_ml_module_t *ml_module); int ml_coll_hier_allreduce_setup_new(struct mca_coll_ml_module_t *ml_module); +void ml_coll_hier_allreduce_cleanup_new(struct mca_coll_ml_module_t *ml_module); /* alltoall */ int ml_coll_hier_alltoall_setup(struct mca_coll_ml_module_t *ml_module); @@ -269,15 +272,18 @@ int ml_coll_hier_alltoall_setup_new(struct mca_coll_ml_module_t *ml_module); /* allgather */ int ml_coll_hier_allgather_setup(struct mca_coll_ml_module_t *ml_module); +void ml_coll_hier_allgather_cleanup(struct mca_coll_ml_module_t *ml_module); /* gather */ int ml_coll_hier_gather_setup(struct mca_coll_ml_module_t *ml_module); /* broadcast */ int ml_coll_hier_bcast_setup(struct mca_coll_ml_module_t *ml_module); +void ml_coll_hier_bcast_cleanup(struct mca_coll_ml_module_t *ml_module); /* reduce */ int ml_coll_hier_reduce_setup(struct mca_coll_ml_module_t *ml_module); +void ml_coll_hier_reduce_cleanup(struct mca_coll_ml_module_t *ml_module); /* reduce */ int ml_coll_hier_scatter_setup(struct mca_coll_ml_module_t *ml_module); diff --git a/ompi/mca/coll/ml/coll_ml_descriptors.c b/ompi/mca/coll/ml/coll_ml_descriptors.c index 7c3112b946..4060c27ed7 100644 --- a/ompi/mca/coll/ml/coll_ml_descriptors.c +++ b/ompi/mca/coll/ml/coll_ml_descriptors.c @@ -1,6 +1,11 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. + * Copyright (c) 2014 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -14,12 +19,15 @@ static inline void mca_coll_ml_fragment_constructor(mca_coll_ml_fragment_t *frag) { - - + frag->fn_args = NULL; } static inline void mca_coll_ml_fragment_destructor(mca_coll_ml_fragment_t *frag) { + if (frag->fn_args) { + free(frag->fn_args); + frag->fn_args = NULL; + } } static inline void mca_coll_ml_descriptor_constructor(mca_coll_ml_descriptor_t *descriptor) diff --git a/ompi/mca/coll/ml/coll_ml_hier_algorithms_allgather_setup.c b/ompi/mca/coll/ml/coll_ml_hier_algorithms_allgather_setup.c index 86bb0751f2..1fc128654a 100644 --- a/ompi/mca/coll/ml/coll_ml_hier_algorithms_allgather_setup.c +++ b/ompi/mca/coll/ml/coll_ml_hier_algorithms_allgather_setup.c @@ -4,6 +4,8 @@ * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * Copyright (c) 2013 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -191,3 +193,36 @@ int ml_coll_hier_allgather_setup(mca_coll_ml_module_t *ml_module) return OMPI_SUCCESS; } + +void ml_coll_hier_allgather_cleanup(mca_coll_ml_module_t *ml_module) +{ + /* Hierarchy Setup */ + int ret, topo_index, alg; + mca_coll_ml_topology_t *topo_info = ml_module->topo_list; + + alg = mca_coll_ml_component.coll_config[ML_ALLGATHER][ML_SMALL_MSG].algorithm_id; + topo_index = ml_module->collectives_topology_map[ML_ALLGATHER][alg]; + if (ML_UNDEFINED == alg || ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index or algorithm was defined")); + topo_info->hierarchical_algorithms[ML_ALLGATHER] = NULL; + return; + } + + free(ml_module->coll_ml_allgather_functions[alg]->component_functions); + ml_module->coll_ml_allgather_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_allgather_functions[alg]); + ml_module->coll_ml_allgather_functions[alg] = NULL; + + alg = mca_coll_ml_component.coll_config[ML_ALLGATHER][ML_LARGE_MSG].algorithm_id; + topo_index = ml_module->collectives_topology_map[ML_ALLGATHER][alg]; + if (ML_UNDEFINED == alg || ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index or algorithm was defined")); + topo_info->hierarchical_algorithms[ML_ALLGATHER] = NULL; + return; + } + + free(ml_module->coll_ml_allgather_functions[alg]->component_functions); + ml_module->coll_ml_allgather_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_allgather_functions[alg]); + ml_module->coll_ml_allgather_functions[alg] = NULL; +} diff --git a/ompi/mca/coll/ml/coll_ml_hier_algorithms_allreduce_setup.c b/ompi/mca/coll/ml/coll_ml_hier_algorithms_allreduce_setup.c index b9e16ca781..1bb5349682 100644 --- a/ompi/mca/coll/ml/coll_ml_hier_algorithms_allreduce_setup.c +++ b/ompi/mca/coll/ml/coll_ml_hier_algorithms_allreduce_setup.c @@ -4,6 +4,8 @@ * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * Copyright (c) 2014 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -363,3 +365,66 @@ int ml_coll_hier_allreduce_setup_new(mca_coll_ml_module_t *ml_module) return OMPI_SUCCESS; } + +void ml_coll_hier_allreduce_cleanup_new(mca_coll_ml_module_t *ml_module) +{ + /* Hierarchy Setup */ + int ret; + int topo_index; + int alg; + mca_coll_ml_topology_t *topo_info = ml_module->topo_list; + + alg = mca_coll_ml_component.coll_config[ML_ALLREDUCE][ML_SMALL_MSG].algorithm_id; + topo_index = ml_module->collectives_topology_map[ML_ALLREDUCE][alg]; + if (ML_UNDEFINED == alg || ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index or algorithm was defined")); + topo_info->hierarchical_algorithms[ML_ALLREDUCE] = NULL; + return; + } + + free(ml_module->coll_ml_allreduce_functions[alg]->component_functions); + ml_module->coll_ml_allreduce_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_allreduce_functions[alg]); + ml_module->coll_ml_allreduce_functions[alg] = NULL; + + alg = mca_coll_ml_component.coll_config[ML_ALLREDUCE][ML_LARGE_MSG].algorithm_id; + topo_index = ml_module->collectives_topology_map[ML_ALLREDUCE][alg]; + if (ML_UNDEFINED == alg || ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index or algorithm was defined")); + topo_info->hierarchical_algorithms[ML_ALLREDUCE] = NULL; + return; + } + + free(ml_module->coll_ml_allreduce_functions[alg]->component_functions); + ml_module->coll_ml_allreduce_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_allreduce_functions[alg]); + ml_module->coll_ml_allreduce_functions[alg] = NULL; + + if (true == mca_coll_ml_component.need_allreduce_support) { + topo_index = ml_module->collectives_topology_map[ML_ALLREDUCE][ML_SMALL_DATA_EXTRA_TOPO_ALLREDUCE]; + if (ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index was defined")); + topo_info->hierarchical_algorithms[ML_ALLREDUCE] = NULL; + return; + } + + alg = ML_SMALL_DATA_EXTRA_TOPO_ALLREDUCE; + free(ml_module->coll_ml_allreduce_functions[alg]->component_functions); + ml_module->coll_ml_allreduce_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_allreduce_functions[alg]); + ml_module->coll_ml_allreduce_functions[alg] = NULL; + + topo_index = ml_module->collectives_topology_map[ML_ALLREDUCE][ML_LARGE_DATA_EXTRA_TOPO_ALLREDUCE]; + if (ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index was defined")); + topo_info->hierarchical_algorithms[ML_ALLREDUCE] = NULL; + return; + } + + alg = ML_LARGE_DATA_EXTRA_TOPO_ALLREDUCE; + free(ml_module->coll_ml_allreduce_functions[alg]->component_functions); + ml_module->coll_ml_allreduce_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_allreduce_functions[alg]); + ml_module->coll_ml_allreduce_functions[alg] = NULL; + } +} diff --git a/ompi/mca/coll/ml/coll_ml_hier_algorithms_bcast_setup.c b/ompi/mca/coll/ml/coll_ml_hier_algorithms_bcast_setup.c index 0696a3f3a7..0593ea5281 100644 --- a/ompi/mca/coll/ml/coll_ml_hier_algorithms_bcast_setup.c +++ b/ompi/mca/coll/ml/coll_ml_hier_algorithms_bcast_setup.c @@ -1,6 +1,8 @@ /* * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -800,3 +802,48 @@ int ml_coll_hier_bcast_setup(mca_coll_ml_module_t *ml_module) topo_info->hierarchical_algorithms[BCOL_BCAST] = NULL; return ret; } + +void ml_coll_hier_bcast_cleanup(mca_coll_ml_module_t *ml_module) +{ + /* Hierarchy Setup */ + int ret, i , size_code, alg; + int topo_index = 0; + mca_coll_ml_topology_t *topo_info = ml_module->topo_list; + + for (i = 0; i < ML_NUM_MSG; i++) { + + switch (i) { + case ML_SMALL_MSG: + case ML_LARGE_MSG: + break; + default: + topo_info->hierarchical_algorithms[ML_BCAST] = NULL; + return; + } + + alg = mca_coll_ml_component.coll_config[ML_BCAST][i].algorithm_id; + topo_index = ml_module->collectives_topology_map[ML_BCAST][alg]; + if (ML_UNDEFINED == alg || ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index or algorithm was defined")); + topo_info->hierarchical_algorithms[ML_BCAST] = NULL; + return; + } + + switch (alg) { + case ML_BCAST_SMALL_DATA_KNOWN: + case ML_BCAST_LARGE_DATA_KNOWN: + case ML_BCAST_SMALL_DATA_UNKNOWN: + case ML_BCAST_LARGE_DATA_UNKNOWN: + case ML_BCAST_SMALL_DATA_SEQUENTIAL: + case ML_BCAST_LARGE_DATA_SEQUENTIAL: + free(ml_module->coll_ml_bcast_functions[alg]->component_functions); + ml_module->coll_ml_bcast_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_bcast_functions[alg]); + ml_module->coll_ml_bcast_functions[alg] = NULL; + break; + default: + topo_info->hierarchical_algorithms[ML_BCAST] = NULL; + return; + } + } +} diff --git a/ompi/mca/coll/ml/coll_ml_hier_algorithms_reduce_setup.c b/ompi/mca/coll/ml/coll_ml_hier_algorithms_reduce_setup.c index 297d3d422f..acd87ade48 100644 --- a/ompi/mca/coll/ml/coll_ml_hier_algorithms_reduce_setup.c +++ b/ompi/mca/coll/ml/coll_ml_hier_algorithms_reduce_setup.c @@ -4,6 +4,8 @@ * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * Copyright (c) 2014 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -309,3 +311,36 @@ int ml_coll_hier_reduce_setup(mca_coll_ml_module_t *ml_module) return OMPI_SUCCESS; } + +void ml_coll_hier_reduce_cleanup(mca_coll_ml_module_t *ml_module) +{ + int alg, i, topo_index=0; + mca_coll_ml_topology_t *topo_info = + &ml_module->topo_list[ml_module->collectives_topology_map[ML_REDUCE][ML_SMALL_MSG]]; + + if ( ml_module->max_fn_calls < topo_info->n_levels ) { + ml_module->max_fn_calls = topo_info->n_levels; + } + + + alg = mca_coll_ml_component.coll_config[ML_REDUCE][ML_SMALL_MSG].algorithm_id; + topo_index = ml_module->collectives_topology_map[ML_REDUCE][alg]; + if (ML_UNDEFINED == alg || ML_UNDEFINED == topo_index) { + ML_ERROR(("No topology index or algorithm was defined")); + topo_info->hierarchical_algorithms[ML_REDUCE] = NULL; + return; + } + + for (i=0; itopo_list[topo_index].n_levels; i++) { + free(ml_module->coll_ml_reduce_functions[alg]->comp_fn_arr[i]); + ml_module->coll_ml_reduce_functions[alg]->comp_fn_arr[i] = NULL; + } + + free(ml_module->coll_ml_reduce_functions[alg]->comp_fn_arr); + ml_module->coll_ml_reduce_functions[alg]->comp_fn_arr = NULL; + + free(ml_module->coll_ml_reduce_functions[alg]->component_functions); + ml_module->coll_ml_reduce_functions[alg]->component_functions = NULL; + free(ml_module->coll_ml_reduce_functions[alg]); + ml_module->coll_ml_reduce_functions[alg] = NULL; +} diff --git a/ompi/mca/coll/ml/coll_ml_module.c b/ompi/mca/coll/ml/coll_ml_module.c index 2802c51a77..3d74f238cf 100644 --- a/ompi/mca/coll/ml/coll_ml_module.c +++ b/ompi/mca/coll/ml/coll_ml_module.c @@ -5,6 +5,8 @@ * Copyright (c) 2012-2014 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2013-2014 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -159,11 +161,13 @@ mca_coll_ml_module_construct(mca_coll_ml_module_t *module) static void mca_coll_ml_module_destruct(mca_coll_ml_module_t *module) { - int i, j, k,fnc, index_topo; + int i, j, k,fnc, index_topo, alg; mca_coll_ml_topology_t *topo; ML_VERBOSE(4, ("ML module destruct")); + ml_coll_hier_reduce_cleanup(module); + for (index_topo = 0; index_topo < COLL_ML_TOPO_MAX; index_topo++) { topo = &module->topo_list[index_topo]; if (COLL_ML_TOPO_DISABLED == topo->status) { @@ -207,9 +211,13 @@ mca_coll_ml_module_destruct(mca_coll_ml_module_t *module) free(topo->array_of_all_subgroups); topo->array_of_all_subgroups = NULL; } + if (NULL != topo->hier_layout_info) { + free(topo->hier_layout_info); + topo->hier_layout_info = NULL; + } } - OBJ_DESTRUCT(&(module->active_bcols_list)); + OPAL_LIST_DESTRUCT(&(module->active_bcols_list)); OBJ_DESTRUCT(&(module->waiting_for_memory_list)); /* gvm Leak FIX Remove fragment free list */ @@ -225,9 +233,27 @@ mca_coll_ml_module_destruct(mca_coll_ml_module_t *module) OBJ_DESTRUCT(&(module->coll_ml_collective_descriptors)); if (NULL != module->coll_ml_barrier_function) { + if (NULL != module->coll_ml_barrier_function->component_functions) { + free(module->coll_ml_barrier_function->component_functions); + module->coll_ml_barrier_function->component_functions = NULL; + } free(module->coll_ml_barrier_function); + module->coll_ml_barrier_function = NULL; } + if (module->coll_ml_memsync_function) { + if (module->coll_ml_memsync_function->component_functions) { + free(module->coll_ml_memsync_function->component_functions); + module->coll_ml_memsync_function->component_functions = NULL; + } + free(module->coll_ml_memsync_function); + module->coll_ml_memsync_function = NULL; + } + + ml_coll_hier_allreduce_cleanup_new(module); + ml_coll_hier_allgather_cleanup(module); + ml_coll_hier_bcast_cleanup(module); + /* release saved collectives */ ML_RELEASE_FALLBACK(module, allreduce); ML_RELEASE_FALLBACK(module, allgather); @@ -1555,6 +1581,8 @@ static int ml_discover_hierarchy(mca_coll_ml_module_t *ml_module) MPI_MIN, ompi_comm_size(ml_module->comm), comm_ranks, ml_module->comm); + free(comm_ranks); + if (OMPI_SUCCESS != ret) { ML_ERROR(("comm_allreduce - failed to collect max_comm data")); return ret; diff --git a/ompi/mca/coll/ml/coll_ml_select.c b/ompi/mca/coll/ml/coll_ml_select.c index 9ea3ed8d39..429ca5d4d9 100644 --- a/ompi/mca/coll/ml/coll_ml_select.c +++ b/ompi/mca/coll/ml/coll_ml_select.c @@ -1,3 +1,18 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2009-2013 Oak Ridge National Laboratory. All rights reserved. + * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. + * Copyright (c) 2012-2014 Los Alamos National Security, LLC. All rights + * reserved. + * Copyright (c) 2013-2014 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ /* * Code for selecting a collective function. The selection is based on * comm-time attributes and invoke-time attributes. @@ -279,6 +294,8 @@ int mca_coll_ml_build_filtered_fn_table(mca_coll_ml_module_t *ml_module) return OMPI_ERROR; } + free(my_comm_attrib); + return OMPI_SUCCESS; } diff --git a/ompi/patterns/comm/allgather.c b/ompi/patterns/comm/allgather.c index a6c0337e34..a12a198c83 100644 --- a/ompi/patterns/comm/allgather.c +++ b/ompi/patterns/comm/allgather.c @@ -3,6 +3,8 @@ * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * Copyright (c) 2012 Los Alamos National Security, LLC. * All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -73,6 +75,7 @@ OMPI_DECLSPEC int comm_allgather_pml(void *src_buf, void *dest_buf, int count, } /* get my reduction communication pattern */ + memset(&my_exchange_node, 0, sizeof(netpatterns_pair_exchange_node_t)); rc = netpatterns_setup_recursive_doubling_tree_node(n_peers, my_rank_in_group, &my_exchange_node); if(OMPI_SUCCESS != rc){ @@ -280,6 +283,8 @@ OMPI_DECLSPEC int comm_allgather_pml(void *src_buf, void *dest_buf, int count, } } + netpatterns_cleanup_recursive_doubling_tree_node(&my_exchange_node); + /* return */ return OMPI_SUCCESS; diff --git a/ompi/patterns/comm/allreduce.c b/ompi/patterns/comm/allreduce.c index a11f989c59..92b0647218 100644 --- a/ompi/patterns/comm/allreduce.c +++ b/ompi/patterns/comm/allreduce.c @@ -3,6 +3,8 @@ * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * Copyright (c) 2012 Los Alamos National Security, LLC. * All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -76,6 +78,7 @@ OMPI_DECLSPEC int comm_allreduce_pml(void *sbuf, void *rbuf, int count, n_data_segments=(count+n_dts_per_buffer -1 ) / n_dts_per_buffer ; /* get my reduction communication pattern */ + memset(&my_exchange_node, 0, sizeof(netpatterns_pair_exchange_node_t)); rc = netpatterns_setup_recursive_doubling_tree_node(n_peers, my_rank_in_group, &my_exchange_node); if(OMPI_SUCCESS != rc){ @@ -247,6 +250,8 @@ OMPI_DECLSPEC int comm_allreduce_pml(void *sbuf, void *rbuf, int count, count_processed += count_this_stripe; } + netpatterns_cleanup_recursive_doubling_tree_node(&my_exchange_node); + /* return */ return OMPI_SUCCESS; diff --git a/ompi/patterns/comm/bcast.c b/ompi/patterns/comm/bcast.c index f46bf0deff..01110a6331 100644 --- a/ompi/patterns/comm/bcast.c +++ b/ompi/patterns/comm/bcast.c @@ -3,6 +3,8 @@ * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * Copyright (c) 2012 Los Alamos National Security, LLC. * All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -89,6 +91,10 @@ OMPI_DECLSPEC int comm_bcast_pml(void *buffer, int root, int count, ompi_request_wait_all(msg_cnt,requests,MPI_STATUSES_IGNORE); } + if (node_data.children_ranks) { + free(node_data.children_ranks); + } + /* return */ return OMPI_SUCCESS; diff --git a/ompi/patterns/net/netpatterns_knomial_tree.c b/ompi/patterns/net/netpatterns_knomial_tree.c index e5f607084a..ec8ed24149 100644 --- a/ompi/patterns/net/netpatterns_knomial_tree.c +++ b/ompi/patterns/net/netpatterns_knomial_tree.c @@ -1,7 +1,9 @@ /* * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. -* $COPYRIGHT$ + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. + * $COPYRIGHT$ * * Additional copyrights may follow * @@ -499,6 +501,33 @@ Error: return OMPI_ERROR; } +OMPI_DECLSPEC void netpatterns_cleanup_recursive_knomial_allgather_tree_node( + netpatterns_k_exchange_node_t *exchange_node) +{ + int i; + + free(exchange_node->reindex_map); + free(exchange_node->inv_reindex_map); + if (exchange_node->n_extra_sources > 0) { + free(exchange_node->rank_extra_sources_array) ; + exchange_node->n_extra_sources = 0; + exchange_node->rank_extra_sources_array = NULL; + } + if (exchange_node->n_exchanges > 0) { + for (i=0; i < exchange_node->n_exchanges; i++) { + free(exchange_node->rank_exchanges[i]); + exchange_node->rank_exchanges[i] = NULL; + } + free(exchange_node->rank_exchanges); + exchange_node->rank_exchanges = NULL; + exchange_node->n_exchanges = 0; + } + for(i = 0; i < exchange_node->log_tree_order; i++){ + free(exchange_node->payload_info[i]); + } + free(exchange_node->payload_info); +} + OMPI_DECLSPEC int netpatterns_setup_recursive_knomial_tree_node( int num_nodes, int node_rank, int tree_order, @@ -655,6 +684,27 @@ Error: return OMPI_ERROR; } +OMPI_DECLSPEC void netpatterns_cleanup_recursive_knomial_tree_node( + netpatterns_k_exchange_node_t *exchange_node) +{ + int i; + + if (exchange_node->n_extra_sources > 0) { + free(exchange_node->rank_extra_sources_array); + exchange_node->rank_extra_sources_array = NULL; + exchange_node->n_extra_sources = 0; + } + if (exchange_node->n_exchanges > 0) { + for (i=0 ; in_exchanges; i++) { + free(exchange_node->rank_exchanges[i]); + exchange_node->rank_exchanges[i] = NULL; + } + free(exchange_node->rank_exchanges); + exchange_node->rank_exchanges = NULL; + exchange_node->n_exchanges = 0; + } +} + #if 1 OMPI_DECLSPEC int netpatterns_setup_recursive_doubling_n_tree_node(int num_nodes, int node_rank, int tree_order, netpatterns_pair_exchange_node_t *exchange_node) @@ -797,7 +847,7 @@ Error: return OMPI_ERROR; } -OMPI_DECLSPEC void netpatterns_free_recursive_doubling_tree_node( +OMPI_DECLSPEC void netpatterns_cleanup_recursive_doubling_tree_node( netpatterns_pair_exchange_node_t *exchange_node) { NETPATTERNS_VERBOSE(("About to release rank_extra_sources_array and rank_exchanges")); diff --git a/ompi/patterns/net/netpatterns_knomial_tree.h b/ompi/patterns/net/netpatterns_knomial_tree.h index d1cd5b2ced..6ff89cd692 100644 --- a/ompi/patterns/net/netpatterns_knomial_tree.h +++ b/ompi/patterns/net/netpatterns_knomial_tree.h @@ -3,6 +3,8 @@ * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * Copyright (c) 2012 Los Alamos National Security, LLC. * All rights reserved. + * Copyright (c) 2014 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -111,7 +113,7 @@ typedef struct netpatterns_k_exchange_node_t OMPI_DECLSPEC int netpatterns_setup_recursive_doubling_n_tree_node(int num_nodes, int node_rank, int tree_order, netpatterns_pair_exchange_node_t *exchange_node); -OMPI_DECLSPEC void netpatterns_free_recursive_doubling_tree_node( +OMPI_DECLSPEC void netpatterns_cleanup_recursive_doubling_tree_node( netpatterns_pair_exchange_node_t *exchange_node); OMPI_DECLSPEC int netpatterns_setup_recursive_doubling_tree_node(int num_nodes, int node_rank, @@ -121,10 +123,15 @@ OMPI_DECLSPEC int netpatterns_setup_recursive_knomial_tree_node( int num_nodes, int node_rank, int tree_order, netpatterns_k_exchange_node_t *exchange_node); +OMPI_DECLSPEC void netpatterns_cleanup_recursive_knomial_tree_node( + netpatterns_k_exchange_node_t *exchange_node); + OMPI_DECLSPEC int netpatterns_setup_recursive_knomial_allgather_tree_node( int num_nodes, int node_rank, int tree_order, int *hier_ranks, netpatterns_k_exchange_node_t *exchange_node); +OMPI_DECLSPEC void netpatterns_cleanup_recursive_knomial_allgather_tree_node( + netpatterns_k_exchange_node_t *exchange_node); /* Input: k_exchange_node structure Output: index in rank_exchanges array that points