У меня есть следующая функция VHDL, которая умножает данную матрицу a
mxn на вектор nx1 b
:
function matrix_multiply_by_vector(a: integer_matrix; b: integer_vector; m: integer; n: integer)
return integer_vector is variable c : integer_vector(m-1 downto 0) := (others => 0);
begin
for i in 0 to m-1 loop
for j in 0 to n-1 loop
c(i) := c(i) + (a(i,j) * b(j));
end loop;
end loop;
return c;
end matrix_multiply_by_vector;
Это работает хорошо, но что это на самом деле реализует в аппаратном обеспечении? В частности, я хочу знать, достаточно ли он умен, чтобы понять, что он может распараллелить внутренний цикл for, по сути вычисляя точечное произведение для каждой строки матрицы. Если нет, то каков самый простой (то есть хороший синтаксис) способ распараллеливания умножения матрицы на вектор?
Ответы:
В «аппаратном обеспечении» (VHDL или Verilog) все циклы развертываются и выполняются параллельно.
Таким образом, разворачивается не только ваша внутренняя петля, но и ваша внешняя петля.
Это также причина, по которой размер цикла должен быть известен во время компиляции. Когда длина цикла неизвестна, инструмент синтеза будет жаловаться.
Это хорошо известная ловушка для начинающих с языка SW. Они пытаются преобразовать:
Для VHDL / Verilog оборудования. Проблема в том, что в симуляции все отлично работает. Но инструмент синтеза должен генерировать сумматоры:
c = b+b+b+b...b;
Для этого инструмент должен знать, сколько сумматоров сделать. Если
a
это постоянный штраф! (Даже если это 4.000.000. У него кончатся ворота, но он попробует!)Но если
a
это переменная, она теряется.источник
Этот код распараллелит оба цикла, поскольку вы не определили событие для управления каким-либо подмножеством обработки. Циклы просто генерируют столько оборудования, сколько им нужно для генерации функции; тебе нужен ПРОЦЕСС .
У процесса есть список чувствительности, который сообщает VHDL (или синтезатору), что процесс не вызывается, пока не изменится один из узлов в списке. Это может быть использовано для синтеза защелок и расширения за пределы чисто комбинаторной реализации.
источник