Эта функция умножения матрицы на вектор в VHDL распараллелена?


9

У меня есть следующая функция VHDL, которая умножает данную матрицу amxn на вектор 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, по сути вычисляя точечное произведение для каждой строки матрицы. Если нет, то каков самый простой (то есть хороший синтаксис) способ распараллеливания умножения матрицы на вектор?


1
Если бы это было не так, вам нужно было бы иметь некоторую память и последовательно загружать все значения и «выполнять» их в конвейерном стиле
Voltage Spike

Ответы:


9

В «аппаратном обеспечении» (VHDL или Verilog) все циклы развертываются и выполняются параллельно.

Таким образом, разворачивается не только ваша внутренняя петля, но и ваша внешняя петля.

Это также причина, по которой размер цикла должен быть известен во время компиляции. Когда длина цикла неизвестна, инструмент синтеза будет жаловаться.


Это хорошо известная ловушка для начинающих с языка SW. Они пытаются преобразовать:

int a,b,c;
   c = 0;
   while (a--)
     c +=  b;

Для VHDL / Verilog оборудования. Проблема в том, что в симуляции все отлично работает. Но инструмент синтеза должен генерировать сумматоры: c = b+b+b+b...b;

Для этого инструмент должен знать, сколько сумматоров сделать. Если aэто постоянный штраф! (Даже если это 4.000.000. У него кончатся ворота, но он попробует!)

Но если aэто переменная, она теряется.


В данном случае это просто умножение, поэтому a может быть просто множителем и, следовательно, быть переменным ...
Гарри Свенссон,

1

Этот код распараллелит оба цикла, поскольку вы не определили событие для управления каким-либо подмножеством обработки. Циклы просто генерируют столько оборудования, сколько им нужно для генерации функции; тебе нужен ПРОЦЕСС .

У процесса есть список чувствительности, который сообщает VHDL (или синтезатору), что процесс не вызывается, пока не изменится один из узлов в списке. Это может быть использовано для синтеза защелок и расширения за пределы чисто комбинаторной реализации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.