VHDL'deki bu matris-vektör çarpma işlevi paralel mi?


9

Belirli bir mxn matrisi anx1 vektörü ile çarpan aşağıdaki VHDL işlevi var 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;

İyi çalışıyor ama bu aslında donanımda ne uyguluyor? Özellikle, bilmek istediğim, esas olarak matrisin her satırı için bir nokta ürünü hesaplayarak, döngü için içi paralelleştirebileceğini fark edecek kadar akıllı olup olmadığıdır. Değilse, matris-vektör çarpımını paralelleştirmenin en basit (yani güzel sözdizimi) yolu nedir?


1
Değilse, bir tür belleğe sahip olmanız ve tüm değerleri seri olarak yüklemeniz ve bunları boru hattı stilini "yürütmeniz" gerekir
Voltage Spike

Yanıtlar:


9

'Donanım'da (VHDL veya Verilog) tüm döngüler açılır ve paralel olarak yürütülür.

Böylece sadece iç halkanız değil, dış halkanız da açılır.

Bu, döngü boyutunun derleme zamanında bilinmesinin nedenidir. Döngü uzunluğu bilinmiyorsa, sentez aracı şikayet edecektir.


SW dilinden yeni başlayanlar için iyi bilinen bir tuzaktır. Dönüştürmeye çalışırlar:

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

VHDL / Verilog donanımına. Sorun şu ki, simülasyonda her şey iyi çalışıyor. Ancak sentez aracının toplayıcı oluşturması gerekir: c = b+b+b+b...b;

Bunun için aracın kaç tane toplayıcı yapacağını bilmesi gerekir. Eğer asabit gayet iyi! (4.000.000 olsa bile. Kapıları bitecek ama deneyecek!)

Ancak abir değişkense kaybolur.


Bu durumda bu sadece çarpmadır, bu yüzden sadece çarpma olabilir ve bu nedenle değişken olabilir ...
Harry Svensson

1

İşlemin herhangi bir alt kümesini kontrol etmek için bir olay tanımlamadığınızdan, bu kod her iki döngüyü de paralel hale getirir. Döngüler işlevi oluşturmak için ihtiyaç duydukları kadar donanım üretir; bir SÜREÇ'e ihtiyacınız var .

Bir işlem, VHDL'ye (veya sentezleyiciye) listedeki düğümlerden biri değişmedikçe işlemin çağrılmadığını bildiren bir duyarlılık listesine sahiptir. Bu, mandalları sentezlemek ve saf kombinatoryal uygulama alanının ötesine genişletmek için kullanılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.