diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 22f2dd33bf..81d4e2eafc 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -2529,6 +2529,9 @@ static vk_buffer ggml_vk_create_buffer_device(vk_device& device, size_t size) { vk::MemoryPropertyFlagBits::eDeviceLocal}); } else if (device->uma) { // Fall back to host memory type + // 1. Prefer Device Local AND Host Visible (Best for UMA) + // 2. Fallback to Device Local + // 3. Fallback to Host Visible buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, vk::MemoryPropertyFlagBits::eDeviceLocal, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent}); @@ -2542,6 +2545,9 @@ static vk_buffer ggml_vk_create_buffer_device(vk_device& device, size_t size) { } else { // use rebar if available, otherwise fallback to device only visible memory if (device->allow_sysmem_fallback) { + // 1. Prefer Device Local AND Host Visible (ReBAR) + // 2. Fallback to Device Local + // 3. Fallback to Host Visible buf = ggml_vk_create_buffer(device, size, {vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, vk::MemoryPropertyFlagBits::eDeviceLocal, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent}); @@ -2936,6 +2942,10 @@ static void ggml_vk_load_shaders(vk_device& device) { m_warptile_mmq = m_warptile_mmq_int = { 64, 64, 64, 16, 16, 32, 2, 2, 2, 1, 16 }; m_warptile = { 64, 64, 64, 16, 16, 32, 2, 2, 2, 1, 16 }; m_warptile_id = m_warptile_mmqid = { 64, 64, 64, 16, 16, 32, 2, 2, 2, 1, 16 }; + + l_warptile_mmq = l_warptile_mmq_int = m_warptile_mmq; + l_warptile = m_warptile; + l_warptile_id = l_warptile_mmqid = m_warptile_id; } else if ((device->architecture == AMD_GCN) && (device->driver_id != vk::DriverId::eAmdProprietary)) { m_warptile_mmq = m_warptile_mmq_int = { 256, 64, 64, 32, 16, 16, 2, 2, 2, 1, 16 }; m_warptile_mmqid = m_warptile_mmqid_int = { 256, 64, 64, 32, 16, 16, 2, 2, 2, 1, 16 }; @@ -4494,11 +4504,8 @@ static vk_device ggml_vk_get_device(size_t idx) { device->driver_id = driver_props.driverID; if (device->vendor_id == VK_VENDOR_ID_ARM) { - // Forcing FP32 path as it currently provides better performance on Mali G720. - // This is a simplified approach while deeper ARM-specific vec2 SIMD optimizations are investigated. - fp16_storage = false; - fp16_compute = false; - bfloat16_support = false; + // Previously forced FP32 here due to poor FP16 performance on some ARM GPUs. + // With adjusted l_warptile (below), FP16 is now performant and preferred. } // Implementing the async backend interfaces seems broken on older Intel HW,