Просмотр исходного кода

vulkan: throw the oom error instead of no memory type found (#15905)

Ruben Ortlam 4 месяцев назад
Родитель
Сommit
ae355f6f71
1 измененных файлов с 8 добавлено и 1 удалено
  1. 8 1
      ggml/src/ggml-vulkan/ggml-vulkan.cpp

+ 8 - 1
ggml/src/ggml-vulkan/ggml-vulkan.cpp

@@ -1937,7 +1937,9 @@ static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std
 
 
     vk::PhysicalDeviceMemoryProperties mem_props = device->physical_device.getMemoryProperties();
     vk::PhysicalDeviceMemoryProperties mem_props = device->physical_device.getMemoryProperties();
 
 
-    for (auto &req_flags : req_flags_list) {
+    for (auto it = req_flags_list.begin(); it != req_flags_list.end(); it++) {
+        const auto & req_flags = *it;
+
         uint32_t memory_type_index = find_properties(&mem_props, &mem_req, req_flags);
         uint32_t memory_type_index = find_properties(&mem_props, &mem_req, req_flags);
 
 
         if (memory_type_index == UINT32_MAX) {
         if (memory_type_index == UINT32_MAX) {
@@ -1950,6 +1952,11 @@ static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std
             break;
             break;
         } catch (const vk::SystemError& e) {
         } catch (const vk::SystemError& e) {
             // loop and retry
             // loop and retry
+            // during last attempt throw the exception
+            if (it + 1 == req_flags_list.end()) {
+                device->device.destroyBuffer(buf->buffer);
+                throw e;
+            }
         }
         }
     }
     }