Чи паралельна ця функція множення матричного вектора у 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;

Це добре працює, але що це насправді реалізує в апараті? Зокрема, те, що я хочу знати, це якщо він досить розумний, щоб зрозуміти, що він може паралелізувати внутрішню для циклу, по суті обчислюючи крапковий добуток для кожного рядка матриці. Якщо ні, то який найпростіший (тобто приємний синтаксис) спосіб паралелізації множення матричного вектора?


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це змінна, вона втрачається.


У цьому випадку це просто множення, тому а може бути просто мультиплікацією і тому може бути змінною ...
Гаррі Свенссон

1

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

Процес має список чутливості, який повідомляє VHDL (або синтезатор), що процес не викликається, якщо не зміниться один із вузлів у списку. Це можна використовувати для синтезу засувок та виходу за межі сфери чистого комбінаторного втілення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.