llama.cpp b11184: Metal-кернелы FWHT для блоков шириной от 1024 до 8192¶
4.0/10
В релизе llama.cpp b11184 представлена реализация Metal-кернелов быстрого преобразования Уолша — Адамара (FWHT) для блоков шириной от 1024 до 8192 в форматах F32 и F16. Для широких блоков добавлен кернел kernel_fwht_tg, выделяющий до 32 КБ памяти threadgroup при N=8192 и распределяющий вычисления по 256 потокам, тогда как диапазоны от 64 до 512 по-прежнему обслуживаются simdgroup-кернелом. Изменение решает проблему нехватки регистров на lane, добавляет проверку лимитов памяти устройства во избежание сбоев nil pipeline и успешно прошло верификацию test-backend-ops на M5 Pro (MUL_MAT_HADAMARD 26/26, MUL_MAT 1265/1265).
Метод оптимизации¶
Для обхода аппаратных ограничений по регистрам на lane при ширине более 512 новый кернел kernel_fwht_tg обрабатывает одну строку на threadgroup из 256 потоков, выделяя N/256 значений на поток. Операции типа «бабочка» (butterfly) с размахом меньше ширины simdgroup выполняются через быстрый shuffle, операции в пределах threadgroup используют общую память threadgroup (массив float[N]), а оставшиеся значения сохраняются в регистрах. Дополнительно реализована проверка лимита памяти устройства, возвращающая статус неподдерживаемой ширины вместо аварийного завершения пайплайна.
Эффект для производительности¶
Оптимизация обеспечивает стабильное выполнение матричных преобразований Адамара размером до 8192 на GPU Apple Silicon, расходуя ровно 32 КБ памяти threadgroup для максимальной ширины блока.