Jak FPGA może przewyższyć procesor?

55

Słyszę o ludziach korzystających z układów FPGA w celu poprawy wydajności systemów wykonujących takie czynności, jak wydobywanie bit-monet, handel elektroniczny i składanie białek.

W jaki sposób FPGA może konkurować z wydajnością procesora, gdy procesor zwykle pracuje co najmniej o rząd wielkości szybciej (pod względem częstotliwości zegara)?

David Gardner
źródło
13
FPGA robi wszystko na raz.
Ignacio Vazquez-Abrams

Odpowiedzi:

48

Procesory to urządzenia do sekwencyjnego przetwarzania. Dzielą algorytm na sekwencję operacji i wykonują je pojedynczo.

Układy FPGA są (lub mogą być skonfigurowane jako) równoległe urządzenia przetwarzające. Cały algorytm może być wykonywany w jednym takcie zegara lub, w najgorszym przypadku, znacznie mniej tyknięć zegara, niż wymaga sekwencyjnego procesora. Jednym z kosztów zwiększonej złożoności logicznej jest zazwyczaj dolna granica, przy której urządzenie może być taktowane.

Mając powyższe na uwadze, układy FPGA mogą przewyższyć procesory wykonujące określone zadania, ponieważ mogą wykonywać to samo zadanie przy mniejszej liczbie taktów zegara, choć przy niższej ogólnej częstotliwości taktowania. Zyski, które można osiągnąć, w dużym stopniu zależą od algorytmu, ale przynajmniej rząd wielkości nie jest nietypowy dla czegoś takiego jak FFT.

Ponadto, ponieważ możesz zbudować wiele równoległych jednostek wykonawczych w układzie FPGA, jeśli masz dużą ilość danych, które chcesz przekazać przez ten sam algorytm, możesz rozdzielić dane między równoległe jednostki wykonawcze i uzyskać dalsze rzędy wielkości o wyższej przepustowości niż można to osiągnąć nawet przy użyciu procesora wielordzeniowego.

Cena, którą płacisz za korzyści, to zużycie energii i ceny $$$.

markt
źródło
2
+1; FPGA nie są jednak tak dynamiczne jak procesory, dlatego procesory są zwykle lepiej dostosowane do komputerów PC
Nick Williams
17
„Ceną, którą płacisz za korzyści, jest zużycie energii i ceny $$$”. - Jest to często prawdą, ale możesz pokonać wysokiej klasy zaawansowaną maszynę Intel Xeon o wartości 1000 USD za pomocą niskiej klasy Xilinx Spartan-6 za 50 USD dla wielu algorytmów. Ale zwykle zajmuje to dużo czasu inżynierskiego i może skończyć się bardzo niestandardowym projektem, który działa tylko dla jednej aplikacji i jest trudny do zmiany. Zatem kompromis to nie tylko siła i pieniądze, ale czas opracowania algorytmu, możliwość ponownego użycia i elastyczność. (Chociaż możesz kłócić się o czas == pieniądze.)
wjl
markt, jeśli chodzi o twoje ostatnie zdanie, czy układy FPGA nie są znacznie niższe niż procesory? Istnieje szeroka gama urządzeń zarówno dla procesorów, jak i układów FPGA, ale jeśli spojrzymy na te, które są używane do takich celów, jak wydobywanie bit-monet, to czy procesory używane do tych zadań nie są znacznie bardziej energochłonne niż układy FPGA, które byłyby używany?
David Gardner
4
@ David: Mówiąc o wydobyciu bitcoinów, odpowiednią miarą jest liczba skrótów na wat. Markt mówi o ogólnym zużyciu energii. Oznacza to, że dany FPGA może zużywać 3 razy więcej mocy niż typowy procesor, ale może być znacznie ponad 3 razy szybszy przy wydobyciu bitcoinów; więc dla Bitcoin to wygrana.
Billy ONeal
2
@Billy: liczba skrótów na wat · sekundę, a nie na wat.
Paŭlo Ebermann
34

