Alterna · учебный материал
10.4 Как вычисляется одна клетка произведения
Выходная клетка — сумма произведений строки и столбца. Повторение этого правила заполняет всю таблицу.
Что в этом материале
- Те же суммы, другой порядок загрузки
Содержание и основные понятия
На предыдущей странице: много похожих действий одновременно.
Выходная клетка — сумма произведений строки и столбца. Повторение этого правила заполняет всю таблицу.
Числа имеют конечную точность; их нужно хранить и переносить. Матричные блоки дают много независимой работы, но память и организация групп также влияют на результат.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Те же суммы, другой порядок загрузки
Для A[m,k],B[k,n] каждый изmnвыходов содержитkпроизведений. Обычно стоимость оценивают как2mknFLOPs: умножение и сложение считаются двумя операциями, даже если одна инструкция FMA выполняет их вместе. Точное число сложений для суммыkчленов —k−1, поэтому это соглашение счёта, а не число машинных инструкций. H04.
В маленьком примере A=[[1,2],[3,4]],B=[[5,6],[7,8]] результат[[19,22],[43,50]]. Первый элемент:1×5+2×7=19. Курсор раскрывает каждый multiply-accumulate, а tile1/2 меняет порядок посещения выходов и повторное использование входов.
FMA округляет ab+c один раз, а separate multiply/add — после каждого шага. При a=1+2^-23,c=−(1+2^-22) точноеa²+c=2^-46. ОтдельноеFP32округление произведения теряет этот остаток и даёт0. H01 приводит соответствующий двоичный пример; его исторические заявления об отсутствии CPU FMA не относятся к современным процессорам.
Исследовать.
Сравните итогCприtile1и2, затем число modeled input reads. В идеальной маленькой моделиtile1требует16чтений входных скаляров, tile2—8, writes4вобоих случаях. Это не профилирование реального кеша. Большой tile повышает reuse, но может увеличить требования к локальному хранению и уменьшить число параллельных блоков.
A=[[1,2],[3,4]]; B=[[5,6],[7,8]]
C=[[sum(A[i][k]*B[k][j] for k in range(2)) for j in range(2)] for i in range(2)]
assert C==[[19,22],[43,50]]
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
Умножение и сложение — две арифметические операции, хотя инструкция может быть одна.
Почему важно повторно использовать данные. Как этот вопрос продолжает полученный результат?
Python-примеры главы 10
Академическая база →