Урок 29: Пропускная способность и арифметическая интенсивность
Каждое ядро выполняет два вида работы: вычисления (операции с плавающей точкой, FLOP) и перемещение данных (байты в память и из неё). Две простые метрики позволяют понять, что важно. Первая — пропускная способность: сколько байтов память перемещает в секунду. Мы вычисляем её как байты, делённые на в
Представьте грузовик, доставляющий кирпичи строителю: пропускная способность — это сколько кирпичей грузовик доставляет в минуту, а интенсивность — сколько работы строитель вкладывает в каждый кирпич. Когда интенсивность низкая, строитель всё время ждёт грузовик — узкое место в памяти. Когда интенсивность высокая, грузовик ждёт строителя — узкое место в вычислениях.
- пропускная способность (ГБ/с)
- Байты, которые память перемещает в секунду. Вычисляется как байты, делённые на время, и переводится в ГБ/с делением на 1e9.
- арифметическая интенсивность (FLOP/байт)
- Выполненные FLOP, делённые на байты, перемещённые из памяти. Низкая = ограничено памятью; высокая = ограничено вычислениями.
- ограничено памятью (memory-bound)
- Ядро с низкой интенсивностью, время выполнения которого определяется пропускной способностью. Чтобы ускорить его, вы уменьшаете байты, а не добавляете FLOP.
- ограничено вычислениями (compute-bound)
- Ядро с высокой интенсивностью, время выполнения которого определяется математическими блоками, поэтому память не является узким местом.