VHDL에서이 행렬 벡터 곱셈 함수가 병렬화되어 있습니까?


9

주어진 mxn 행렬 a에 nx1 벡터를 곱하는 다음 VHDL 함수가 있습니다 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;

잘 작동하지만 실제로 하드웨어에서 무엇을 구현합니까? 특히, 내가 알고 싶은 것은 내부 for 루프를 병렬화 할 수 있고, 본질적으로 행렬의 각 행에 대한 내적을 계산할 수 있다는 것이 충분히 똑똑한 지 여부입니다. 그렇지 않다면 행렬-벡터 곱셈을 병렬화하는 가장 간단한 방법은 무엇입니까?


1
그렇지 않은 경우 일종의 메모리가 있어야하고 모든 값을 직렬로로드하고 파이프 라인 스타일을 "실행"해야합니다.
Voltage Spike

답변:


9

'하드웨어'(VHDL 또는 Verilog)에서는 모든 루프가 풀리고 병렬로 실행됩니다.

따라서 내부 루프뿐만 아니라 외부 루프도 풀립니다.

이것이 컴파일시 루프 크기를 알아야하는 이유이기도합니다. 루프 길이를 알 수 없으면 합성 도구가 불평합니다.


SW 언어에서 온 초보자에게 잘 알려진 함정입니다. 그들은 변환하려고합니다 :

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

VHDL / Verilog 하드웨어에. 문제는 시뮬레이션에서 모두 잘 작동한다는 것입니다. 그러나 합성 도구는 가산기를 생성해야합니다. c = b+b+b+b...b;

이를 위해이 도구는 몇 개의 가산기를 만들어야합니다. 경우 a일정한 벌금입니다! (4 만 0.000 일지라도 문이 부족하지만 시도 할 것입니다!)

그러나 a변수이면 손실됩니다.


이 경우에는 곱셈 일 뿐이므로 a는 곱셈이므로 가변적 일 수 있습니다.
Harry Svensson

1

처리의 서브 세트를 제어하는 ​​이벤트를 정의하지 않았으므로이 코드는 두 루프를 병렬화합니다. 루프는 함수를 생성하는 데 필요한만큼의 하드웨어를 생성합니다. 당신은 프로세스 가 필요합니다 .

프로세스에는 VHDL (또는 신시사이저)에 목록의 노드 중 하나가 변경되지 않는 한 프로세스가 호출되지 않음을 알리는 민감도 목록이 있습니다. 이것은 래치를 합성하고 순수한 조합 구현의 영역을 넘어 확장하는 데 사용될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.