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?

fabiomaia
fonte
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.

Velhote
fonte
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.

Polychronopolis de Cristobol
fonte