Markt ma to w większości rację, ale wrzucę tutaj moje 2 centy:

Wyobraź sobie, że powiedziałem ci, że chcę napisać program, który odwrócił kolejność bitów w 32-bitowej liczbie całkowitej. Coś takiego:

int reverseBits(int input) {
    output = 0;
    for(int i = 0;i < 32;i++) {
        // Check if the lowest bit is set
        if(input & 1 != 0) {
            output = output | 1; // set the lowest bit to match in the output!
        }

        input = input >> 1;
        output = output << 1;
    }
    return output;
}

Teraz moja implementacja nie jest elegancka, ale jestem pewien, że zgadzasz się z tym, że będzie to wymagało pewnej liczby operacji i prawdopodobnie pewnego rodzaju pętli. Oznacza to, że w procesorze spędziłeś dużo więcej niż 1 cykl na wdrożenie tej operacji.

W FPGA możesz to po prostu połączyć jako parę zatrzasków. Dostajesz swoje dane do jakiegoś rejestru, a następnie łączysz je z innym rejestrem w odwrotnej kolejności bitów. Oznacza to, że operacja zakończy się w jednym cyklu zegara w FPGA. Tak więc w jednym cyklu FPGS zakończyła operację, która zajęła procesorowi ogólnego przeznaczenia wiele tysięcy cykli! Ponadto można połączyć prawdopodobnie kilkaset tych rejestrów równolegle. Jeśli więc możesz przejść do kilkuset cyfr na FPGA, w jednym cyklu zakończy te tysiące operacji setki razy, wszystko w 1 cyklu zegara FPGA.

Procesor ogólnego przeznaczenia może zrobić wiele rzeczy, ale jako ograniczenie przygotowaliśmy uogólnione i proste instrukcje, które muszą koniecznie zostać rozszerzone na listy prostych instrukcji do wykonania niektórych zadań. Mogę więc sprawić, aby procesor ogólnego przeznaczenia miał instrukcję typu „odwrotna kolejność bitów dla rejestru 32-bitowego” i dałbym procesorowi taką samą zdolność jak FPGA, którą właśnie zbudowaliśmy, ale istnieje nieskończona liczba takich możliwych przydatnych instrukcji, więc wstaw tylko te, które gwarantują koszty popularnych procesorów.

Układy FPGA, CPLD i ASIC zapewniają dostęp do surowego sprzętu, co pozwala zdefiniować szalone operacje, takie jak „odszyfruj bajty zaszyfrowane AES256 kluczem” lub „zdekoduj ramkę wideo h.264”. Opóźnienia te mają więcej niż jeden cykl zegara w układzie FPGA, ale można je wdrożyć w znacznie bardziej efektywny sposób niż zapisywanie operacji w milionach wierszy kodu asemblera ogólnego przeznaczenia. Ma to również tę zaletę, że stałoprzecinkowy układ FPGA / ASIC dla wielu z tych operacji jest bardziej energooszczędny, ponieważ nie muszą wykonywać tak dużej dodatkowej pracy!

Równoległość to druga część, na którą wskazał Markt, i chociaż jest to również ważne, najważniejsze jest to, że FPGA równolegle coś, co było już drogie w CPU pod względem cykli potrzebnych do wykonania operacji. Kiedy zaczniesz mówić: „Mogę wykonać w 10 cyklach FPGA zadanie, które zajmuje mój procesor 100 000 cykli, i mogę wykonać to zadanie równolegle 4 elementy jednocześnie”, możesz łatwo zrozumieć, dlaczego FPGA może być cholernie dużo szybszy niż procesor!

