Projekt oprogramowania układowego FPGA: Jak duży jest za duży?


13

Mam szczególnie dużą transformację przetwarzania sygnału, którą należy przenieść z Matlaba na VHDL. To zdecydowanie wymaga pewnego rodzaju udostępniania zasobów. Trochę obliczeń dało mi następujące informacje:

  • 512 fft 64-punktowych
  • 41210 operacji wielokrotnego dodawania

Biorąc pod uwagę, że największy Virtex 6 FPGA ma ~ 2000 bloków DSP48E, wiem, że mogę współdzielić zasoby, aby wielokrotnie korzystać z zasobów. Czas wykonania nie jest tak naprawdę problemem, czas przetwarzania może potrwać stosunkowo długo w kategoriach FPGA.

Patrząc na wykorzystanie zasobów, użycie architektury radix-2 lite daje mi bloki 4dsp / FFT = 2048 bloków DSP, w sumie ~ 43k. największy Virtex FPGA ma 2k bloków, czyli 20 operacji / multiplekser.

Oczywiście uwzględnienie tak dużych miksów w tkaninie również zajmie plastry. Gdzie znajdę górną granicę tego limitu? Nie mogę w nieskończoność udostępniać zasobów FPGA. Czy mnożniki 41210 są za duże? Jak obliczyć, co jest za duże?

Przyjrzałem się także innym zasobom (plastry, stłuczki itp.). Radix-2 Lite daje również 4 x 18k Brams / fft = 2048 Brams, największy Xilinx FPGA zawiera 2128 Brams. bardzo granica. Obawiam się, że mój projekt jest po prostu za duży.


AKTUALIZACJA:

Więcej informacji na temat samego projektu. Nie mogę wdawać się w szczegóły, ale oto, co mogę dać:

Initial conditions -> 512 ffts -> 40k multipliers ---------|----> output data to host 

                 ^------re-calculate initial conditions----|

wyjściowa specyfikacja danych: „szybciej niż symulacja Matlaba”

obliczenia mądre, oto gdzie jestem:

Etap FFT: łatwy. Mogę wdrożyć FFT 1/2/4/8, zapisać wyniki w pamięci SDRAM i uzyskać dostęp później. Stosunkowo mały, nawet jeśli zajmuje dużo czasu, jest w porządku. używając radix-2 lite mogę uzyskać 2 DSP48E i 2 18k BRAMS / FFT. Streaming daje 6 DSP48Es 0BRAMS / FFT. w obu przypadkach 64-punktowy FFT jest niewielki pod względem zasobów FPGA.

Mnożniki : to mój problem. Dane wejściowe do mnożenia są pobierane z tabel odnośników lub danych FFT. To naprawdę jest cała masa wielokrotnych dodań. Nie ma wiele do optymalizacji. Nie filtr, ale ma cechy podobne do filtra.

Biorąc pod uwagę współdzielenie zasobów na FPGA, matematyka działa w następujący sposób: Jeden LUT-6 może być używany jako multipleks 4-kierunkowy. Wzór na multipleks M-bitowy N-way jest następujący:

N*M/3 = number of luts, or N*M/12 = slices (4 LUTS/slice).

chrupanie liczb dla mojej implementacji nie daje dobrych rezultatów. 90% z rodziny virtix-6 nie ma wystarczającej liczby wycinków, aby dzielić zasoby DSP w celu wykonania 40 000 operacji.


Najbardziej wydajnymi formami udostępniania zasobów są częściowe serializacje, w których można uzyskać dostęp do danych poprzez adresowanie pamięci. Oczywiście, w skrajnej sytuacji wracasz do konwencjonalnego procesora zapisanego w programie - brak wymagań dotyczących wydajności zaczyna wskazywać na elastyczność implementacji oprogramowania, być może działającą w chmurze obliczeniowej.
Chris Stratton,

1
To nie jest część twojego pytania, ale w obliczeniach zasobów nie podałeś operandu rozmiaru. 512 FFT x 64 punktów x ile bitów? W FPGA rozmiar operandu zależy wyłącznie od Ciebie, więc musisz wziąć to pod uwagę przy ustalaniu rozmiaru swojego problemu.
Photon

