Alterna · учебный материал
10.3 Много похожих действий одновременно
Клетки матричного результата можно вычислять параллельно. GPU хорошо подходит для большого числа таких похожих операций.
Что в этом материале
- Независимые задачи ещё нужно распределить
Содержание и основные понятия
На предыдущей странице: размер записи и точность.
Клетки матричного результата можно вычислять параллельно. GPU хорошо подходит для большого числа таких похожих операций.
Числа имеют конечную точность; их нужно хранить и переносить. Матричные блоки дают много независимой работы, но память и организация групп также влияют на результат.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Независимые задачи ещё нужно распределить
CPU удобен для управляющей логики, ветвлений и последовательных зависимостей; GPU организует большое число потоков для throughput. Это не утверждение «CPU считает по одному, GPU всё одновременно»: современные CPU тоже векторизуют работу, а GPU ограничен ресурсами и зависимостями.
В учебной модели задачи объединяются в lockstep-группы шириныw. Группа длится столько условных ticks, сколько её самая долгая задача. Группы выполняются последовательно. Это
не измеренная latency устройства
.
Возьмём16задач:8по1tick и8по4ticks. Приw=8 и сгруппированном порядке группы длятся1и4ticks, всего5. При чередовании коротких и длинных обе группы длятся4ticks, всего8. Полезная работа40lane-ticks одинакова, выделенный бюджет40против64. Изменилась организация, не задача.
Эксперимент.
Меняйте lanes и порядок при том же числе работ. Проверьте хвост, когда tasks не делится на width. Неиспользуемые слоты не должны исчезать из знаменателя эффективности.
Ограничение.
Модель иллюстрирует простой lockstep и дисбаланс. Она не моделирует современное независимое планирование инструкций, occupancy, кеши, interconnect или частоты. Число lanes нельзя трактовать как «число ядер вашего GPU». Для реального выбора CPU/GPU нужны измерения конкретной реализации.
work=[1]*8+[4]*8
grouped=sum(max(work[i:i+8]) for i in range(0,16,8))
mixed=[1,4]*8
interleaved=sum(max(mixed[i:i+8]) for i in range(0,16,8))
assert grouped==5 and interleaved==8 and sum(work)==40
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
Модель не профилирует оборудование и не знает его реальной частоты.
Как вычисляется одна клетка произведения. Как этот вопрос продолжает полученный результат?
Python-примеры главы 10
Академическая база →