Микроядро SME2 sgemm: 1024 умножения-сложения за проход
nonpareil_coder только что Микроядро SME2 sgemm: 1024 умножения-сложения за проход Сложный 8 мин 0 C * C++ * Assembler * Туториал Часть 4 цикла о программировании Apple Scalable Matrix Extension (SME2). Часть 3...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: nonpareil_coder только что Микроядро SME2 sgemm: 1024 умножения-сложения за проход Сложный 8 мин 0 C * C++ * Assembler * Туториал Часть 4 цикла о программировании Apple Scalable Matrix Extension (SME2). Часть 3 доказывала, что BLIS сводит задачу «перенести GEMM на новую машину» к написанию одного микроядра и заполнению пяти чисел размеров блоков. Эта часть заполняет самый важный пропуск: микроядро одинарной точности, разобранное строка за строкой.
В этой части мы возьмём первый из пропусков BLIS — микроядро sgemm; сначала зафиксируем форму аккумулятора 32×32 в четырёх тайлах ZA, затем разберём горячий цикл по K, потом эпилог с alpha, beta и ловушкой NaN, а в конце посмотрим, какие числа производительности даёт именно это ядро. Следующая часть оставит структуру почти той же, но заменит геометрию тайла и условия существования ядра. Всё предыдущее было разбегом; здесь наконец взлетаем.
Технические детали
Микроядро одинарной точности — тот код, который во внутреннем цикле действительно касается матричного движка, и он достаточно мал — около 120 строк содержательной работы, — чтобы прочитать его целиком и понять каждое решение. К концу этой части вы будете точно знать, что именно исполняется от 1357 до 1450 миллиардов раз в секунду на производительном ядре M5, и почему оно устроено именно так. Вспомним контракт из части 3.
BLIS уже упаковал высокую узкую панель A и широкую узкую панель B в непрерывные, дополненные нулями буферы. Микроядру он передаёт эти две панели, длину K, альфу, бету и указатель на один тайл MR×NR выходной матрицы C. Наша работа: вычислить C := alpha·(A·B) + beta·C для этого одного тайла и вернуть управление.
BLIS вызывает нас по разу на тайл и делает буквально всё остальное. Для этого ядра MR = NR = 2VL; при 512-битной потоковой длине вектора у Apple VL составляет 16 чисел одинарной точности, так что тайл имеет размер 32×32. Запомните это число: в нём вся причина быстроты ядра.
Отраслевые последствия
Где живёт тайл 32×32: все четыре тайла ZA сразуЧасть 1 представила ZA как квадратный байтовый массив, разделённый на нумерованные тайлы. При SVL 512 FP32-часть ZA — четыре тайла 16×16, от za0 до za3. Один FMOPA обновляет один из них — блок 16×16 (VL×VL).
Нам нужен аккумулятор 32×32 — четыре таких блока, — поэтому мы используем все четыре тайла ZA как один макротайл 2×2: n: 0.. 2VL-1 za1 za3 Это выигрыш от подсчёта загрузок из части 2. Один FMOPA загружает 32 числа (VL-столбец A, VL-строку B) и выполняет 256 умножений-сложений — 8 на загруженное число.
Но чтобы заполнить макротайл 2×2, мы загружаем два VL-столбца A и две VL-строки B — 64 числа — и выполняем четыре FMOPA, то есть 1024 умножения-сложения. Это 16 умножений-накоплений на загруженное число — вдвое больше арифметической интенсивности однотайлового ядра из учебного руководства.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