Nie wiem, czy zdałeś sobie sprawę, ale te duże układy FPGA są dość drogie. Niektóre mogą przekraczać 5 000 USD. Być może powinieneś to również rozważyć, chyba że koszt nie stanowi problemu.
Gustavo Litovsky

1
Niestety poza sugestiami alternatywnych rozwiązań, które otrzymałeś dotychczas w odpowiedziach, wątpię, czy możemy zrobić dla ciebie znacznie więcej. Mam na myśli, że możesz zrobić tylko jeden rdzeń FFT i przepuszczać przez niego 512 wejść jeden po drugim, i oczywiście pasowałoby to nawet dość niewielkiemu FPGA. Gdzieś pomiędzy tym a robieniem wszystkiego równolegle jest właściwa równowaga prędkości względem zasobów dla twojej aplikacji ... ale trudno jest komukolwiek oprócz Ciebie powiedzieć, gdzie powinna być ta równowaga.
Photon

1
Czy masz na to numer budżetu? Jak zauważył Gustavo, wysokiej klasy układy FPGA są drogie, podobnie jak opracowanie płytki PCB do ich osadzenia. Podczas gdy podwojenie (lub czterokrotność lub ...) ilości sprzętu komputerowego i dalsze używanie istniejącego, sprawdzonego (?) Kodu Matlab prawdopodobnie będzie zgodne z podaną specyfikacją prędkości.
Photon

Odpowiedzi:


8

Zastanawiam się, czy istnieje inny sposób spojrzenia na problem?

Odgrywasz swoją ocenę 512 operacji FFT (po 64 punkty) i 42k operacji MAC ... Zakładam, że to jest potrzebne do jednego przejścia przez algorytm?

Teraz znalazłeś rdzeń FFT przy użyciu 4 jednostek DSP ... ale ile cykli zegara potrzeba na FFT? (przepustowość, a nie opóźnienie)? Powiedzmy 64 lub 1 cykl na punkt. Następnie musisz wykonać te 42k operacje Maca w 64 cyklach - być może 1k MAC na cykl, przy czym każda operacja MAC obsługuje 42 operacje.

Teraz nadszedł czas, aby przyjrzeć się szczegółowo pozostałemu algorytmowi: zidentyfikuj nie MAC, ale operacje na wyższym poziomie (filtrowanie, korelacja, cokolwiek), które można ponownie wykorzystać. Zbuduj rdzenie dla każdej z tych operacji, z możliwością wielokrotnego użytku (np. Filtry z różnymi zestawami współczynników do wyboru), a wkrótce może się okazać, że pomiędzy stosunkowo dużymi rdzeniami może być potrzebnych stosunkowo niewiele multiplekserów ...

Czy możliwe jest także zmniejszenie siły? Miałem kilka przypadków, w których mnożenie w pętlach było wymagane do generowania kwadratów (i wyższych). Rozwijając je, mogłem iteracyjnie generować je bez mnożenia: byłem całkiem zadowolony z siebie w dniu, w którym zbudowałem silnik różnicowy na FPGA!

Bez znajomości aplikacji nie mogę podać więcej szczegółów, ale niektóre z takich analiz prawdopodobnie spowodują znaczne uproszczenia.

Ponadto - ponieważ brzmi to tak, jakbyś nie miał na myśli określonej platformy - zastanów się, czy możesz dzielić na wiele układów FPGA ... spójrz na tę płytkę lub tę, która oferuje wiele układów FPGA na wygodnej platformie. Mają też płytę ze 100 urządzeniami Spartan-3 ...

(ps Byłem rozczarowany, gdy faceci oprogramowania zamknęli to drugie pytanie - myślę, że jest to co najmniej tak właściwe)

Edycja: ponownie edytuj - Myślę, że zaczynasz się tam dostać. Jeśli wszystkie wejścia multiplikatora są albo wyjściami FFT, albo współczynnikami „bez filtrowania”, zaczynasz widzieć rodzaj prawidłowości, którą musisz wykorzystać. Jedno wejście do każdego multiplikatora łączy się z wyjściem FFT, drugie wejście do współczynnika ROM (BlockRam zaimplementowany jako stała tablica).

