Danny Milosavljevic jeffbolznv commited on
Commit
762f497
·
1 Parent(s): f9fd130

vulkan: Make Vulkan optional at runtime (ggml/11493). (llama/11494)

Browse files
ggml/include/ggml-vulkan.h CHANGED
@@ -10,8 +10,6 @@ extern "C" {
10
  #define GGML_VK_NAME "Vulkan"
11
  #define GGML_VK_MAX_DEVICES 16
12
 
13
- GGML_BACKEND_API void ggml_vk_instance_init(void);
14
-
15
  // backend API
16
  GGML_BACKEND_API ggml_backend_t ggml_backend_vk_init(size_t dev_num);
17
 
 
10
  #define GGML_VK_NAME "Vulkan"
11
  #define GGML_VK_MAX_DEVICES 16
12
 
 
 
13
  // backend API
14
  GGML_BACKEND_API ggml_backend_t ggml_backend_vk_init(size_t dev_num);
15
 
ggml/src/ggml-vulkan/ggml-vulkan.cpp CHANGED
@@ -2793,14 +2793,12 @@ static void ggml_vk_print_gpu_info(size_t idx) {
2793
  static bool ggml_vk_instance_validation_ext_available(const std::vector<vk::ExtensionProperties>& instance_extensions);
2794
  static bool ggml_vk_instance_portability_enumeration_ext_available(const std::vector<vk::ExtensionProperties>& instance_extensions);
2795
 
2796
- void ggml_vk_instance_init() {
2797
  if (vk_instance_initialized) {
2798
  return;
2799
  }
2800
  VK_LOG_DEBUG("ggml_vk_instance_init()");
2801
 
2802
- vk_instance_initialized = true;
2803
-
2804
  uint32_t api_version = vk::enumerateInstanceVersion();
2805
 
2806
  if (api_version < VK_API_VERSION_1_2) {
@@ -2851,6 +2849,7 @@ void ggml_vk_instance_init() {
2851
  GGML_LOG_DEBUG("ggml_vulkan: Validation layers enabled\n");
2852
  }
2853
  vk_instance.instance = vk::createInstance(instance_create_info);
 
2854
 
2855
  size_t num_available_devices = vk_instance.instance.enumeratePhysicalDevices().size();
2856
 
@@ -2875,7 +2874,7 @@ void ggml_vk_instance_init() {
2875
  // Make sure at least one device exists
2876
  if (devices.empty()) {
2877
  std::cerr << "ggml_vulkan: Error: No devices found." << std::endl;
2878
- GGML_ABORT("fatal error");
2879
  }
2880
 
2881
  // Default to using all dedicated GPUs
@@ -8350,8 +8349,13 @@ ggml_backend_reg_t ggml_backend_vk_reg() {
8350
  /* .iface = */ ggml_backend_vk_reg_i,
8351
  /* .context = */ nullptr,
8352
  };
8353
-
8354
- return &reg;
 
 
 
 
 
8355
  }
8356
 
8357
  // Extension availability
 
2793
  static bool ggml_vk_instance_validation_ext_available(const std::vector<vk::ExtensionProperties>& instance_extensions);
2794
  static bool ggml_vk_instance_portability_enumeration_ext_available(const std::vector<vk::ExtensionProperties>& instance_extensions);
2795
 
2796
+ static void ggml_vk_instance_init() {
2797
  if (vk_instance_initialized) {
2798
  return;
2799
  }
2800
  VK_LOG_DEBUG("ggml_vk_instance_init()");
2801
 
 
 
2802
  uint32_t api_version = vk::enumerateInstanceVersion();
2803
 
2804
  if (api_version < VK_API_VERSION_1_2) {
 
2849
  GGML_LOG_DEBUG("ggml_vulkan: Validation layers enabled\n");
2850
  }
2851
  vk_instance.instance = vk::createInstance(instance_create_info);
2852
+ vk_instance_initialized = true;
2853
 
2854
  size_t num_available_devices = vk_instance.instance.enumeratePhysicalDevices().size();
2855
 
 
2874
  // Make sure at least one device exists
2875
  if (devices.empty()) {
2876
  std::cerr << "ggml_vulkan: Error: No devices found." << std::endl;
2877
+ return;
2878
  }
2879
 
2880
  // Default to using all dedicated GPUs
 
8349
  /* .iface = */ ggml_backend_vk_reg_i,
8350
  /* .context = */ nullptr,
8351
  };
8352
+ try {
8353
+ ggml_vk_instance_init();
8354
+ return &reg;
8355
+ } catch (const vk::SystemError& e) {
8356
+ VK_LOG_DEBUG("ggml_backend_vk_reg() -> Error: System error: " << e.what());
8357
+ return nullptr;
8358
+ }
8359
  }
8360
 
8361
  // Extension availability