@@ -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