Кэширующая блокировка GEMM возможна, поэтому вы получаете в основном попадания в кэш L1 (см. Также Что должен знать каждый программист о памяти? ).
Встраивание в большой общий кэш L3 на типичных процессорах x86 недостаточно для эффективной работы. Кэши L2 для каждого ядра обычно имеют размер 256 КБ, и даже это медленнее, чем кэш-память L1d 32 КБ.
Память Задержка очень медленная по сравнению с тактовой частотой ядра ЦП, но память / кэш пропускная способность не страшна в наши дни с быстрыми попаданиями в кэш DDR4 или L3. (Но, как я уже сказал, для матрицы с хорошей блокировкой кеша / циклическим циклом вы можете повторно использовать данные, пока они еще горячие в L1d, если вы только транспонируете части входной матрицы на лету. Сокращение требований к полосе пропускания вне ядра также важно для эффективной работы. matmul, а не просто транспонировать один, поэтому его столбцы последовательны в памяти.)
Кроме того, последовательный доступ к памяти важен для эффективной SIMD (загрузка вектора из нескольких смежных элементов, позволяющая умножать / добавлять / любые 4 или 8 упакованных float
элементов с одной инструкцией ЦП). Снижение столбцов в основной матрице строки повредит пропускной способности, даже если матрица будет достаточно маленькой, чтобы поместиться в кэш L1d (32 кБ).