Skip to content

Commit be2d914

Browse files
committed
vulkan: Add env var GGML_VK_ALLOW_SYSMEM_FALLBACK
1 parent 992383c commit be2d914

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

ggml/src/ggml-vulkan/ggml-vulkan.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ struct vk_device_struct {
566566

567567
bool disable_fusion;
568568
bool disable_host_visible_vidmem;
569+
bool allow_sysmem_fallback;
569570

570571
#ifdef GGML_VULKAN_MEMORY_DEBUG
571572
std::unique_ptr<vk_memory_logger> memory_logger;
@@ -1896,13 +1897,22 @@ static vk_buffer ggml_vk_create_buffer_device(vk_device& device, size_t size) {
18961897
buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal,
18971898
vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent});
18981899
} else if (device->disable_host_visible_vidmem) {
1899-
buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal,
1900-
vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent});
1900+
if (device->allow_sysmem_fallback) {
1901+
buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal,
1902+
vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent});
1903+
} else {
1904+
buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal});
1905+
}
19011906
} else {
19021907
// use rebar if available, otherwise fallback to device only visible memory
1903-
buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent,
1904-
vk::MemoryPropertyFlagBits::eDeviceLocal,
1905-
vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent});
1908+
if (device->allow_sysmem_fallback) {
1909+
buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent,
1910+
vk::MemoryPropertyFlagBits::eDeviceLocal,
1911+
vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent});
1912+
} else {
1913+
buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent,
1914+
vk::MemoryPropertyFlagBits::eDeviceLocal});
1915+
}
19061916
}
19071917
} catch (const vk::SystemError& e) {
19081918
std::cerr << "ggml_vulkan: Device memory allocation of size " << size << " failed." << std::endl;
@@ -3427,6 +3437,9 @@ static vk_device ggml_vk_get_device(size_t idx) {
34273437
const char* GGML_VK_DISABLE_HOST_VISIBLE_VIDMEM = getenv("GGML_VK_DISABLE_HOST_VISIBLE_VIDMEM");
34283438
device->disable_host_visible_vidmem = GGML_VK_DISABLE_HOST_VISIBLE_VIDMEM != nullptr;
34293439

3440+
const char* GGML_VK_ALLOW_SYSMEM_FALLBACK = getenv("GGML_VK_ALLOW_SYSMEM_FALLBACK");
3441+
device->allow_sysmem_fallback = GGML_VK_ALLOW_SYSMEM_FALLBACK != nullptr;
3442+
34303443
bool fp16_storage = false;
34313444
bool fp16_compute = false;
34323445
bool maintenance4_support = false;

0 commit comments

Comments
 (0)