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)?
Odpowiedzi:
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 $$$.
źródło
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:
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,
źródło
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:
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.
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.
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.
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.
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.
źródło
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 .
źródło
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.
źródło