177 lines
11 KiB
C
177 lines
11 KiB
C
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
#ifndef hypre_MEMORY_TRACKER_HEADER
|
|
#define hypre_MEMORY_TRACKER_HEADER
|
|
|
|
#if defined(HYPRE_USING_MEMORY_TRACKER)
|
|
|
|
extern size_t hypre_total_bytes[hypre_MEMORY_UNIFIED + 1];
|
|
extern size_t hypre_peak_bytes[hypre_MEMORY_UNIFIED + 1];
|
|
extern size_t hypre_current_bytes[hypre_MEMORY_UNIFIED + 1];
|
|
extern HYPRE_Int hypre_memory_tracker_print;
|
|
extern char hypre_memory_tracker_filename[HYPRE_MAX_FILE_NAME_LEN];
|
|
|
|
typedef enum _hypre_MemoryTrackerEvent
|
|
{
|
|
HYPRE_MEMORY_EVENT_ALLOC = 0,
|
|
HYPRE_MEMORY_EVENT_FREE,
|
|
HYPRE_MEMORY_EVENT_COPY,
|
|
HYPRE_MEMORY_NUM_EVENTS,
|
|
} hypre_MemoryTrackerEvent;
|
|
|
|
typedef enum _hypre_MemcpyType
|
|
{
|
|
hypre_MEMCPY_H2H = 0,
|
|
hypre_MEMCPY_D2H,
|
|
hypre_MEMCPY_H2D,
|
|
hypre_MEMCPY_D2D,
|
|
hypre_MEMCPY_NUM_TYPES,
|
|
} hypre_MemcpyType;
|
|
|
|
typedef struct
|
|
{
|
|
size_t index;
|
|
size_t time_step;
|
|
char action[16];
|
|
void *ptr;
|
|
void *ptr2;
|
|
size_t nbytes;
|
|
hypre_MemoryLocation memory_location;
|
|
hypre_MemoryLocation memory_location2;
|
|
char filename[HYPRE_MAX_FILE_NAME_LEN];
|
|
char function[256];
|
|
HYPRE_Int line;
|
|
size_t pair;
|
|
} hypre_MemoryTrackerEntry;
|
|
|
|
typedef struct
|
|
{
|
|
size_t head;
|
|
size_t actual_size;
|
|
size_t alloced_size;
|
|
hypre_MemoryTrackerEntry *data;
|
|
/* Free Queue is sorted based on (ptr, time_step) ascendingly */
|
|
hypre_MemoryTrackerEntry *sorted_data;
|
|
/* compressed sorted_data with the same ptr */
|
|
size_t sorted_data_compressed_len;
|
|
size_t *sorted_data_compressed_offset;
|
|
hypre_MemoryTrackerEntry **sorted_data_compressed;
|
|
} hypre_MemoryTrackerQueue;
|
|
|
|
typedef struct
|
|
{
|
|
size_t curr_time_step;
|
|
hypre_MemoryTrackerQueue queue[HYPRE_MEMORY_NUM_EVENTS];
|
|
} hypre_MemoryTracker;
|
|
|
|
extern hypre_MemoryTracker *_hypre_memory_tracker;
|
|
|
|
#define hypre_TAlloc(type, count, location) \
|
|
( \
|
|
{ \
|
|
void *ptr = hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \
|
|
\
|
|
hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \
|
|
hypre_MemoryTrackerInsert1("malloc", ptr, sizeof(type)*(count), alocation, \
|
|
__FILE__, __func__, __LINE__); \
|
|
(type *) ptr; \
|
|
} \
|
|
)
|
|
|
|
#define hypre_CTAlloc(type, count, location) \
|
|
( \
|
|
{ \
|
|
void *ptr = hypre_CAlloc((size_t)(count), (size_t)sizeof(type), location); \
|
|
\
|
|
hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \
|
|
hypre_MemoryTrackerInsert1("calloc", ptr, sizeof(type)*(count), alocation, \
|
|
__FILE__, __func__, __LINE__); \
|
|
(type *) ptr; \
|
|
} \
|
|
)
|
|
|
|
#define hypre_TReAlloc(ptr, type, count, location) \
|
|
( \
|
|
{ \
|
|
void *new_ptr = hypre_ReAlloc((char *)ptr, (size_t)(sizeof(type) * (count)), location); \
|
|
\
|
|
hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \
|
|
hypre_MemoryTrackerInsert1("rfree", ptr, (size_t) -1, alocation, \
|
|
__FILE__, __func__, __LINE__); \
|
|
hypre_MemoryTrackerInsert1("rmalloc", new_ptr, sizeof(type)*(count), alocation, \
|
|
__FILE__, __func__, __LINE__); \
|
|
(type *) new_ptr; \
|
|
} \
|
|
)
|
|
|
|
#define hypre_TReAlloc_v2(ptr, old_type, old_count, new_type, new_count, location) \
|
|
( \
|
|
{ \
|
|
void *new_ptr = hypre_ReAlloc_v2((char *)ptr, (size_t)(sizeof(old_type)*(old_count)), \
|
|
(size_t)(sizeof(new_type)*(new_count)), location); \
|
|
\
|
|
hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \
|
|
hypre_MemoryTrackerInsert1("rfree", ptr, sizeof(old_type)*(old_count), alocation, \
|
|
__FILE__, __func__, __LINE__); \
|
|
hypre_MemoryTrackerInsert1("rmalloc", new_ptr, sizeof(new_type)*(new_count), alocation, \
|
|
__FILE__, __func__, __LINE__); \
|
|
(new_type *) new_ptr; \
|
|
} \
|
|
)
|
|
|
|
#define hypre_TMemcpy(dst, src, type, count, locdst, locsrc) \
|
|
( \
|
|
{ \
|
|
hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc); \
|
|
\
|
|
hypre_MemoryLocation alocation_dst = hypre_GetActualMemLocation(locdst); \
|
|
hypre_MemoryLocation alocation_src = hypre_GetActualMemLocation(locsrc); \
|
|
hypre_MemoryTrackerInsert2("memcpy", (void *) (dst), (void *) (src), sizeof(type)*(count), \
|
|
alocation_dst, alocation_src, \
|
|
__FILE__, __func__, __LINE__); \
|
|
} \
|
|
)
|
|
|
|
#define hypre_TFree(ptr, location) \
|
|
( \
|
|
{ \
|
|
hypre_Free((void *)ptr, location); \
|
|
\
|
|
hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \
|
|
hypre_MemoryTrackerInsert1("free", ptr, (size_t) -1, alocation, \
|
|
__FILE__, __func__, __LINE__); \
|
|
ptr = NULL; \
|
|
} \
|
|
)
|
|
|
|
#define _hypre_TAlloc(type, count, location) \
|
|
( \
|
|
{ \
|
|
void *ptr = _hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \
|
|
\
|
|
hypre_MemoryTrackerInsert1("malloc", ptr, sizeof(type)*(count), location, \
|
|
__FILE__, __func__, __LINE__); \
|
|
(type *) ptr; \
|
|
} \
|
|
)
|
|
|
|
#define _hypre_TFree(ptr, location) \
|
|
( \
|
|
{ \
|
|
_hypre_Free((void *)ptr, location); \
|
|
\
|
|
hypre_MemoryTrackerInsert1("free", ptr, (size_t) -1, location, \
|
|
__FILE__, __func__, __LINE__); \
|
|
ptr = NULL; \
|
|
} \
|
|
)
|
|
|
|
#endif /* #if defined(HYPRE_USING_MEMORY_TRACKER) */
|
|
#endif /* #ifndef hypre_MEMORY_TRACKER_HEADER */
|
|
|