|
@@ -238,9 +238,7 @@ static ggml_backend_buffer_type_i ggml_backend_vk_buffer_type_interface = {
|
|
|
/* .is_host = */ NULL,
|
|
/* .is_host = */ NULL,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-#ifdef GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
class vk_memory_logger;
|
|
class vk_memory_logger;
|
|
|
-#endif
|
|
|
|
|
class vk_perf_logger;
|
|
class vk_perf_logger;
|
|
|
static void ggml_vk_destroy_buffer(vk_buffer& buf);
|
|
static void ggml_vk_destroy_buffer(vk_buffer& buf);
|
|
|
static void ggml_vk_synchronize(ggml_backend_vk_context * ctx);
|
|
static void ggml_vk_synchronize(ggml_backend_vk_context * ctx);
|
|
@@ -825,9 +823,7 @@ struct vk_device_struct {
|
|
|
bool allow_sysmem_fallback;
|
|
bool allow_sysmem_fallback;
|
|
|
bool disable_graph_optimize;
|
|
bool disable_graph_optimize;
|
|
|
|
|
|
|
|
-#ifdef GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
std::unique_ptr<vk_memory_logger> memory_logger;
|
|
std::unique_ptr<vk_memory_logger> memory_logger;
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
~vk_device_struct() {
|
|
~vk_device_struct() {
|
|
|
VK_LOG_DEBUG("destroy device " << name);
|
|
VK_LOG_DEBUG("destroy device " << name);
|
|
@@ -1563,8 +1559,9 @@ static void ggml_vk_preallocate_buffers(ggml_backend_vk_context * ctx, vk_contex
|
|
|
static void ggml_vk_load_shaders(vk_device& device);
|
|
static void ggml_vk_load_shaders(vk_device& device);
|
|
|
static void ggml_pipeline_allocate_descriptor_sets(ggml_backend_vk_context * ctx);
|
|
static void ggml_pipeline_allocate_descriptor_sets(ggml_backend_vk_context * ctx);
|
|
|
|
|
|
|
|
-#if defined(GGML_VULKAN_MEMORY_DEBUG) || defined(GGML_VULKAN_DEBUG)
|
|
|
|
|
-#define VK_LOG_MEMORY(msg) std::cerr << "ggml_vulkan memory: " << msg << std::endl
|
|
|
|
|
|
|
+static bool vk_memory_logger_enabled = false;
|
|
|
|
|
+
|
|
|
|
|
+#define VK_LOG_MEMORY(msg) if (vk_memory_logger_enabled) { std::cerr << "ggml_vulkan memory: " << msg << std::endl; }
|
|
|
|
|
|
|
|
static std::string format_size(size_t size) {
|
|
static std::string format_size(size_t size) {
|
|
|
const size_t kib = 1024;
|
|
const size_t kib = 1024;
|
|
@@ -1597,10 +1594,10 @@ private:
|
|
|
std::map<vk::Buffer, size_t> allocations; // Track allocations
|
|
std::map<vk::Buffer, size_t> allocations; // Track allocations
|
|
|
size_t total_device;
|
|
size_t total_device;
|
|
|
size_t total_host;
|
|
size_t total_host;
|
|
|
|
|
+ static std::mutex log_mutex;
|
|
|
};
|
|
};
|
|
|
-#else
|
|
|
|
|
-#define VK_LOG_MEMORY(msg) ((void) 0)
|
|
|
|
|
-#endif // GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
|
|
+
|
|
|
|
|
+std::mutex vk_memory_logger::log_mutex;
|
|
|
|
|
|
|
|
static bool vk_perf_logger_enabled = false;
|
|
static bool vk_perf_logger_enabled = false;
|
|
|
static bool vk_perf_logger_concurrent = false;
|
|
static bool vk_perf_logger_concurrent = false;
|
|
@@ -1907,10 +1904,10 @@ struct ggml_backend_vk_buffer_context {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-#ifdef GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
-static std::mutex log_mutex;
|
|
|
|
|
-
|
|
|
|
|
void vk_memory_logger::log_allocation(vk_buffer_ref buf_ref, size_t size) {
|
|
void vk_memory_logger::log_allocation(vk_buffer_ref buf_ref, size_t size) {
|
|
|
|
|
+ if (!vk_memory_logger_enabled) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
std::lock_guard<std::mutex> guard(log_mutex);
|
|
std::lock_guard<std::mutex> guard(log_mutex);
|
|
|
vk_buffer buf = buf_ref.lock();
|
|
vk_buffer buf = buf_ref.lock();
|
|
|
const bool device = bool(buf->memory_property_flags & vk::MemoryPropertyFlagBits::eDeviceLocal);
|
|
const bool device = bool(buf->memory_property_flags & vk::MemoryPropertyFlagBits::eDeviceLocal);
|
|
@@ -1922,7 +1919,7 @@ void vk_memory_logger::log_allocation(vk_buffer_ref buf_ref, size_t size) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void vk_memory_logger::log_deallocation(vk_buffer_ref buf_ref) {
|
|
void vk_memory_logger::log_deallocation(vk_buffer_ref buf_ref) {
|
|
|
- if (buf_ref.expired() || buf_ref.lock()->size == 0) {
|
|
|
|
|
|
|
+ if (buf_ref.expired() || buf_ref.lock()->size == 0 || !vk_memory_logger_enabled) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1940,7 +1937,6 @@ void vk_memory_logger::log_deallocation(vk_buffer_ref buf_ref) {
|
|
|
VK_LOG_MEMORY("ERROR " << buf->device->name << ": Attempted to deallocate unknown " << type << " memory at " << buf->buffer);
|
|
VK_LOG_MEMORY("ERROR " << buf->device->name << ": Attempted to deallocate unknown " << type << " memory at " << buf->buffer);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-#endif // GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
|
|
|
|
|
struct vk_instance_t {
|
|
struct vk_instance_t {
|
|
|
vk::Instance instance;
|
|
vk::Instance instance;
|
|
@@ -2593,9 +2589,7 @@ static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std
|
|
|
buf->bda_addr = device->device.getBufferAddress(addressInfo);
|
|
buf->bda_addr = device->device.getBufferAddress(addressInfo);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#ifdef GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
device->memory_logger->log_allocation(buf, size);
|
|
device->memory_logger->log_allocation(buf, size);
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
return buf;
|
|
return buf;
|
|
|
}
|
|
}
|
|
@@ -2652,11 +2646,9 @@ static void ggml_vk_destroy_buffer(vk_buffer& buf) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#ifdef GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
if (buf->device != nullptr) {
|
|
if (buf->device != nullptr) {
|
|
|
buf->device->memory_logger->log_deallocation(buf);
|
|
buf->device->memory_logger->log_deallocation(buf);
|
|
|
}
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
buf.reset();
|
|
buf.reset();
|
|
|
}
|
|
}
|
|
@@ -4477,9 +4469,7 @@ static vk_device ggml_vk_get_device(size_t idx) {
|
|
|
vk_device device = std::make_shared<vk_device_struct>();
|
|
vk_device device = std::make_shared<vk_device_struct>();
|
|
|
vk_instance.devices[idx] = device;
|
|
vk_instance.devices[idx] = device;
|
|
|
|
|
|
|
|
-#ifdef GGML_VULKAN_MEMORY_DEBUG
|
|
|
|
|
device->memory_logger = std::unique_ptr<vk_memory_logger>(new vk_memory_logger());
|
|
device->memory_logger = std::unique_ptr<vk_memory_logger>(new vk_memory_logger());
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
size_t dev_num = vk_instance.device_indices[idx];
|
|
size_t dev_num = vk_instance.device_indices[idx];
|
|
|
|
|
|
|
@@ -5476,6 +5466,7 @@ static void ggml_vk_instance_init() {
|
|
|
vk_perf_logger_enabled = getenv("GGML_VK_PERF_LOGGER") != nullptr;
|
|
vk_perf_logger_enabled = getenv("GGML_VK_PERF_LOGGER") != nullptr;
|
|
|
vk_perf_logger_concurrent = getenv("GGML_VK_PERF_LOGGER_CONCURRENT") != nullptr;
|
|
vk_perf_logger_concurrent = getenv("GGML_VK_PERF_LOGGER_CONCURRENT") != nullptr;
|
|
|
vk_enable_sync_logger = getenv("GGML_VK_SYNC_LOGGER") != nullptr;
|
|
vk_enable_sync_logger = getenv("GGML_VK_SYNC_LOGGER") != nullptr;
|
|
|
|
|
+ vk_memory_logger_enabled = getenv("GGML_VK_MEMORY_LOGGER") != nullptr;
|
|
|
const char* GGML_VK_PERF_LOGGER_FREQUENCY = getenv("GGML_VK_PERF_LOGGER_FREQUENCY");
|
|
const char* GGML_VK_PERF_LOGGER_FREQUENCY = getenv("GGML_VK_PERF_LOGGER_FREQUENCY");
|
|
|
|
|
|
|
|
if (GGML_VK_PERF_LOGGER_FREQUENCY != nullptr) {
|
|
if (GGML_VK_PERF_LOGGER_FREQUENCY != nullptr) {
|