Часть 3 цикла о программировании Apple Scalable Matrix Extension (SME2). Часть 2 обнаружила, что у лестницы обучения SME отсутствует середина: руководство на один тайл внизу, нечитаемые промышленные ядра наверху — и ничего между ними, там, где строится настоящий GEMM. Эта часть — о фреймворке, который уже занимает эту ступеньку, и о том, почему перенос на новейший матричный движок оказался упражнением «заполните пропуски».
Оглавление-договор. В этой части мы начнём с тупика, в который приводит голый цикл FMOPA; затем покажем, какую часть GEMM BLIS уже построил за нас; после этого разберём пять циклов BLIS и место микроядра внутри них. Финал главы должен сделать дальнейший план конкретным: что именно нужно добавить для Apple SME, а что уже относится к готовой «мебели» фреймворка.
Расскажу о лучшем часе, потраченном на весь этот проект, — часе, который я провёл, не написав ни строчки кода.
У меня работал цикл с FMOPA — четырёхстрочное ядро из части 1, накапливающее внешние произведения в ZA. Оно перемножало две матрицы. В качестве BLAS оно было при этом совершенно бесполезно: ни альфы и беты, ни возможности прибавить результат к существующей матрице C, ни обработки транспонирования, один тип данных — и производительность, падавшая с обрыва, едва матрицы вырастали из кэша L1. Всё, чего, по словам части 2, не делает учебное руководство, моё ядро тоже не делало. Я стоял ровно там, где должна быть недостающая средняя ступенька, держа в руках атом — и никакой лестницы.