Dlaczego więc nie używamy układów FPGA, CPLD i ASIC do wszystkiego? Ponieważ ogólnie jest to cały układ, który wykonuje tylko jedną operację. Oznacza to, że chociaż można uzyskać proces szybszego uruchamiania wielu rzędów wielkości w układzie FPGA / ASIC, nie można go zmienić później, gdy ta operacja nie jest już przydatna. Powodem, dla którego nie można (ogólnie) zmienić układu FPGA, gdy jest on w obwodzie, jest to, że okablowanie interfejsu jest stałe, i zwykle obwód nie zawiera elementów, które pozwoliłyby na przeprogramowanie układu FPGA w bardziej przydatną konfigurację. Niektórzy badacze próbują zbudować hybrydowe moduły FPGA-CPU, w których znajduje się sekcja procesora, która może być ponownie połączona / przeprogramowana jak FPGA, umożliwiając „załadowanie” efektywnej sekcji procesora,

Kit Scuzz
źródło
2
Na przykład odwracanie bitów (i wszystkich innych zadań zamiany / selekcji bitów) tak naprawdę nie zajmuje 1 cyklu zegarowego, zajmuje 0. W twoim przykładzie potrzeba 1 cyklu zegarowego do przechowywania danych w zatrzasku , który nie jest ta sama operacja. Trwa 1 cykl zegara, niezależnie od tego, czy odwrócisz bity, czy nie. Operacja odwracania bitów wynosi 0 cykli zegara; bez kosztów ogólnych, po prostu inny routing. Różnica polega nie tylko na semantyce, zwłaszcza gdy zaczynasz dodawać rzeczy. Na przykład, ile czasu zajmuje przesunięcie 32-bitowego słowa w dół o 3 bity, a następnie zamiana każdego innego skrawka, a następnie odwrócenie go?
wjl
1
„hybrydowy moduł FPGA-CPU” - są one dostępne na rynku od dłuższego czasu (patrz xilinx.com/products/silicon-devices/soc/zynq-7000/index.htm dla nowoczesnego udanego), ale nawet bez specjalne wsparcie, łączące oprogramowanie i HDL, jest zwykle wykonywane przez implementację miękkiego procesora wewnątrz FPGA na tkaninie.
wjl
@wjl Masz rację, że technicznie nie potrzeba cykli, aby wykonać samą operację. Argumentowałbym, że twój przykład jest tylko semantycznie inny, głównie dlatego, że wykonanie tych trzech operacji logicznie przekłada się na stały wzorzec bitowy (tzn. Zaczynam od b1b2b3b4, a kończę na b3b1b4b2). To był mój punkt widzenia w całej odpowiedzi. Próbowałem zwrócić uwagę, że opisanie operacji jako serii kroków jest często konieczne tylko wtedy, gdy masz ustalony zestaw instrukcji / ustawienie bramki.
Kit Scuzz
@wjl: Sposób, w jaki David zadał pytanie, zdaje się mówić, że „procesor” jest odpowiednikiem wysoce taktowanego, potokowego i zoptymalizowanego procesora Intel lub AMD x86 / x86_64. Istnieje wiele miękkich „procesorów”, ale ja żaden z tych zaprojektowanych do siedzenia w FPGA nie może być taktowany jak i7, ani nie jest tak zoptymalizowany czy zdolny. Jeśli chodzi o hybrydy, bardziej miałem na myśli coś takiego: newsroom.intel.com/docs/DOC-1512, który najwyraźniej istnieje
Kit Scuzz
1
Zynq naprawdę nie jest tak źle procesora (ARM Cortex-A9 - to samo, co działa na tabletach itp.), ale zgadzam się, że byłoby o wiele bardziej niesamowite mieć zintegrowany układ FPGA z wysoką prędkością x86_64. =)
wjl
25

Wszystkie inne popularne odpowiedzi przedstawione tutaj mówią o dosłownych różnicach między układami FPGA i procesorami. Wskazują na równoległy charakter FPGA w porównaniu z sekwencyjnym charakterem procesora lub podają przykłady, dlaczego niektóre algorytmy mogą działać dobrze na FPGA. Wszystkie są dobre i prawdziwe, ale sugerowałbym jednak, że istnieje bardziej fundamentalna różnica między procesorami a FPGA.

Jaki jest wspólny mianownik między układem FPGA a procesorem? Oba są zbudowane na bazie krzemu. A w niektórych przypadkach dosłownie te same procesy krzemowe.

