Introduce a new debugging MCA parameter:
mpi_show_mpi_alloc_mem_leaks When activated, MPI_FINALIZE displays a list of memory allocations from MPI_ALLOC_MEM that were not freed by MPI_FREE_MEM (in each MPI process). * If set to a positive integer, display only that many leaks. * If set to a negative integer, display all leaks. * If set to 0, do not show any leaks. This commit was SVN r15736.
Этот коммит содержится в:
родитель
0fb8cf65a8
Коммит
d3f008492f
@ -9,6 +9,7 @@
|
|||||||
# University of Stuttgart. All rights reserved.
|
# University of Stuttgart. All rights reserved.
|
||||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
@ -35,6 +36,7 @@ else
|
|||||||
ompidir = $(includedir)
|
ompidir = $(includedir)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
dist_pkgdata_DATA =
|
||||||
include base/Makefile.am
|
include base/Makefile.am
|
||||||
|
|
||||||
distclean-local:
|
distclean-local:
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
# University of Stuttgart. All rights reserved.
|
# University of Stuttgart. All rights reserved.
|
||||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
@ -28,3 +29,6 @@ libmca_mpool_la_SOURCES += \
|
|||||||
base/mpool_base_alloc.c \
|
base/mpool_base_alloc.c \
|
||||||
base/mpool_base_mem_cb.c \
|
base/mpool_base_mem_cb.c \
|
||||||
base/mpool_base_tree.c
|
base/mpool_base_tree.c
|
||||||
|
|
||||||
|
dist_pkgdata_DATA += \
|
||||||
|
base/help-mpool-base.txt
|
||||||
|
32
ompi/mca/mpool/base/help-mpool-base.txt
Обычный файл
32
ompi/mca/mpool/base/help-mpool-base.txt
Обычный файл
@ -0,0 +1,32 @@
|
|||||||
|
# -*- text -*-
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||||
|
# $COPYRIGHT$
|
||||||
|
#
|
||||||
|
# Additional copyrights may follow
|
||||||
|
#
|
||||||
|
# $HEADER$
|
||||||
|
#
|
||||||
|
[all mem leaks]
|
||||||
|
The following memory locations were allocated via MPI_ALLOC_MEM but
|
||||||
|
not freed via MPI_FREE_MEM before invoking MPI_FINALIZE:
|
||||||
|
|
||||||
|
Process ID: %s
|
||||||
|
Hostname: %s
|
||||||
|
PID: %d
|
||||||
|
|
||||||
|
%s
|
||||||
|
#
|
||||||
|
[some mem leaks]
|
||||||
|
The following memory locations were allocated via MPI_ALLOC_MEM but
|
||||||
|
not freed via MPI_FREE_MEM before invoking MPI_FINALIZE:
|
||||||
|
|
||||||
|
Process ID: %s
|
||||||
|
Hostname: %s
|
||||||
|
PID: %d
|
||||||
|
|
||||||
|
%s
|
||||||
|
|
||||||
|
%d additional leak%s recorded but %s not displayed here. Set the MCA
|
||||||
|
parameter mpi_show_mpi_alloc_mem_leaks to a larger number to see that
|
||||||
|
many leaks, or set it to a negative number to see all leaks.
|
@ -124,6 +124,7 @@ void *mca_mpool_base_alloc(size_t size, ompi_info_t *info)
|
|||||||
if(!mpool_tree_item)
|
if(!mpool_tree_item)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
mpool_tree_item->num_bytes = size;
|
||||||
mpool_tree_item->count = 0;
|
mpool_tree_item->count = 0;
|
||||||
|
|
||||||
if(&ompi_mpi_info_null == info)
|
if(&ompi_mpi_info_null == info)
|
||||||
|
@ -1,29 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||||
|
* University Research and Technology
|
||||||
|
* Corporation. All rights reserved.
|
||||||
|
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
||||||
|
* of Tennessee Research Foundation. All rights
|
||||||
|
* reserved.
|
||||||
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||||
|
* University of Stuttgart. All rights reserved.
|
||||||
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
|
* All rights reserved.5A
|
||||||
|
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||||
|
* $COPYRIGHT$
|
||||||
|
*
|
||||||
|
* Additional copyrights may follow
|
||||||
|
*
|
||||||
|
* $HEADER$
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
* @file
|
||||||
* University Research and Technology
|
* Description of the Registration Cache framework
|
||||||
* Corporation. All rights reserved.
|
*/
|
||||||
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
|
||||||
* of Tennessee Research Foundation. All rights
|
|
||||||
* reserved.
|
|
||||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
||||||
* University of Stuttgart. All rights reserved.
|
|
||||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
||||||
* All rights reserved.5A
|
|
||||||
* $COPYRIGHT$
|
|
||||||
*
|
|
||||||
* Additional copyrights may follow
|
|
||||||
*
|
|
||||||
* $HEADER$
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* Description of the Registration Cache framework
|
|
||||||
*/
|
|
||||||
#include "ompi_config.h"
|
#include "ompi_config.h"
|
||||||
|
|
||||||
#include "opal/mca/mca.h"
|
#include "opal/mca/mca.h"
|
||||||
|
#include "opal/util/show_help.h"
|
||||||
|
#include "orte/mca/ns/ns_types.h"
|
||||||
|
#include "orte/util/proc_info.h"
|
||||||
|
#include "orte/util/sys_info.h"
|
||||||
|
#include "ompi/runtime/params.h"
|
||||||
#include "mpool_base_tree.h"
|
#include "mpool_base_tree.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int num_leaks = 0;
|
||||||
|
static char *leak_msg = NULL;
|
||||||
|
|
||||||
|
static int condition(void *value);
|
||||||
|
static void action(void *key, void *value);
|
||||||
|
|
||||||
OBJ_CLASS_INSTANCE(mca_mpool_base_tree_item_t, ompi_free_list_item_t, NULL, NULL);
|
OBJ_CLASS_INSTANCE(mca_mpool_base_tree_item_t, ompi_free_list_item_t, NULL, NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -115,3 +129,71 @@ void mca_mpool_base_tree_item_put(mca_mpool_base_tree_item_t* item) {
|
|||||||
OMPI_FREE_LIST_RETURN(&mca_mpool_base_tree_item_free_list,
|
OMPI_FREE_LIST_RETURN(&mca_mpool_base_tree_item_free_list,
|
||||||
&(item->super));
|
&(item->super));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a show_help kind of message for an items still left in the
|
||||||
|
* tree
|
||||||
|
*/
|
||||||
|
void mca_mpool_base_tree_print(void)
|
||||||
|
{
|
||||||
|
/* If they asked to show 0 leaks, then don't show anything. */
|
||||||
|
if (0 == ompi_debug_show_mpi_alloc_mem_leaks) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
num_leaks = 0;
|
||||||
|
ompi_rb_tree_traverse(&mca_mpool_base_tree, condition, action);
|
||||||
|
|
||||||
|
if (num_leaks <= ompi_debug_show_mpi_alloc_mem_leaks ||
|
||||||
|
ompi_debug_show_mpi_alloc_mem_leaks < 0) {
|
||||||
|
opal_show_help("help-mpool-base.txt", "all mem leaks",
|
||||||
|
true, ORTE_NAME_PRINT(orte_process_info.my_name),
|
||||||
|
orte_system_info.nodename,
|
||||||
|
orte_process_info.pid, leak_msg);
|
||||||
|
} else {
|
||||||
|
int i = num_leaks - ompi_debug_show_mpi_alloc_mem_leaks;
|
||||||
|
opal_show_help("help-mpool-base.txt", "some mem leaks",
|
||||||
|
true, ORTE_NAME_PRINT(orte_process_info.my_name),
|
||||||
|
orte_system_info.nodename,
|
||||||
|
orte_process_info.pid, leak_msg, i,
|
||||||
|
(i > 1) ? "s were" : " was",
|
||||||
|
(i > 1) ? "are" : "is");
|
||||||
|
}
|
||||||
|
free(leak_msg);
|
||||||
|
leak_msg = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Condition function for rb traversal */
|
||||||
|
static int condition(void *value)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Action function for rb traversal */
|
||||||
|
static void action(void *key, void *value)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
mca_mpool_base_tree_item_t *item = (mca_mpool_base_tree_item_t *) value;
|
||||||
|
|
||||||
|
if (++num_leaks <= ompi_debug_show_mpi_alloc_mem_leaks ||
|
||||||
|
ompi_debug_show_mpi_alloc_mem_leaks < 0) {
|
||||||
|
|
||||||
|
/* We know that we're supposed to make the first one; check on
|
||||||
|
successive items if we're supposed to catenate more
|
||||||
|
notices. */
|
||||||
|
if (NULL == leak_msg) {
|
||||||
|
asprintf(&leak_msg, " %lu bytes at address 0x%lx",
|
||||||
|
(unsigned long) item->num_bytes,
|
||||||
|
(unsigned long) key);
|
||||||
|
} else {
|
||||||
|
asprintf(&tmp, "%s\n %lu bytes at address 0x%lx",
|
||||||
|
leak_msg, (unsigned long) item->num_bytes,
|
||||||
|
(unsigned long) key);
|
||||||
|
free(leak_msg);
|
||||||
|
leak_msg = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,23 +1,27 @@
|
|||||||
/**
|
/*
|
||||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||||
* University Research and Technology
|
* University Research and Technology
|
||||||
* Corporation. All rights reserved.
|
* Corporation. All rights reserved.
|
||||||
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
||||||
* of Tennessee Research Foundation. All rights
|
* of Tennessee Research Foundation. All rights
|
||||||
* reserved.
|
* reserved.
|
||||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||||
* University of Stuttgart. All rights reserved.
|
* University of Stuttgart. All rights reserved.
|
||||||
* Copyright (c) 2004-2006 The Regents of the University of California.
|
* Copyright (c) 2004-2006 The Regents of the University of California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||||
*
|
* $COPYRIGHT$
|
||||||
* Additional copyrights may follow
|
*
|
||||||
*
|
* Additional copyrights may follow
|
||||||
* $HEADER$
|
*
|
||||||
*/
|
* $HEADER$
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef MCA_MPOOL_BASE_TREE_H
|
#ifndef MCA_MPOOL_BASE_TREE_H
|
||||||
#define MCA_MPOOL_BASE_TREE_H
|
#define MCA_MPOOL_BASE_TREE_H
|
||||||
|
|
||||||
|
#include "ompi_config.h"
|
||||||
|
|
||||||
#define MCA_MPOOL_BASE_TREE_MAX 8
|
#define MCA_MPOOL_BASE_TREE_MAX 8
|
||||||
#include "opal/mca/mca.h"
|
#include "opal/mca/mca.h"
|
||||||
#include "ompi/info/info.h"
|
#include "ompi/info/info.h"
|
||||||
@ -25,6 +29,8 @@
|
|||||||
#include "ompi/class/ompi_rb_tree.h"
|
#include "ompi/class/ompi_rb_tree.h"
|
||||||
#include "ompi/mca/mpool/mpool.h"
|
#include "ompi/mca/mpool/mpool.h"
|
||||||
|
|
||||||
|
BEGIN_C_DECLS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data structures for the tree of allocated memory
|
* Data structures for the tree of allocated memory
|
||||||
* used for MPI_Alloc_mem and MPI_Free_mem
|
* used for MPI_Alloc_mem and MPI_Free_mem
|
||||||
@ -36,10 +42,13 @@
|
|||||||
struct mca_mpool_base_tree_item_t
|
struct mca_mpool_base_tree_item_t
|
||||||
{
|
{
|
||||||
ompi_free_list_item_t super; /**< the parent class */
|
ompi_free_list_item_t super; /**< the parent class */
|
||||||
void* key; /* the address this was alloc'd on */
|
void* key; /**< the address this was alloc'd on */
|
||||||
|
size_t num_bytes; /**< the number of bytes in this alloc, only for
|
||||||
|
debugging reporting with
|
||||||
|
mpi_show_mpi_alloc_mem_leaks */
|
||||||
mca_mpool_base_module_t* mpools[MCA_MPOOL_BASE_TREE_MAX]; /**< the mpools */
|
mca_mpool_base_module_t* mpools[MCA_MPOOL_BASE_TREE_MAX]; /**< the mpools */
|
||||||
mca_mpool_base_registration_t* regs[MCA_MPOOL_BASE_TREE_MAX]; /**< the registrations */
|
mca_mpool_base_registration_t* regs[MCA_MPOOL_BASE_TREE_MAX]; /**< the registrations */
|
||||||
uint8_t count;
|
uint8_t count; /**< length of the mpools/regs array */
|
||||||
};
|
};
|
||||||
typedef struct mca_mpool_base_tree_item_t mca_mpool_base_tree_item_t;
|
typedef struct mca_mpool_base_tree_item_t mca_mpool_base_tree_item_t;
|
||||||
|
|
||||||
@ -76,6 +85,12 @@ mca_mpool_base_tree_item_t* mca_mpool_base_tree_item_get(void);
|
|||||||
*/
|
*/
|
||||||
void mca_mpool_base_tree_item_put(mca_mpool_base_tree_item_t* item);
|
void mca_mpool_base_tree_item_put(mca_mpool_base_tree_item_t* item);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For debugging, print a show_help kind of message if there are items
|
||||||
|
* left in the tree.
|
||||||
|
*/
|
||||||
|
void mca_mpool_base_tree_print(void);
|
||||||
|
|
||||||
|
END_C_DECLS
|
||||||
|
|
||||||
#endif /* MCA_MPOOL_BASE_TREE_H */
|
#endif /* MCA_MPOOL_BASE_TREE_H */
|
||||||
|
@ -423,8 +423,6 @@ void mca_mpool_rdma_finalize(struct mca_mpool_base_module_t *mpool)
|
|||||||
|
|
||||||
if(reg->ref_count) {
|
if(reg->ref_count) {
|
||||||
reg->ref_count = 0; /* otherway dereg will fail on assert */
|
reg->ref_count = 0; /* otherway dereg will fail on assert */
|
||||||
opal_output(0, "%s Warning ! Found not released memory\n",
|
|
||||||
ORTE_NAME_PRINT(orte_process_info.my_name));
|
|
||||||
} else if (mca_mpool_rdma_component.leave_pinned) {
|
} else if (mca_mpool_rdma_component.leave_pinned) {
|
||||||
opal_list_remove_item(&mpool_rdma->mru_list,
|
opal_list_remove_item(&mpool_rdma->mru_list,
|
||||||
(opal_list_item_t*)reg);
|
(opal_list_item_t*)reg);
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* University of Stuttgart. All rights reserved.
|
* University of Stuttgart. All rights reserved.
|
||||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
* Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2006 Los Alamos National Security, LLC. All rights
|
* Copyright (c) 2006 Los Alamos National Security, LLC. All rights
|
||||||
* reserved.
|
* reserved.
|
||||||
* Copyright (c) 2006 University of Houston. All rights reserved.
|
* Copyright (c) 2006 University of Houston. All rights reserved.
|
||||||
@ -78,6 +78,8 @@
|
|||||||
#include "ompi/mca/mpool/base/base.h"
|
#include "ompi/mca/mpool/base/base.h"
|
||||||
#include "ompi/mca/rcache/base/base.h"
|
#include "ompi/mca/rcache/base/base.h"
|
||||||
#include "ompi/mca/pml/base/pml_base_bsend.h"
|
#include "ompi/mca/pml/base/pml_base_bsend.h"
|
||||||
|
#include "ompi/runtime/params.h"
|
||||||
|
#include "ompi/mca/mpool/base/mpool_base_tree.h"
|
||||||
|
|
||||||
#if OPAL_ENABLE_FT == 1
|
#if OPAL_ENABLE_FT == 1
|
||||||
#include "ompi/mca/crcp/crcp.h"
|
#include "ompi/mca/crcp/crcp.h"
|
||||||
@ -200,6 +202,12 @@ int ompi_mpi_finalize(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If requested, print out a list of memory allocated by ALLOC_MEM
|
||||||
|
but not freed by FREE_MEM */
|
||||||
|
if (0 != ompi_debug_show_mpi_alloc_mem_leaks) {
|
||||||
|
mca_mpool_base_tree_print();
|
||||||
|
}
|
||||||
|
|
||||||
/* Now that all MPI objects dealing with communications are gone,
|
/* Now that all MPI objects dealing with communications are gone,
|
||||||
shut down MCA types having to do with communications */
|
shut down MCA types having to do with communications */
|
||||||
if (OMPI_SUCCESS != (ret = mca_pml_base_close())) {
|
if (OMPI_SUCCESS != (ret = mca_pml_base_close())) {
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
*/
|
*/
|
||||||
bool ompi_mpi_param_check = true;
|
bool ompi_mpi_param_check = true;
|
||||||
bool ompi_debug_show_handle_leaks = false;
|
bool ompi_debug_show_handle_leaks = false;
|
||||||
|
int ompi_debug_show_mpi_alloc_mem_leaks = 0;
|
||||||
bool ompi_debug_no_free_handles = false;
|
bool ompi_debug_no_free_handles = false;
|
||||||
bool ompi_mpi_show_mca_params = false;
|
bool ompi_mpi_show_mca_params = false;
|
||||||
char *ompi_mpi_show_mca_params_file = NULL;
|
char *ompi_mpi_show_mca_params_file = NULL;
|
||||||
@ -121,6 +122,14 @@ int ompi_mpi_register_params(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Whether or not to show MPI_ALLOC_MEM leaks */
|
||||||
|
|
||||||
|
mca_base_param_reg_int_name("mpi", "show_mpi_alloc_mem_leaks",
|
||||||
|
"If >0, MPI_FINALIZE will show up to this many instances of memory allocated by MPI_ALLOC_MEM that was not freed by MPI_FREE_MEM",
|
||||||
|
false, false,
|
||||||
|
ompi_debug_show_mpi_alloc_mem_leaks,
|
||||||
|
&ompi_debug_show_mpi_alloc_mem_leaks);
|
||||||
|
|
||||||
/* Whether or not to print all MCA parameters in MPI_INIT */
|
/* Whether or not to print all MCA parameters in MPI_INIT */
|
||||||
mca_base_param_reg_int_name("mpi", "show_mca_params",
|
mca_base_param_reg_int_name("mpi", "show_mca_params",
|
||||||
"Whether to show all MCA parameter value during MPI_INIT or not (good for reproducability of MPI jobs)",
|
"Whether to show all MCA parameter value during MPI_INIT or not (good for reproducability of MPI jobs)",
|
||||||
|
@ -56,6 +56,16 @@ OMPI_DECLSPEC extern bool ompi_mpi_param_check;
|
|||||||
*/
|
*/
|
||||||
OMPI_DECLSPEC extern bool ompi_debug_show_handle_leaks;
|
OMPI_DECLSPEC extern bool ompi_debug_show_handle_leaks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If > 0, show that many MPI_ALLOC_MEM leaks during MPI_FINALIZE. If
|
||||||
|
* enabled, memory that was returned via MPI_ALLOC_MEM but was never
|
||||||
|
* freed via MPI_FREE_MEM will be displayed during MPI_FINALIZE.
|
||||||
|
*
|
||||||
|
* This is good debugging for user applications to find out if they
|
||||||
|
* are inadvertantly orphaning MPI "special" memory.
|
||||||
|
*/
|
||||||
|
OMPI_DECLSPEC extern int ompi_debug_show_mpi_alloc_mem_leaks;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether or not to actually free MPI handles when their
|
* Whether or not to actually free MPI handles when their
|
||||||
* corresponding destructor is invoked. If enabled, Open MPI will not
|
* corresponding destructor is invoked. If enabled, Open MPI will not
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user