Processing math: 100%

10 votos

¿Esta función de multiplicación de matriz-vector en VHDL es paralela?

Tengo la siguiente función VHDL que multiplica una matriz mxn dada a por un vector 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;

Funciona bien, pero ¿qué es lo que realmente se implementa en el hardware? Específicamente, lo que quiero saber es si es lo suficientemente inteligente como para darse cuenta de que puede paralelizar el bucle for interno, esencialmente calculando un producto punto para cada fila de la matriz. Si no es así, ¿cuál es la forma más sencilla (es decir, una sintaxis agradable) de paralelizar la multiplicación matriz-vector?

10voto

yeyo123321 Puntos 8

En "hardware" (VHDL o Verilog) todo Los bucles se desenrollan y se ejecutan en paralelo.

Así, no sólo su bucle interno, también su bucle externo se desenrolla.

Esta es también la razón por la que el tamaño del bucle debe conocerse en tiempo de compilación. Si se desconoce la longitud del bucle, la herramienta de síntesis se quejará.


Es una trampa bien conocida para los principiantes que vienen de un lenguaje de SW. Intentan convertirlo:

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

Al hardware VHDL/Verilog. El problema es que todo funciona bien en simulación. Pero la herramienta de síntesis necesita generar sumadores: c = b+b+b+b...b;

Para ello, la herramienta necesita saber cuántos sumadores hay que hacer. Si a ¡es una multa constante! (Aunque sea de 4.000.000. ¡Se quedará sin puertas pero lo intentará!)

Pero si a es una variable se pierde.

1voto

Este código paralelizará ambos bucles, ya que no has definido un evento para controlar ningún subconjunto del procesamiento. Los bucles sólo generan todo el hardware que necesitan para generar la función; necesitas un PROCESO .

Un proceso tiene una lista de sensibilidad que le dice a VHDL (o al sintetizador) que el proceso no es invocado a menos que uno de los nodos de la lista cambie. Esto puede ser utilizado para sintetizar latches, y ampliar más allá del ámbito de la implementación combinatoria pura.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X