Podstawową różnicą są abstrakcje, które nakładamy na ten krzem. Jeden człowiek nie jest w stanie zrozumieć pełnego szczegółu pojedynczego nowoczesnego projektu procesora, od krzemu po zapakowany układ scalony. Dlatego w ramach procesu inżynieryjnego dzielimy ten złożony problem na mniejsze, możliwe do rozwiązania problemy, które ludzie mogą owijać wokół głowy.

Zastanów się, czego potrzeba, aby zmienić ten krzem w działający procesor. Oto nieco uproszczony widok warstw abstrakcji niezbędnych do tego celu:

  1. Najpierw mamy inżynierów, którzy wiedzą, jak tworzyć tranzystory z krzemu. Wiedzą, jak zaprojektować maleńkie tranzystory, które pobierają moc i przełączają się z częstotliwością 10 lub nawet 100 gigaherców, i wiedzą, jak zaprojektować mocne tranzystory, które mogą sterować sygnałami o mocy wystarczającej do wysłania ich z układu scalonego i przez płytkę drukowaną do innego układu.

  2. Następnie mamy projektantów logiki cyfrowej, którzy wiedzą, jak połączyć te tranzystory w bibliotekach z setkami różnych komórek logicznych. Bramy logiczne, klapki, multipleksery i dodatki, żeby wymienić tylko kilka. Wszystko w różnych konfiguracjach.

  3. Następnie mamy różne grupy inżynierów, którzy wiedzą, jak połączyć te bloki cyfrowe (a czasem analogowe), aby utworzyć bloki funkcjonalne wyższego poziomu, takie jak szybkie transceiver, kontrolery pamięci, predyktory gałęzi, ALU itp.

  4. Następnie mamy projektantów procesorów, którzy opracowują wysokiej klasy projekty procesorów, łącząc te jednostki funkcjonalne w kompletny system.

I to nie koniec. W tym momencie mamy działający procesor, który uruchamia kod asemblera, ale nie jest to język, który większość programistów pisze obecnie.

  1. Możemy mieć kompilator C do kompilacji kodu asemblera (prawdopodobnie poprzez jakąś reprezentację pośrednią)
  2. Możemy dodać kolejną abstrakcję na C, aby uzyskać język obiektowy
  3. Możemy nawet napisać maszynę wirtualną na C lub C ++, abyśmy mogli interpretować takie rzeczy, jak kod bajtowy Java

Od tego momentu warstwy abstrakcji mogą być kontynuowane. Ważną kwestią jest to, że te warstwy abstrakcji łączą się, tworząc system oparty na procesorze, który skaluje się masowo i kosztuje niewielką część niestandardowej konstrukcji krzemowej.

JEDNAK ważne jest, aby tutaj zwrócić uwagę, że każda abstrakcja sama w sobie wiąże się z pewnymi kosztami. Projektant tranzystorów nie buduje idealnego tranzystora dla każdego przypadku użycia. Buduje rozsądną bibliotekę, dlatego czasami używany jest tranzystor, który zużywa nieco więcej energii lub trochę więcej krzemu, niż jest to naprawdę potrzebne do danego zadania. Podobnie projektanci logiki nie budują wszystkich możliwych komórek logicznych. Mogą zbudować bramę NAND z 4 wejściami i bramę NAND z 8 wejściami, ale co się stanie, gdy inny inżynier potrzebuje NAND z 6 wejściami? Używa 8-wejściowej bramki NAND i wiąże 2 nieużywane wejścia, co powoduje utratę zasobów krzemu i utratę mocy. I tak idzie w górę łańcucha abstrakcji. Każda warstwa daje nam sposób na radzenie sobie ze złożonością,

Teraz porównaj te abstrakcje z tym, co jest potrzebne do FPGA. Zasadniczo abstrakcje FPGA zatrzymują się na drugim miejscu na powyższej liście. FPGA pozwala programistom pracować na cyfrowej warstwie logicznej. Jest to nieco bardziej skomplikowane, ponieważ procesory są „zakodowane na stałe” na tej warstwie, a układy FPGA muszą zostać skonfigurowane w czasie wykonywania (co, BTW, właśnie dlatego procesory zwykle pracują na znacznie wyższych częstotliwościach), ale podstawową ważną prawdą jest to, że są one daleko kilka abstrakcji dla układów FPGA niż dla procesorów.

