Apakah fungsi multiplikasi matriks-vektor ini dalam VHDL diparalelkan?

9

Saya memiliki fungsi VHDL berikut yang mengalikan matriks mxn yang diberikan aoleh vektor 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;

Ini bekerja dengan baik tetapi apa yang sebenarnya diimplementasikan dalam perangkat keras? Secara khusus, apa yang ingin saya ketahui adalah apakah cukup pintar untuk menyadari bahwa ia dapat memparalelkan bagian dalam untuk loop, pada dasarnya menghitung produk titik untuk setiap baris matriks. Jika tidak, apa cara paling sederhana (yaitu sintaksis bagus) untuk memparalelkan perkalian matriks-vektor?

fabiomaia
sumber
1
Jika tidak, Anda harus memiliki semacam memori dan memuat semua nilai secara berurutan dan "mengeksekusi" mereka gaya pipa
Voltage Spike

Jawaban:

9

Dalam 'perangkat keras' (VHDL atau Verilog) semua loop terbuka dan dieksekusi secara paralel.

Jadi bukan hanya loop dalam Anda, juga loop luar Anda tidak terbuka.

Itu juga alasan mengapa ukuran loop harus diketahui pada waktu kompilasi. Ketika panjang loop tidak diketahui, alat sintesis akan mengeluh.


Ini adalah jebakan yang terkenal untuk pemula yang berasal dari bahasa SW. Mereka mencoba mengonversi:

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

Untuk perangkat keras VHDL / Verilog. Masalahnya adalah semuanya bekerja dengan baik dalam simulasi. Tetapi alat sintesis perlu menghasilkan adders: c = b+b+b+b...b;

Untuk itu alat perlu tahu berapa banyak adders yang harus dibuat. Jika adenda konstan! (Bahkan jika 4.000.000. Itu akan kehabisan gerbang tetapi akan mencoba!)

Tetapi jika avariabel, itu hilang.

Tua bangka
sumber
Dalam hal ini hanya perkalian, jadi bisa saja perkalian dan karena itu menjadi variabel ...
Harry Svensson
1

Kode ini akan memparalelkan kedua loop, karena Anda belum menentukan suatu peristiwa untuk mengontrol subset dari pemrosesan. Loop hanya menghasilkan perangkat keras sebanyak yang mereka butuhkan untuk menghasilkan fungsi; Anda perlu PROSES .

Suatu proses memiliki daftar sensitivitas yang memberi tahu VHDL (atau synthesizer) bahwa proses tersebut tidak dipanggil kecuali salah satu node dalam daftar berubah. Ini dapat digunakan untuk mensintesis kait, dan memperluas melampaui ranah implementasi kombinatorial murni.

Cristobol Polychronopolis
sumber