Alterna · учебный материал
10.5 Почему важно повторно использовать данные
Значение нужно не только вычислить, но и прочитать из памяти. Повторное использование маленьких блоков сокращает лишние чтения.
Что в этом материале
- Арифметике нужны данные
Содержание и основные понятия
На предыдущей странице: как вычисляется одна клетка произведения.
Значение нужно не только вычислить, но и прочитать из памяти. Повторное использование маленьких блоков сокращает лишние чтения.
Числа имеют конечную точность; их нужно хранить и переносить. Матричные блоки дают много независимой работы, но память и организация групп также влияют на результат.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Арифметике нужны данные
Weights могут находиться в device memory, затем попадать в кеш или shared memory и регистры. Конкретные уровни зависят от устройства. Capacity, bandwidth и latency — разные величины: большая память не обязательно быстрее, а высокая пропускная способность не устраняет стартовую задержку.
Для C=AB, если прочитать каждый input один раз и записать output один раз, минимальный трафик модели:
Q
m
i
n
=
(
m
k
+
k
n
+
m
n
)
b
,
Q_{min}=(mk+kn+mn)b,
Q
min
=
(
mk
+
kn
+
mn
)
b
,
гдеb — байт на скаляр. СтарыйCне читается: рассматриваетсяβ=0, не general GEMMсβC. Приtile t без reuse между выходными blocks модель даёт:
Q
t
i
l
e
=
b
(
m
k
⌈
n
/
t
⌉
+
k
n
⌈
m
/
t
⌉
+
m
n
)
.
Q_{tile}=b\left(mk\lceil n/t\rceil+kn\lceil m/t\rceil+mn\right).
Q
t
i
l
e
=
b
(
mk
⌈
n
/
t
⌉
+
kn
⌈
m
/
t
⌉
+
mn
)
.
Для2×2матриц иb=2получаем минимум24байта. Приtile1 модель считает40байт, приtile2—24. МатематическийCодинаков, трафик различен.
Эксперимент.
В оценке большого GEMM увеличьтеtileпри тех жеm,k,n. Сравните ideal и modeled traffic, а не подменяйте один другим. Формула не учитывает загрузку адресов, cache eviction, синхронизацию и двойную буферизацию.
Под капотом.
КопированиеweightsсCPUнаGPU — ещё один перенос, не включённый в device-memory traffic. KV-cache, activations и optimizer states также не следует прятать в строке «память весов». На следующей странице учтём эти объекты отдельно.
m=k=n=2; b=2
qmin=(m*k+k*n+m*n)*b
qtile1=(m*k*n+k*n*m+m*n)*b
assert qmin==24 and qtile1==40
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
Повторное использование уменьшает повторные чтения, не меняя заданный оператор.
Вычисления и переносы ограничивают скорость. Как этот вопрос продолжает полученный результат?
Python-примеры главы 10
Академическая база →