Sekwencjonowanie różnych operacji FFT za pomocą tej samej jednostki FFT spowoduje automatyczne sekwencjonowanie wyników FFT za tym multiplikatorem. Sekwencjonowanie poprawnych współczynników do innych danych wejściowych MPY jest teraz „jedynie” kwestią zorganizowania prawidłowych adresów ROM we właściwym czasie: problem organizacyjny, a nie ogromny ból głowy MUX.

Jeśli chodzi o wydajność: myślę, że Dave Tweed był niepotrzebnie pesymistyczny - FFT biorąc n * log (n) operacji, ale możesz wybrać O (n) jednostki motylkowe i O (logN) lub O (logN) jednostki i O ( n) cykle lub inne kombinacje odpowiadające twoim celom w zakresie zasobów i prędkości. Jedna taka kombinacja może znacznie uprościć strukturę mnożenia po FFT niż inne ...


FFT zaimplementowany z pojedynczym motylkowym sprzętem będzie wymagał ukończenia cykli zegara NlogN; za 512 punktów, czyli 256 * 8 motyli lub 2048 zegarów. Oznacza to, że 41210 (lub 32768?) MAC wymagałoby tylko 8-10 mnożników sprzętowych, aby zrobić to w tym samym czasie.
Dave Tweed

Mam na myśli 16-20 mnożników.
Dave Tweed

Przepraszam, właśnie zdałem sobie sprawę, że dostałem to wstecz. Indywidualne FFT mają 64 punkty, więc implementacja pojedynczego motyla będzie wymagała 32 * 5 = 160 zegarów. MAC można następnie wykonać przy użyciu mnożników sprzętowych 200-250.
Dave Tweed

to mnie zaskakuje. W jaki sposób xilinx może zaprojektować rdzeń zdolny do wykonywania fftów 16k / 32k, które wymagają operacji wielokrotnego dodawania 400k (NlogN), a mimo to walczę z moim 41k? musi być sposób!
stanri

@Dave: Wierzę, że masz na myśli 160 mnożenia, a nie 160 cykli, na pewno? Nic nie jest tak z natury serializowane w FFT ...
Brian Drummond

2

Jeśli ten problem nie ma ścisłych ograniczeń w czasie rzeczywistym, i wygląda na to, że tak nie jest - po prostu chcesz, aby działał „szybciej”, wydaje się, że może być całkiem podatny na przyspieszenie na jednym lub kilku procesorach graficznych. Istnieje kilka bibliotek oprogramowania, które sprawiają, że jest to stosunkowo prosta propozycja, a byłoby to o rząd wielkości łatwiejsze niż przejście na niestandardowy sprzęt FPGA.

Aby rozpocząć, wystarczy Google dla „biblioteki obsługującej GPU” lub „biblioteki akcelerowanej przez GPU”.


Co ciekawe, wspomniałem o GPU klientowi, kiedy usłyszałem o tym projekcie, a on nie był zainteresowany.
stanri

@StaceyAnneRieck: Czy powiedział dlaczego?
Dave Tweed

Tak naprawdę nie powiedział dlaczego, po prostu to, że przyjrzał się temu, zanim użycie FPGA wydawało się, jak się wydaje, mniejszą pracą. Będę musiał to jeszcze raz przypomnieć.
stanri

@stanri: Nawet jeśli ostatecznie skończysz na implementacji FPGA, wydaje mi się, że procesor graficzny może być dobrym sposobem na „poskramianie” ogólnej architektury systemu. Czy masz (i czy możesz udostępnić?) Jakiś wykres wysokiego poziomu przepływu danych dla algorytmu i czy możesz nam powiedzieć, ile danych to dotyczy? Bez odpowiedzi na takie pytania bardzo trudno będzie udzielić ci czegoś innego niż bardzo ogólne porady.
Dave Tweed

To właściwie bardzo prosty algorytm, tylko skala sprawia, że ​​jest tak skomplikowany. Zasadniczo w następujący sposób: warunki początkowe -> 512 fft równolegle -> 32768 pomnóż operacje na wyjściu FFT -> dostosuj warunki początkowe -> spłucz i powtórz
stanri

1

