Là hàm nhân ma trận-vector trong VHDL song song?


9

Tôi có hàm VHDL sau đây nhân một ma trận mxn đã cho abằng một vectơ 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;

Nó hoạt động tốt nhưng điều này thực sự thực hiện trong phần cứng? Cụ thể, điều tôi muốn biết là liệu nó có đủ thông minh để nhận ra rằng nó có thể song song hóa vòng lặp for bên trong hay không, về cơ bản là tính toán một sản phẩm chấm cho mỗi hàng của ma trận. Nếu không, cách đơn giản nhất (tức là cú pháp đẹp) để song song phép nhân vectơ ma trận là gì?


1
Nếu không, bạn sẽ phải có một số loại bộ nhớ và tải tất cả các giá trị và "thực thi" chúng theo kiểu đường ống
Điện áp Spike

Câu trả lời:


9

Trong 'phần cứng' (VHDL hoặc Verilog), tất cả các vòng lặp không được kiểm soát và thực thi song song.

Do đó, không chỉ vòng lặp bên trong của bạn, vòng lặp bên ngoài của bạn cũng không được kiểm soát.

Đó cũng là lý do tại sao kích thước vòng lặp phải được biết tại thời điểm biên dịch. Khi độ dài vòng lặp không xác định, công cụ tổng hợp sẽ khiếu nại.


Đó là một cái bẫy nổi tiếng cho người mới bắt đầu đến từ một ngôn ngữ SW. Họ cố gắng chuyển đổi:

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

Để phần cứng VHDL / Verilog. Vấn đề là tất cả đều hoạt động tốt trong mô phỏng. Nhưng công cụ tổng hợp cần tạo các bộ cộng: c = b+b+b+b...b;

Cho rằng công cụ cần phải biết có bao nhiêu trình bổ sung để thực hiện. Nếu alà phạt tiền liên tục! (Ngay cả khi nó là 4.000.000. Nó sẽ hết cổng nhưng nó sẽ thử!)

Nhưng nếu alà một biến nó bị mất.


Trong trường hợp này, nó chỉ là phép nhân, vì vậy a chỉ có thể là bội số và do đó có thể thay đổi ...
Harry Svensson

1

Mã này sẽ song song cả hai vòng lặp, vì bạn chưa xác định một sự kiện để kiểm soát bất kỳ tập hợp con nào của quá trình xử lý. Vòng lặp chỉ tạo ra nhiều phần cứng như họ cần để tạo hàm; bạn cần một QUY TRÌNH .

Một quy trình có một danh sách độ nhạy cho VHDL (hoặc bộ tổng hợp) rằng quy trình không được gọi trừ khi một trong các nút trong danh sách thay đổi. Điều này có thể được sử dụng để tổng hợp các chốt và mở rộng ra ngoài phạm vi của việc thực hiện kết hợp thuần túy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.