Ist diese Matrix-Vektor-Multiplikationsfunktion in VHDL parallelisiert?

Ich habe die folgende VHDL-Funktion, die eine gegebene mxn-Matrix amit einem nx1-Vektor multipliziert 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;

Es funktioniert gut, aber was implementiert dies tatsächlich in Hardware? Was ich insbesondere wissen möchte, ist, ob es intelligent genug ist, um zu erkennen, dass es die innere for-Schleife parallelisieren kann und im Wesentlichen ein Skalarprodukt für jede Zeile der Matrix berechnet. Wenn nicht, was ist der einfachste (dh schöne Syntax) Weg, um die Matrix-Vektor-Multiplikation zu parallelisieren?

Wenn dies nicht der Fall wäre, müssten Sie über eine Art Speicher verfügen und alle Werte seriell laden und im Pipeline-Stil "ausführen".

Antworten (2)

In 'Hardware' (VHDL oder Verilog) werden alle Schleifen abgerollt und parallel ausgeführt.

Somit wird nicht nur Ihre innere Schlaufe, sondern auch Ihre äußere Schlaufe abgerollt.

Das ist auch der Grund, warum die Schleifengröße zur Kompilierzeit bekannt sein muss. Wenn die Loop-Länge unbekannt ist, beschwert sich das Synthese-Tool.


Es ist eine bekannte Falle für Anfänger, die aus einer SW-Sprache kommen. Sie versuchen zu konvertieren:

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

Auf VHDL/Verilog-Hardware. Das Problem ist, dass in der Simulation alles gut funktioniert. Aber das Synthesetool muss Addierer erzeugen:c = b+b+b+b...b;

Dazu muss das Tool wissen, wie viele Addierer zu erstellen sind. Wenn aes eine konstante Geldstrafe ist! (Auch wenn es 4.000.000 sind. Es wird keine Tore mehr geben, aber es wird es versuchen!)

Aber wenn aes eine Variable ist, geht sie verloren.

In diesem Fall ist es nur eine Multiplikation, also könnte a nur der Multiplikand sein und daher variabel sein ...

Dieser Code parallelisiert beide Schleifen, da Sie kein Ereignis definiert haben, um eine Teilmenge der Verarbeitung zu steuern. Schleifen generieren nur so viel Hardware, wie sie zum Generieren der Funktion benötigen; Sie brauchen einen PROZESS .

Ein Prozess hat eine Sensitivitätsliste, die VHDL (oder dem Synthesizer) mitteilt, dass der Prozess nicht aufgerufen wird, es sei denn, einer der Knoten in der Liste ändert sich. Dies kann verwendet werden, um Latches zu synthetisieren und über den Bereich der reinen kombinatorischen Implementierung hinaus zu expandieren.