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

9

Tengo la siguiente función VHDL que multiplica una matriz mxn dada apor 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é implementa esto realmente 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, calculando esencialmente un producto de puntos para cada fila de la matriz. Si no es así, ¿cuál es la forma más simple (es decir, buena sintaxis) de paralelizar la multiplicación matriz-vector?

fabiomaia
fuente
1
Si no fuera así, tendría que tener algún tipo de memoria y cargar en serie todos los valores y "ejecutarlos" al estilo de canalización
Tensión de voltaje

Respuestas:

9

En 'hardware' (VHDL o Verilog) todos los bucles se desenrollan y ejecutan en paralelo.

Por lo tanto, no solo su bucle interno, también se desenrolla su bucle externo.

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


Es una trampa bien conocida para principiantes que provienen de un lenguaje SW. Intentan convertir:

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

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

Para eso, la herramienta necesita saber cuántos sumadores hacer. Si aes una multa constante! (¡Incluso si es 4.000.000. Se quedará sin puertas pero lo intentará!)

Pero si aes una variable, se pierde.

Viejo pedo
fuente
En este caso es solo multiplicación, por lo que a podría ser el multiplicando y, por lo tanto, ser variable ...
Harry Svensson
1

Este código paralelizará ambos bucles, ya que no ha definido un evento para controlar ningún subconjunto del procesamiento. Los bucles solo generan tanto hardware como sea necesario para generar la función; tu necesitas un PROCESO .

Un proceso tiene una lista de sensibilidad que le dice a VHDL (o al sintetizador) que el proceso no se invoca a menos que cambie uno de los nodos de la lista. Esto puede usarse para sintetizar pestillos y expandirse más allá del ámbito de la implementación combinatoria pura.

Policronópolis de Cristobol
fuente