Cette fonction de multiplication matrice-vecteur en VHDL est-elle parallélisée?


9

J'ai la fonction VHDL suivante qui multiplie une matrice amxn donnée par un vecteur 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;

Cela fonctionne bien, mais qu'est-ce que cela implémente réellement dans le matériel? Plus précisément, ce que je veux savoir, c'est s'il est suffisamment intelligent pour réaliser qu'il peut paralléliser la boucle for interne, calculant essentiellement un produit scalaire pour chaque ligne de la matrice. Sinon, quelle est la manière la plus simple (c'est-à-dire la syntaxe agréable) de paralléliser la multiplication matrice-vecteur?


1
Si ce n'était pas le cas, vous devriez avoir une sorte de mémoire et charger en série toutes les valeurs et les "exécuter" sous forme de pipeline
Voltage Spike

Réponses:


9

En «matériel» (VHDL ou Verilog), toutes les boucles sont déroulées et exécutées en parallèle.

Ainsi, non seulement votre boucle intérieure, mais aussi votre boucle extérieure est déroulée.

C'est également la raison pour laquelle la taille de la boucle doit être connue au moment de la compilation. Lorsque la longueur de boucle est inconnue, l'outil de synthèse se plaindra.


C'est un piège bien connu des débutants venant d'un langage SW. Ils essaient de convertir:

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

Vers le matériel VHDL / Verilog. Le problème est que tout fonctionne bien en simulation. Mais l'outil de synthèse doit générer des additionneurs: c = b+b+b+b...b;

Pour cela, l'outil doit savoir combien d'ajouts faire. Si ac'est une amende constante! (Même si c'est 4.000.000. Il n'y aura plus de portes mais il essaiera!)

Mais s'il as'agit d'une variable, elle est perdue.


Dans ce cas, ce n'est que de la multiplication, donc un pourrait simplement être le multiplicande et donc être variable ...
Harry Svensson

1

Ce code parallélisera les deux boucles, car vous n'avez défini aucun événement pour contrôler un sous-ensemble du traitement. Les boucles génèrent juste autant de matériel que nécessaire pour générer la fonction; vous avez besoin d'un PROCESS .

Un processus a une liste de sensibilité qui indique à VHDL (ou au synthétiseur) que le processus n'est pas appelé sauf si l'un des nœuds de la liste change. Cela peut être utilisé pour synthétiser des verrous et s'étendre au-delà du domaine de la pure implémentation combinatoire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.