J'ai la fonction VHDL suivante qui multiplie une matrice a
mxn 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?
Réponses:
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:
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
a
c'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
a
s'agit d'une variable, elle est perdue.la source
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.
la source