hypre/src/utilities/memory_tracker.h
Rui Peng Li 2391e4703f
Fix memory tracker with omp (#844)
This PR fixes hypre memory tracker with OMP threading.
2023-03-22 16:01:24 -07:00

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 */