Więc Dlaczego FPGA szybciej niż CPU? Zasadniczo dzieje się tak dlatego, że FPGA używa znacznie mniej abstrakcji niż procesor, co oznacza, że ​​projektant pracuje bliżej krzemu. Nie pokrywa kosztów wszystkich warstw abstrakcji wymaganych dla procesorów. Koduje na niższym poziomie i musi ciężko pracować, aby osiągnąć określony poziom funkcjonalności, ale nagrodą jest wyższa wydajność.

Ale oczywiście jest też wadą mniej abstrakcji. Wszystkie te abstrakty procesora istnieją z dobrego powodu. Dają nam znacznie prostszy paradygmat kodowania, co oznacza, że ​​więcej osób może z łatwością się dla nich rozwijać. To z kolei oznacza, że ​​istnieje o wiele więcej konstrukcji procesorów, dzięki czemu mamy ogromne korzyści w stosunku do ceny / skali / czasu wprowadzenia na rynek procesorów.

Więc masz to. Układy FPGA mają mniej abstrakcji, dzięki czemu mogą być szybsze i bardziej energooszczędne, ale trudne do zaprogramowania. Procesory mają wiele abstrakcji, dzięki czemu można je łatwo opracowywać, skalować i tanio. Ale rezygnują z szybkości i siły w handlu dla tych korzyści.

David Gardner
źródło
Ponadto układy FPGA są zaprojektowane przy użyciu prostych powtarzalnych bloków, które mają wykonywać proste zadania logiczne. Są one dostosowane do określonych rodzajów zadań. Procesory, OTOH, mają wiele złożonych części funkcjonalnych, z których wszystkie wykonują różne czynności. Można by pomyśleć, że procesor to grupa wielu różnych urządzeń podobnych do FPGA (w końcu to wszystko tylko krzem, elektronika i matematyka). Więc nie chodzi tylko o abstrakcje, chodzi o złożoność. Procesory to złożone urządzenia złożone z wielu różnych rodzajów urządzeń elektrycznych, podczas gdy układ FPGA składa się z kilku. Procesor to strzelba, a FPGA to karabin.
AbstractDissonance
21

Podczas gdy wszystkie pozostałe odpowiedzi są poprawne, żadna z nich nie odnosi się jeszcze do przykładu wydobycia bitcoinów z twojego pytania, co jest rzeczywiście dobrym przykładem. Wydobywanie bitcoinów polega na wielokrotnym obliczaniu kryptograficznej funkcji skrótu SHA-256 wyniku innego obliczenia SHA-256 danych, w których zmienia się tylko jedna 32-bitowa liczba całkowita, dopóki wynikowy skrót nie będzie miał pewnych właściwości. Każdy SHA-256 składa się z 64 powtórzeń tego samego algorytmu, obejmujących 32-bitowe dodania, przesunięcia bitów i kilka innych operacji zmieniania bitów.

Jeśli zaprogramujesz tę pętlę na 32-bitowym (lub więcej) procesorze, zobaczysz, że jej zestaw instrukcji jest bardzo odpowiedni dla zadania --- SHA-256 został zaprojektowany do wydajnego działania na procesorach. Nadal będziesz używać tylko 2% powierzchni krzemowej współczesnego procesora, z funkcjami intensywnie zajmującymi obszar, takimi jak buforowanie, mnożenie, dzielenie, operacje zmiennoprzecinkowe, rozgałęzianie i przewidywanie brach itp., Które nie są w ogóle używane lub nie są w stanie zapewnić znaczącej zwiększenie wydajności dla tego konkretnego zadania.