Możliwe jest użycie specjalistycznego sprzętu lub układu FPGA (lub nawet CPLD), aby znacznie przyspieszyć niektóre rodzaje operacji matematycznych. Kluczową rzeczą, o której należy pamiętać przy projektowaniu sprzętu (obwodów lub układów FPGA) w celu przyspieszenia operacji matematycznych, jest ustalenie, jakie dane zamówienia będą musiały wchodzić i wychodzić z urządzenia. Urządzenie z wydajnym układem we / wy może oferować znacznie lepszą wydajność niż urządzenie z niewydajnym układem, nawet jeśli to drugie urządzenie wymaga znacznie więcej obwodów.

Nie próbowałem opracować projektu wspomagania sprzętowego dla FFT, ale przyjrzałem się pomocy sprzętowej dla dużych operacji zwielokrotnienia (które mogą być użyte do szyfrowania RSA). Wiele mikrokontrolerów, nawet tych ze specjalnym sprzętem do szybkiego zwielokrotniania, nie jest strasznie wydajne w takich operacjach, ponieważ wymagają dużego tasowania rejestrów. Sprzęt, który został zaprojektowany w celu zminimalizowania zamiany rejestrów, może osiągnąć znacznie lepszą wydajność przy operacjach zwielokrotniania z dużą precyzją, nawet jeśli sam sprzęt nie był tak zaawansowany. Na przykład sprzęt, który może wykonać multipleksowanie potokowe 16xN po dwa bity na raz (przesunięcie o dwa dolne bity multiplikatora i przesunięcie o dwa górne bity wyniku) może osiągnąć lepszą wydajność niż sprzęt, który może wykonać multiplikację 8x8 w jednym cyklu, nawet jeśli te pierwsze mogą wymagać mniejszej liczby obwodów (i ze względu na potokowanie mają krótszą ścieżkę danych krytycznych). Kluczem jest dowiedzieć się, jak będzie wyglądać „wewnętrzna pętla” niezbędnego kodu i dowiedzieć się, czy istnieją jakieś nieefektywności, które można łatwo wyeliminować.


Jakie operacje są szczególnie odpowiednie dla tej formy optymalizacji? Zredagowałem powyższe pytanie, aby bardziej szczegółowo opisać naturę operacji mnożenia. Projektowanie wspomagane sprzętowo brzmi naprawdę interesująco!
stanri

0

Jak mało problemu nam czas wykonania?

To naprawdę wygląda na sytuację, w której powinieneś naprawdę zaimplementować soft-MCU, FPGA ze zintegrowanym hard-MCU, a nawet oddzielne urządzenie MCU i serializować wszystkie swoje operacje.

Zakładając, że masz czas wykonania, wykonywanie FFT w oprogramowaniu będzie zarówno o wiele łatwiejsze do debugowania, jak i prawdopodobnie o wiele łatwiejsze do zaprojektowania.


1
Wykonywanie ciężkich obliczeń w miękkim rdzeniu procesora na FPGA jest głupie; jeśli zamierzasz wykonać obliczenia w architekturze przechowywanego programu (coś, co należy wziąć pod uwagę), ze względu na wysoką wydajność / twarde procesory dolara, w których nie płacisz kary za szybkość elastycznej logiki w porównaniu z porównywalnym fab- twarda logika generacji.
Chris Stratton,

@ChrisStratton - Dobra uwaga. Dodano dodatkową notatkę do tego efektu.
Connor Wolf,

1
Nawet wbudowane twarde procesory nie będą trzymały świecy na zwykłych tradycyjnych procesorach / procesorach graficznych do zadań programowych i będą znacznie droższe.
Chris Stratton,

@ChrisStratton - Myślałem, że najczęstszą zintegrowaną architekturą twardego procesora jest ARM lub POWER? W tym przypadku, to w zasadzie jest CPU towarem.
Connor Wolf,

1
Biorąc pod uwagę inne pytanie dotyczące FPGA, zbudowanie tablicy FPGA może być doświadczeniem edukacyjnym, które będzie kosztować nieco więcej niż szacowano. Myślę, że w tym momencie należałoby podać klientowi twarde dane dotyczące ceny / wydajności z próbnych uruchomień chmury obliczeniowej (które mogą ostatecznie stać się zakupionym sprzętem) w porównaniu z pewną wyższą ceną i znacznie większym ryzykiem związanym z FPGA .
Chris Stratton
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.