Altifigence Academy

18 / 24 · Теория

Блоки, окружающие области и частичные суммы

При Th=Tw=2,Tc=1,Tm=2,ядре 3×3,шаге два,прореживании один вычислите байты однобуферных входов/весов/32-битных сумм/bias.

Разделите тензоры под размер хранения

Выберите выходную высоту Th,ширину Tw,число входных каналов Tc и выходных Tm для одного блока. Окружающая входная область выходит за выходной блок. При шаге S,прореживании D и ядре R требуемая высота входа — (Th−1)S+(R−1)D+1; примените горизонтальный аналог к ширине. Граничное дополнение можно генерировать вместо загрузки.

Разделение входных каналов требует сохранения каждой выходной частичной суммы между всеми блоками каналов. Раннее округление каждого блока меняет операцию. Добавляйте bias один раз в первом блоке каналов, затем продолжайте ту же сумму. Изменение блоков выходных каналов также меняет веса и bias.

Разобранный бюджет хранения

Для операции 3×3 с единичными шагом и прореживанием пусть Th=Tw=2,Tc=2,Tm=2. Окружающая область 4×4 требует 32 входных байта int8. Веса используют 2×2×3×3=36 байт. Восемь 32-битных частичных сумм используют 32 байта, два 32-битных bias — восемь. Всего:108 байт. Масштабы, адреса, достоверность и хранение управления исключены и требуют отдельного резерва.

Двойная буферизация входа и весов требует 2×(32+36)+32+8=176 байт, больше бюджета 128 байт. Снижение Tc до одного даёт шестнадцать входных и восемнадцать байт весов. Двойное хранение становится 2×34+32+8=108 байт. Сохраняйте частичные суммы между двумя блоками входных каналов. Вместимость буферов не доказывает перекрытие передач с вычислением; отдельно проверяйте расписание.

Шаг два увеличивает входной охват того же выходного блока 2×2 до 5×5. Соседние блоки могут разделять значения окружающей области, но независимые перезагрузки всё равно дублируют трафик. Отличайте уникальные байты тензора, нижнюю границу, от фактических передач блоков.

При M=5 и Tm=2 последний блок имеет один достоверный выходной канал. Маскируйте лишний доступ к весам и выходу. Применяйте аналогичные маски к последним пространственным блокам и блокам входных каналов. Документация NVIDIA CUTLASS описывает реальный подход implicit-GEMM, генерирующий блоки без полной расширенной матрицы. Здесь рассчитываются хранение и частичные суммы, а не выполняется эта реализация CUDA.

Попробуйте сами

При Th=Tw=2,Tc=1,Tm=2,ядре 3×3,шаге два,прореживании один вычислите байты однобуферных входов/весов/32-битных сумм/bias.

Прочитать объяснение

Вход 5×5 использует 25 байт. Добавьте восемнадцать байт весов,32 байта сумм и восемь bias:83 байта без управления и масштабов.

Выбор действует в этом браузере. Его можно изменить внизу страницы.