W konfigurowalnym sprzęcie, takim jak FPGA, po prostu implementujesz tylko 2% i optymalizujesz dalej, zapominając o wykonywaniu kodu, a raczej projektując bramki do bezpośredniego obliczania każdej z tych często powtarzanych podfunkcji. Przetwarzane w taki sposób, że każdy z nich przekazuje wynik do następnego każdego cyklu zegarowego i powtarzane 128 razy (oraz z pewną specjalną dodatkową logiką, w której każdy SHA-256 zaczyna się i kończy), w końcu dostajesz wynik w każdym cyklu zegarowym (może 100 milionów skrótów na sekundę w reklamowanych układach FPGA obsługujących 300 MHz na prostszej logice niż ta), podczas gdy na nowoczesnym procesorze można spodziewać się jednego wyniku na kilka tysięcy cykli zegara na rdzeń, powiedzmy 10 milionów skrótów na sekundę w układzie wielordzeniowym Procesor -GHz.

Jeśli ten konkretny przykład Cię interesuje, możesz rzucić okiem na moją pokrewną odpowiedź na temat wewnętrznych elementów górników ASIC na bitcoin.stackexchange, ponieważ wielu górników FPGA działa w ten sam sposób, używając konfigurowalnego, a nie niestandardowego sprzętu. Dla uproszczenia: istnieją inne możliwości, takie jak ograniczenie lub unikanie potokowania, które opisałem na korzyść bardziej trywialnej równoległości przy użyciu wielu niezależnych skrótów SHA-256. W zależności od ograniczeń podanych przez elementy wewnętrzne FPGA i jego całkowity rozmiar, może to nawet dać lepszą wydajność, chociaż byłoby mniej wydajne pod względem liczby bramek i narzutu routingu, gdybyś miał doskonałą swobodę w projektowaniu całego układu, a nie tylko konfiguracji FPGA .

piramidy
źródło
3
To bardzo dobra uwaga na temat wykorzystania krzemu.
markt
Ale może (niezamierzenie!) Wprowadzające w błąd, biorąc pod uwagę, że FPGA składa się z nieco skomplikowanych komórek z wieloma fizycznymi bramkami, z których typowa aplikacja ponownie wykorzystuje tylko ułamek, pozwalając producentom reklamować równoważne liczby bramek, próbując powiedzieć, ile to wszystko tego może być warte w „typowej” aplikacji ...
piramidy
3

Powyższe odpowiedzi, choć poprawne, nie rozumieją, dlaczego FPGA (i niestandardowe ASIC) są szczególnie dobre do obliczeń bitcoin.

Prawdziwą zaletą jest to, że duża część obliczeń SHA-256 to operacje logiczne (na przykład przesunięcia bitów), które można wykonać w okablowaniu. Wykonane w ten sposób wymagają 0 cykli zegara.

Kolejną ważną zaletą jest to, że układy FPGA są znacznie bardziej energooszczędne (tj. MIPS na wat) niż procesory, więc ilość energii potrzebnej do obliczeń jest znacznie mniejsza. Jest to ważne, ponieważ koszt wydobycia bitcoinów zależy od ilości energii elektrycznej zużytej do ich wytworzenia.

Układy ASIC są bardziej energooszczędne niż układy FPGA, dzięki czemu mogą wykonywać ten sam kod znacznie taniej. Możesz także wcisnąć więcej jednostek wykonawczych na pokładzie, aby przyspieszyć je. Wadą jest to, że koszt wykonania niestandardowego układu ASIC jest bardzo wysoki, więc trzeba by sprzedać sporo układów, aby pokryć koszty produkcji.

Procesory graficzne są również używane do robienia bitcoinów, ale ponieważ są one znacznie mniej energooszczędne, tracą grunt pod FPGA i niestandardowymi układami ASIC.

0xc000005
źródło
Jeśli spojrzysz na algorytm haszujący Monero, czyli kryptonight, zobaczysz, że implementacja FPGA jest prawie niemożliwa z powodu dużej ilości pamięci wymaganej do losowego dostępu (2 MB). W tym przypadku zaletą jest procesor.
lucas92,