alterna ai
ALTERNA AI / ГЛАВА 10 · 04

10.4 Как вычисляется одна клетка произведения

На предыдущей странице: много похожих действий одновременно.

Выходная клетка — сумма произведений строки и столбца. Повторение этого правила заполняет всю таблицу.

Числа имеют конечную точность; их нужно хранить и переносить. Матричные блоки дают много независимой работы, но память и организация групп также влияют на результат.

Те же суммы, другой порядок загрузки

Для 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 Академическая база →