Altifigence Academy

13 / 20 · Теория

Разбиение на блоки и граничное дополнение

Отобразите большие матрицы на меньшую сетку, обрабатывая нулевое дополнение и выходные маски.

Сначала разбейте выходное пространство

Сетка N×N обрабатывает больший результат M×P с помощью ceil(M/N)×ceil(P/N) пространственных блоков. Наш базовый вариант удерживает полную свёртку K в каждом блоке и очищается между выходными блоками. Оболочка хранит начало блока r0,c0; локальный PE(i,j) соответствует глобальному C(r0+i,c0+j). Сдвиг зависит от локальных координат.

Возьмём N=2 и M=P=K=3. Пусть A=[[1,2,3],[4,5,6],[7,8,9]] и B=[[1,0,2],[0,1,0],[2,0,1]]. Их произведение — [[7,2,5],[16,5,14],[25,8,23]]. Четыре начала блоков: (0,0), (0,2), (2,0) и (2,2).

Дополняйте операнды, маскируйте записи

Подавайте выходящие за диапазон строки A и столбцы B как достоверные нулевые токены. Каждый PE по-прежнему потребляет K членов, сохраняя простое условие завершения. Недостоверные дополненные члены могут вместо этого навсегда оставить некоторые count ниже K. Отдельно маскируйте записи результатов, предотвращая запись за пределами реальной матрицы.

Последний блок использует A=[[7,8,9],[0,0,0]] и B=[[2,0],[0,0],[1,0]]. Его локальный результат — [[23,0],[0,0]], но только верхнее левое значение можно записать в C(2,2). Числовой ноль не делает адрес вне диапазона безопасным.

Каждый блок использует пять фронтов advance, всего двадцать для четырёх последовательных блоков, исключая clear, загрузку и передачу выхода. Сетка выполняет сорок восемь MAC с дополнением; лишь двадцать семь принадлежат реальному произведению 3×3.

Разбиение свёртки требует сохранённых сумм

Разбиение K требует объединять частичные суммы одного выхода. C(0,0)=1×1+2×0+3×2=7 разбивается на частичные суммы один и шесть при K=2+1. Очистка итогового аккумулятора между этими свёртками оставит только шесть. Сохраняйте аккумулятор или объединяйте широкие частичные суммы в другом месте. Квантование каждой части до объединения может отличаться от однократного квантования полной суммы.

Итоговый проект начинает с пространственного разбиения и полного K. Проверяйте границы из одного элемента, размеры, делящиеся на N, последний блок с одним реальным выходом, достоверные дополненные нули и выходные маски. Индексируйте эталонную таблицу глобальными координатами, чтобы изменение порядка блоков не меняло ожидаемый результат.

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

Для блока (0,2) в примере 3×3 укажите выходную маску и локальный результат. Каковы частичные суммы C(0,2) при разбиении K на 2+1?

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

Локальный результат — [[5,0],[14,0]], маска — [[1,0],[1,0]]. C(0,2)=1×2+2×0+3×1 имеет частичные суммы два и три, всего пять.

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