Essa função de multiplicação de vetores matriciais em VHDL é paralela?


9

Eu tenho a seguinte função VHDL que multiplica uma matriz mxn fornecida apor um vetor 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 bem, mas o que isso realmente implementa no hardware? Especificamente, o que eu quero saber é se é inteligente o suficiente para perceber que pode paralelizar o loop for interno, essencialmente calculando um produto escalar para cada linha da matriz. Caso contrário, qual é a maneira mais simples (ou seja, boa sintaxe) de paralelizar a multiplicação de vetores matriciais?


11
Se não fosse, você teria que ter algum tipo de memória e serialmente carregar todos os valores e "executar" los estilo gasoduto
Tensão Pico

Respostas:


9

No 'hardware' (VHDL ou Verilog), todos os loops são desenrolados e executados em paralelo.

Portanto, não apenas seu loop interno, mas também seu loop externo, é desenrolado.

Essa também é a razão pela qual o tamanho do loop deve ser conhecido no momento da compilação. Quando o comprimento do loop é desconhecido, a ferramenta de síntese reclama.


É uma armadilha bem conhecida para iniciantes vindos de uma linguagem SW. Eles tentam converter:

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

Para hardware VHDL / Verilog. O problema é que tudo funciona bem na simulação. Mas a ferramenta de síntese precisa gerar somadores: c = b+b+b+b...b;

Para isso, a ferramenta precisa saber quantos somadores fazer. Se aé uma multa constante! (Mesmo que seja 4.000.000. Ficará sem portas, mas tentará!)

Mas se aé uma variável, está perdida.


Neste caso é apenas multiplicação, então um poderia ser apenas o multiplicando e, portanto, ser variável ...
Harry Svensson

1

Esse código paralelizará os dois loops, pois você não definiu um evento para controlar nenhum subconjunto do processamento. Os loops geram apenas o hardware necessário para gerar a função; você precisa de um processo .

Um processo possui uma lista de sensibilidade que informa ao VHDL (ou o sintetizador) que o processo não é chamado, a menos que um dos nós na lista seja alterado. Isso pode ser usado para sintetizar travas e expandir para além do domínio da implementação combinatória pura.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.