Spaces:
Running
Running
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 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 ®
|
| 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
|