Оптимизация Vulkan-бэкенда в llama.cpp b11266 для Intel GPU¶
4.0/10
В релизе llama.cpp b11266 представлена оптимизация Vulkan-бэкенда для операций матрично-векторного умножения (MUL_MAT) формата F32 на оборудовании Intel. Изменение задействует загрузку матрицы A блоками по два элемента при условии 2-кратного выравнивания данных, устраняя неэффективность контроллеров памяти Intel при поодиночном чтении F32. Согласно микротестам test-backend-ops perf на GPU Intel B60 (размерности m=4096, k=14336), ускорение для малых партий n=1–8 достигает 1,69x: в частности, время выполнения при n=4 сократилось с 919,50 мкс (510,89 GFLOPS) до 543,69 мкс (864,03 GFLOPS).
Механизм оптимизации¶
В шейдере mul_mat_vec.comp для типа F32 была задействована схема спаренной загрузки по два элемента, сопровождающаяся обязательной проверкой выравнивания смещения a_offset. Вариант пакетной выборки по 4 элемента был отклонен, поскольку на микроархитектуре Intel BMG он вызывал замедление специфических форм тензоров в форматах [B]F16 и не обеспечивал заметного прироста в F32.
Прирост эффективности¶
Оптимизация уменьшает задержку вычислений ядра F32 MUL_MAT на Intel B60 при малых размерах пакета (с 767,17 мкс до 529,81 мкс при n=1 и с 892,12 мкс до 575,17 мкс при n=5 с переходом рубежа в 1,02 TFLOPS), сохраняя прежнюю пропускную способность на больших батчах (около 8,04 TFLOPS при n=512).