#pragma once
#include <c10/core/Allocator.h>
#include <c10/util/Registry.h>
#include <c10/util/SmallVector.h>
#include "torch_npu/csrc/core/npu/NPUMacros.h"
#include "torch_npu/csrc/core/npu/register/OptionsManager.h"
#include "torch_npu/csrc/core/npu/NPUStream.h"
#include <mutex>
namespace c10_npu {
namespace NPUCachingAllocator {
class FreeMemoryCallback {
public:
virtual ~FreeMemoryCallback(){};
virtual bool Execute() = 0;
};
C10_DECLARE_REGISTRY(FreeNPUMemoryCallbacksRegistry, FreeMemoryCallback);
#define REGISTER_FREE_MEMORY_CALLBACK(name, ...) \
C10_REGISTER_CLASS(FreeNPUMemoryCallbacksRegistry, name, __VA_ARGS__);
struct Stat {
int64_t current = 0;
int64_t peak = 0;
int64_t allocated = 0;
int64_t freed = 0;
};
enum struct StatType : uint64_t {
AGGREGATE = 0,
SMALL_POOL = 1,
LARGE_POOL = 2,
NUM_TYPES = 3
};
typedef std::array<Stat, static_cast<size_t>(StatType::NUM_TYPES)> StatArray;
struct DeviceStats {
StatArray allocation;
StatArray segment;
StatArray active;
StatArray inactive_split;
StatArray allocated_bytes;
StatArray reserved_bytes;
StatArray active_bytes;
StatArray inactive_split_bytes;
StatArray requested_bytes;
int64_t num_alloc_retries = 0;
int64_t num_ooms = 0;
Stat oversize_allocations;
Stat oversize_segments;
int64_t max_split_size = 0;
};
struct BlockInfo {
int64_t size = 0;
int64_t requested_size = 0;
int32_t gc_counter = 0;
bool allocated = false;
bool active = false;
};
struct SegmentInfo {
int64_t device = 0;
uintptr_t address = 0;
int64_t total_size = 0;
int64_t requested_size = 0;
int64_t allocated_size = 0;
int64_t active_size = 0;
bool is_large = false;
bool is_expandable = false;
std::vector<BlockInfo> blocks;
};
void* raw_alloc(size_t nbytes);
void* raw_alloc_with_stream(size_t nbytes, aclrtStream stream);
void raw_delete(void* ptr);
c10::Allocator* get();
void init();
void setMemoryFraction(double fraction, int device);
C10_NPU_API void emptyCache(bool check_error = true);
C10_NPU_API void setShutdownStats();
void cacheInfo(int dev_id, size_t* cachedAndFree, size_t* largestBlock);
void* getBaseAllocation(void* ptr, size_t* size);
void recordStream(const c10::DataPtr& ptr, c10_npu::NPUStream stream);
void eraseStream(const c10::DataPtr& ptr, c10_npu::NPUStream stream);
DeviceStats getDeviceStats(int device);
void resetAccumulatedStats(int device);
void resetPeakStats(int device);
std::vector<SegmentInfo> snapshot();
std::mutex* getFreeMutex();
void FreeDeviceCachedMemory(int device);
}
}